一、解决大坑
在项目进展(九)-完善ADS1285代码这边博客中,看似解决了问题,可以去读数据,但是其实是给自己挖大坑,这边博客就是来填坑的。
首先呢,上篇博客说的是用0x12指令来读取数据,但是仔细再看数据手册会发现,使用指令读取数据是在特定条件下的:“RDATA命令用于在同一转换周期内重新读取数据或读取被读寄存器命令打断 的数据。”真的是被自己坑到了。
接下来是第二个大坑,当时只是看到注意到了DRDY引脚了,却忘了SYNC,RESET,PWDN这仨哥们,忘记在cubeMX里面初始化他们的电平了,我直接哭死。这三个引脚初始化时都需要需要全部拉成高电平。
HAL_GPIO_WritePin(GPIOB, ADS_X_PWDN_Pin|ADS_X_RESET_Pin|ADS_X_SYNC_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = ADS_X_PWDN_Pin|ADS_X_RESET_Pin|ADS_X_SYNC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
配置完上面三个引脚之后便可以使用直接读取,根据DRDY的变化来读取数据了。下面是DRDY的波形图:
频率为1KHz,正好对应配置的寄存器中1000SPS(即1s采样1000次):
data[3] = (HIGHPOWER<<6)|(SPS1000<<3)|(LINEAR_PHS<<2)|FIR;
DRDY正常工作,接下来便是按照数据手册的时序图来编写代码(DRDY拉低后,我们要将CS拉低,之后连续读取四个字节,即最后的32位ADC采集数据):
while(DRDY); // 等待DRDY拉低
ADC_X_CS_LOW; // 拉低CS引脚
for(i=0;i<4;i++)
{
HAL_SPI_Receive(&hspi2,(uint8_t *)&Data[i],1,10);// 读取数据
}
readDataFinal = (Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|(Data[3]);
ADC_X_CS_HIGH; // 拉高CS引脚
下面是仿真的视频:
数据是读取回来了,但是总是感觉跟实际数据对不上,后续还得继续看数据手册,今天先到这了。
二、往期回顾
项目进展(一)-晶振正常输出、焊接驱动芯片、查找芯片手册并学习
项目进展(二)-配置MCT8316ZR芯片,主要学习如何根据数据手册配置外设等
项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误
项目进展(四)-双电机均可驱动,配置模拟SPI,调平仪功能初步实现!
项目进展(五)-修复PCB电路板,学习32位ADC芯片ADS1285
项目进展(六)-继续学习32位ADC芯片ADS1285
项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分
项目进展(八)-编写代码,驱动ADS1285
项目进展(九)-完善ADS1285代码