刚拿到的板子,初始化时通过SPI读取 ADS1291的寄存器的值,用示波器看,命令成功发送出去了,但是DOUT一直没有数据出来。
会是什么原因呢?
Jason Shen:
是自己做的板子吗?新打的板子先检查下硬件是否有问题,主要是检查引脚的静态电压,然后再确认通信是否正常。
shaokai Lin:
回复 Jason Shen:
Jason Shen
是自己做的板子,做了几块,都是一样的现象。
硬件上没有发现什么问题,引脚START给高电平后,DRDY引脚能够输出脉冲信号。
然而就是SPI通信时,读取ADS1291寄存器值,DOUT从来都没有数据出来。
shaokai Lin:
回复 shaokai Lin:
shaokai Lin:
回复 shaokai Lin:
如上图, 上电后,我尝试读取寄存器ID的数值,于是发送0X20,0X00,然后读取数据。但DOUT并没有数据出来。
读取其他寄存器也是一样的现象。
Yiping Chen4:
回复 shaokai Lin:
我用的是1281也遇到了和你类似的问题调了好久不知道问题出在哪
shaokai Lin:
回复 Yiping Chen4:
我按照手册,上电后先给他复位信号,让它复位。
之后我用IO口启动ADS1291进行采样,DRDY引脚会定时输出信号,然后触发MCU中断读取数据,是能够读出数据的,并且格式与手册一样(数据对不对暂没有去分析,但前面有固定数值的24bit的状态码)!
然而请求写、读寄存器等命令,DOUT都是一点反应都没有。
即便我在上电后发送SDATAC命令,再请求读取寄存器,DOUT也同样没有反应。
更加奇怪的一个现象是,一旦复位引脚下拉后,过几十us,DIN居然被ADS1291自动拉高了(这里绝对不是被MCU拉高的,因为我跑到这一步后就强制while(1)了)。。。
Yiping Chen4:
回复 shaokai Lin:
我也是按着手册来的 上电复位后 drdy会等间隔输出 dout也可以读到数据 但是我读写寄存器 dout就没有数据了
shaokai Lin:
回复 Yiping Chen4:
Hi Yiping Chen4
我这边也是跟着手册做的,我用IO控制START引脚,复位后,START拉高会使DRDY等间隔输出,拉低便停止。
关键是寄存器的读写总是没反应,DRDY输出信号触发中断后,MCU去读取数据,倒也是有数据出来,格式也跟手册对的上。
无奈读写寄存器总是失败,不知道为什么,而且DIN引脚在复位后总是被ADS1291器件拉低。
shaokai Lin:
回复 shaokai Lin:
现在大部分命令写进去有效了,包括START STOP RESET STANDBY WAKE 等系统命令,但其他命令都无法写进去(包括SDATAC RREG WREG等)。
手册36页说,默认的上电后为RDATAC模式,必须在发送其他命令之前写入SDATAC命令,然而,我发现SDATAC命令即便没有写入,也是可以写大部分系统命令的(START STOP 这些等等)。
并且RDATAC模式下,读取数据是无需发送读操作码的。
而在RDATA模式下,每次读取数据都要发送读操作码。
我尝试写入SDATAC,使之不再是RDATAC模式,但是当数据出来时,一旦SPI有时钟信号,DOUT就有数据出来,而不是等待我的读操作码。
也就是说,我的SDATAC命令写入是不成功的。
这到底是为什么呢?这个命令在手册中说对时钟什么的没有特殊要求,怎么这么难调~
shaokai Lin:
回复 shaokai Lin:
折腾了几天,问题总算解决。
要注意的东西很多:
1.SPI要设置CPOL = 0;CPHA = 1;(DATASHEET P10)
2.SPI使用1MHz为宜,因为读取寄存器时,要求SPI是在为ADS1291主时钟的2倍,我这里使用内部时钟(512KHz).
3.在复位完成、写入SDATAC命令前不要开启DRDY的中断(我在中断触发中读取数据)
4.复位的时序要严格
5.每条指令之间必须单独操作CS的拉高拉低(规格书有提到)
反正就是要吃透规格书,很多注意的地方,一个不小心经常就会失败。