|
发表于 2022-4-21 23:57:42
|
显示全部楼层
本帖最后由 xjw01 于 2022-4-22 00:05 编辑
我的复位键是接电源的,不易受干扰的,芯片没有被复位。
被干扰后,芯片异常,无法正常读取数据。上述想法无法实现。
但我无意中发现:被干扰后,只是造成DOUT数据无法移出而已。因为DRDY始终保持低电平,程序误以为有新数据,反复输出SCK信号来读取数据,而数据是错的。
后来,我再次回到数据手册:数据读取后,芯片立刻将DRDY置1。所以,如果不是1,说明芯片受到电磁干扰。这样,判断是否受到干扰就有了依据。
然而,如何让DRDY恢复正常?如何让它变为1?百思不得解。用示波器测SCK脚,总是有脉冲,它是用来读取数据的,可数据无效。越看越生气。拿起摄子,干脆把SCK引脚对地短路,我真不想看这些脉冲!!
这下可好,轻轻一碰,数据输出正常了。
我立刻明白,摄子引入了额外的脉冲,数据正常了。我想,读数异常时,何不在程序中引入SCK脉冲,使得芯片恢复。
经过反复调试,最终完美解决,一个数据也不丢。方法如下:
P_CS = 0;
ads1256_w1b(CMD_RDATA); //读数据
ads1256_delay(25); //25对应10us,须延时6.6us以上才能读取数据(详见ads1256手册的t6)
v = ads1256_r1b(); v <<= 8;
v += ads1256_r1b(); v <<= 8;
v += ads1256_r1b();
while(!P_DRDY){ //当ads1256受到干扰,数据移出异常,须重读
P_SCK=1; ads1256_delay(1); //输出SCK脉冲
P_SCK=0; ads1256_delay(1);
ads1256_w1b(CMD_RDATA); //重读数据
ads1256_delay(25);
v = ads1256_r1b(); v <<= 8;
v += ads1256_r1b(); v <<= 8;
v += ads1256_r1b();
}
P_CS = 1;
if(v&0x00800000) v |= 0xFF000000;
|
|