Part Number:ADS122C04Other Parts Discussed in Thread: TIDA-01526
你好,
我使用ADS122C04采集传感器输出的电压值,硬件原理图如下
使用STM32与ADS122C04通讯时候出现寄存器配置失败的情况,通讯步骤数据及如下
step1,复位ADS122C04,通讯成功
step2,设置配置寄存器00h,通讯成功
step3,设置配置寄存器01h,通讯成功
step4,启动转换
step5,等待10ms后读取转换结果通讯成功。返回数据一直为0x03ffff
因数据不正常,再读取配置传感器的值确认是否配置成功
step6,读取寄存器00h,通讯成功。返回数据(全部寄存器都是)一直为0x01
在这块儿折腾挺久没有效果,我怀疑我的配置过程有错误,请帮我分析下。感谢!
Kailyn Chen:
您好,有两点需要确认下:
第一,上电后,reset拉高之后至少要delay td(RSSTA)=100ns再开始I2C 通讯,不知是否满足?
第二,我看您的时序是在读取转换结果时,返回值都是FF,读取寄存器的值是没问题的。
那在读取转换值的时候,我们可通过DRDYpin去监测转换是否完成, 您是采取的单次转换还是连续转换?
另外,TIDA-01526这个方案是ADS122C04搭配MCU的测量方案,链接中给出了sample code,您可以参考下:
https://www.ti.com/tool/TIDA-01526
code的下载链接,下载之后在fw文件夹中:
https://www.ti.com/lit/zip/tidcee5
,
Walter wu:
谢谢Kailyn答复,两个确认的地方答复如下:
Kailyn Chen 说:第一,上电后,reset拉高之后至少要delay td(RSSTA)=100ns再开始I2C 通讯,不知是否满足?
上电后到开始通讯的时间满足需求,上电后约6秒才开始通讯。
Kailyn Chen 说:
第二,我看您的时序是在读取转换结果时,返回值都是FF,读取寄存器的值是没问题的。
那在读取转换值的时候,我们可通过DRDYpin去监测转换是否完成, 您是采取的单次转换还是连续转换?
采取的是连续转换,现在最亟待解决的问题是:写入配置寄存器的值跟读回来的值不一致。以当前通讯为例
初始化I2C通讯数据为0x90,0x40,0x80。
0x90为器件地址和写命令
0x40为WREG命令
0x80为写入Configuration Register 0的值
从下图可以看出ADS122C04有应答ACK
再读取刚写入的Configuration Register 0的值却返回0x01,按我理解应该返回0x80才对
我怀疑是不是我理解错了,请帮再看下
,
Kailyn Chen:
您应该是理解错了, 您是要读取某个寄存器值的时序吗? 我们以R0=0x80 为例,正常的时序是这样的:
Start–Slave address(/W)0x90–ACK—PREG 0x20—ACK–Repeat Start–Slave address(R)0x91—ACK—Register data 0x80—NACK—Stop
注意: PREG 0010rrxx,rr指的是寄存器地址,比如您要读取寄存器R0的值,那么rr=00,xx写0或1都可以,所以PREG这里为00100000
,
Kailyn Chen:
刚才附的读取寄存器的时序图没有附上,也就是datasheet中的Figure 58.
,
Walter wu:
谢谢Kallyn答复,我这边通讯时候的时序图是正确的,有疑问的地方是:读出的寄存器00h值应该等于写入的值,但我这边读出的值和写入的值不一致,因此应该是初始化失败的。通讯过程如下:
配置寄存器00h,也就是Configuration Register 0的值为0x80,I2C通讯数据如下
0x90 0x40 0x80(器件写地址为0x90,写配置寄存器0的命令为0x40,写入的数据为0x80)
然后再读取配置寄存器0的数据,I2C通讯数据如下
0x90 0x20 0x91 0x01(器件写地址为0x90,读配置寄存器0的命令为0x20,器件读地址为0x91,读回的数据为0x01)
时序完全满足你发的时序图要求,但读回来的数据不是我写入的数据,因此应该是初始化失败了。不理解这里为什么会失败,通讯数据截图如下请帮分析是什么原因。
配置寄存器00h的I2C通讯数据
读取配置寄存器00h的I2C通讯数据
,
Kailyn Chen:
您好,嗯,时序没问题。寄存器0的最高位7:4是输入多路选择器的配置位。
所以您配置的位0x80, 即1000,选择的AINP = AIN0, AINN = AVSS,单端输入AINP=AIN0端,AINN接地。而读取的高4位是0000。
所以想和您确认下,实际电路中,输入端连接的是哪个?
不论是写命令还是读命令,我看了下配置的时序是没问题的。
其他寄存器的配置,读回的值是否也和写入的不一致?
,
Walter wu:
谢谢答复Kailyn,实际电路中输入端连接AIN0接电压信号VOUT_O3(单端信号),原理图如下。
其它寄存器不管写入什么值,读回的都是0x01。
如果是读转换结果,读回的都是0x3fffff
,
Kailyn Chen:
您好,抱歉回复晚了,不知您的问题解决了吗?
I2C的上拉阻值是多少?
另外,我认为还是和程序的语法有关。
程序是从其他成功的I2C案例中移植过来更改的吗?