糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 基于STM32HAL库ADS1256调试笔记

基于STM32HAL库ADS1256调试笔记

时间:2019-11-22 14:14:03

相关推荐

基于STM32HAL库ADS1256调试笔记

目录

接线方式

初始化配置

读取芯片ID

配置寄存器

读取时序

接线方式

采用四线SPI,DRDY配置为输入,RESET引脚用于复位,不使用SYNC引脚而直接发送SYNC命令。如果接上单片机则默认拉高,低电平有效。AD1256的采样率由DRDY引脚指示,实测当配置为1khz采样率时,DRDY引脚每1ms发送一次脉冲信号;当配置为2khz采样率时,DRDY引脚每500us发送一次脉冲信号。

初始化配置

读取芯片ID

这是一个判断时序是否正确的手段,如果芯片ID没读对那么很可能写了一堆最后代码也是run不起来的

由数据手册STATUS寄存器的前四位为芯片ID号

验证写数据和读数据的时序是否正确、芯片是否正常,时序图如下。

uint8_t ADS1256_ReadReg(uint8_t _RegID){uint8_t read;CS_RESET;/* SPI片选 = 0 */ADS1256_WriteByte(ADS1256_CMD_RREG | _RegID);/* 写寄存器的命令, 并发送寄存器地址 */ADS1256_WriteByte(0x00);/* 寄存器个数 - 1, 此处读1个寄存器 */delay_us(10);/* 必须延迟才能读取芯片返回数据 */read = ADS1256_ReadByte();/* 读寄存器值 */CS_SET;/* SPI片选 = 1 */return read;}uint8_t ADS1256_ReadChipID(void){uint8_t id;ADS1256_WaitDRDY();id = ADS1256_ReadReg(ADS1256_STATUS);return (id >> 4);}

配置寄存器

int ADS1256_Init(void) {CS_SET;delay_us(10);SCLK_RESET;delay_us(10);DIN_RESET;delay_us(10);RESET_RESET;delay_us(10);RESET_SET;delay_us(10);CS_RESET;delay_us(1);ADS1256_WaitDRDY();ADS1256_SendCommand(ADS1256_CMD_SELFCAL);//自动校验ADS1256_WriteToRegister(ADS1256_STATUS, 0x06);//开启自动校验ADS1256_WriteToRegister(ADS1256_ADCON, 0x00);//增益为1ADS1256_WriteToRegister(ADS1256_DRATE, ADS1256_DRATE_30SPS);ADS1256_WriteToRegister(ADS1256_MUX,ADS1256_MUXP_AIN0|ADS1256_MUXN_AINCOM);//采集通道一ADS1256_SendCommand(ADS1256_CMD_SYNC); //同步校准delay_us(5);ADS1256_WriteByte(ADS1256_CMD_WAKEUP); //唤醒delay_us(25);CS_SET;SCLK_RESET;DIN_RESET;return 0;}

读取时序

在初始化程序中选择采样通道,此后不转换通道。当进行通道切换并重新对器件进行同步(synchronize)和唤醒(wakeup)后,转换速度会变慢。具体来讲,实际采样率和你配置的通过率之间的对应关系如数据手册中的下表所示。

读取数据的时序图如下:

代码实现如下:

static int32_t ADS1256_ReadData(void){uint32_t read = 0;ADS1256_SendCommand(ADS1256_CMD_RDATA);/* 读数据的命令 */delay_us(20);/* 必须延迟才能读取芯片返回数据 *//* 读采样结果,3个字节,高字节在前 */read = (uint32_t)ADS1256_ReadByte() << 16;read += (uint32_t)(ADS1256_ReadByte() << 8);read += ADS1256_ReadByte();/* 负数进行扩展。24位有符号数扩展为32位有符号数 */if (read & 0x800000){read += 0xFF000000;}return (int32_t)read;}uint32_t ADS1256_GetAdc(void) {uint32_t Data = 0;CS_RESET;Data = ADS1256_ReadData();delay_us(20);CS_SET;return Data;}

软件排错经验:

①用LED灯判断有没有进中断;

②中断里不能调用printf函数;

③注意HAL_Delay和中断回调函数的优先级,一定要修改为相同的优先级;

④调试SPI读取数据时可以用示波器观察某些特殊引脚的信号;

⑤当读出数据不正确时考虑时序,SCL的高低电平是否有最小值要求,ns级使用nop,尽量减少无意义的延时;

⑥主频会影响读取数据的速率,调试AD7606时在spi读取无延时情况下,42Mhz频率正常而168Mhz频率不正常;⑦注意有一些特殊引脚,如RST、SYNC等是高电平有效还是低电平有效!在用CubeMX新建工程的时候如果配错电平就会导致调试的时候浪费很多时间排错。当多个设备都使用SPI通讯时最好默认把CS拉高

另外记录一段很好用的Systick定时器延时代码,抄的安富莱,大佬太强了,用了这个再也不会卡进HAL_GET_TICK了

void delay_us(uint32_t n){uint32_t ticks;uint32_t told;uint32_t tnow;uint32_t tcnt = 0;uint32_t reload;reload = SysTick->LOAD;ticks = n * (SystemCoreClock / 1000000); /* 需要的节拍数 */ tcnt = 0;told = SysTick->VAL; /* 刚进入时的计数器值 */while (1){tnow = SysTick->VAL; if (tnow != told){ /* SYSTICK是一个递减的计数器 */ if (tnow < told){tcnt += told - tnow; }/* 重新装载递减 */else{tcnt += reload - tnow + told; } told = tnow;/* 时间超过/等于要延迟的时间,则退出 */if (tcnt >= ticks){break;}} }}

如果觉得《基于STM32HAL库ADS1256调试笔记》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。