使用407的SPI1读取AD7606芯片8通道的16位ADC数据,出现一个奇怪现象:
1. keil首次进入debug时,全速运行,读取的各通道数据如下图1
2. 然后点击keil中的复位按钮重新进入调试状态
3.SPI读取到的数据变为下图3
重点是最后一图的数据才是正常的,再往后多次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;
|