硬汉嵌入式论坛

 找回密码
 立即注册
查看: 725|回复: 2
收起左侧

[有问必答] SPI 读取AD7606 keil 仿真出现奇怪问题,求解

[复制链接]

10

主题

43

回帖

73

积分

初级会员

积分
73
发表于 2023-1-12 18:51:17 | 显示全部楼层 |阅读模式

使用407的SPI1读取AD7606芯片8通道的16位ADC数据,出现一个奇怪现象:
1. keil首次进入debug时,全速运行,读取的各通道数据如下图1

image.png
2. 然后点击keil中的复位按钮重新进入调试状态
image.png

3.SPI读取到的数据变为下图3
image.png



重点是最后一图的数据才是正常的,再往后多次RST,数据不再变化。


4. 不使用keil仿真,直接硬件运行,串口打印出的数据跟keil首次仿真的数据一样是错误的。
5. 看仿真数据,0-3通道数据是正常的,4-7通道好像又读取了0-3通道的值,正常的值应该是第3图4-7通道的数据。
6. 求解,这个问题原因是什么,硬件初始化有问题?为什么keil首次仿真跟再次复位后的数据不一样?
附SPI初始化、读写及AD7606部分代码

[C] 纯文本查看 复制代码
void MX_SPI1_Init(void)
{

/* USER CODE BEGIN SPI1_Init 0 */

/* USER CODE END SPI1_Init 0 */

/* USER CODE BEGIN SPI1_Init 1 */

/* USER CODE END SPI1_Init 1 */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */

//__HAL_SPI_DISABLE(&hspi1);
__HAL_SPI_ENABLE(&hspi1);

/* USER CODE END SPI1_Init 2 */

}

/*
*********************************************************************************************************
* 函 数 名: SPI1_Write2Bytes
* 功能说明: 通过SPI1接口发送2字节数据
* 形 参: TxData:要发送的数据
* 返 回 值: SPI接口返回值
*********************************************************************************************************
*/
u16 SPI1_Write2Bytes (u16 TxData)
{

u16 rxdata;
hspi1.Instance->DR = TxData;
/* 等待发送完成 */
while (!( hspi1.Instance->SR & TXE))
hspi1.Instance->DR;

/* 等待接收完成 */
while (hspi1.Instance->SR & (BSY | RXNE))
rxdata = hspi1.Instance->DR;
return rxdata;

}

/*
*********************************************************************************************************
* 函 数 名: SPI1_Read2Bytes
* 功能说明: 通过SPI1接口接收2字节数据
* 形 参: 无
* 返 回 值: 接收数据值
*********************************************************************************************************
*/
u16 SPI1_Read2Bytes (void)
{

u16 rxdata;

hspi1.Instance->DR = 0x0000;
// /* 等待发送完成 */
while (!(hspi1.Instance->SR & TXE));
hspi1.Instance->DR;

/* 等待接收完成 */
while (hspi1.Instance->SR & (BSY | RXNE))
{
rxdata = hspi1.Instance->DR;
}
return rxdata;

}

/*
*********************************************************************************************************
* 函 数 名: AD7606_Init
* 功能说明: 初始化AD7606 SPI口线
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void AD7606_Init(void)
{
Threshold_init();
//crc16_populate_msb(ad7606_crc16, 0x755b);
AD7606_GPIO_Init();

MX_SPI1_Init();
AD7606_Reg_Config(); //寄存器配置
AD7606_Reset(); /* 硬件复位复AD7606 */
AD_CONVST_HIGH(); /* CONVST脚设置为高电平 */
AD7606_StartRecord();

}

/*
*********************************************************************************************************
* 函 数 名: AD7606_ISR
* 功能说明: 定时采集中断服务程序
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/

void AD7606_ISR(void) /* 此函数代码按照时序编写 */
{
u8 i,j;



/* BUSY = 1 时.ad7606处于转换期间时读出,不影响采样率 */

ADC_CS = 0;
for (i = 0; i < AD_CH_NUM; i++)
{
ADC_Value[i] =
SPI1_Read2Bytes(); /* 读16位数据 */
}
ADC_CS = 1;

image.png
image.png
image.png
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2023-1-13 15:11:31 | 显示全部楼层
贴出代码看不出细节,建议排查下7606初始化配置部分,尤其注意时延,其次是触发转换和读取转换数据的顺序关系
回复

使用道具 举报

10

主题

43

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2023-1-13 18:04:56 | 显示全部楼层
cumtjdxcz 发表于 2023-1-13 15:11
贴出代码看不出细节,建议排查下7606初始化配置部分,尤其注意时延,其次是触发转换和读取转换数据的顺序关 ...

非常感谢,调试半天发现确实是AD初始化有问题,硬件复位没成功导致寄存器配置失败,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 04:37 , Processed in 0.173573 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表