ADS8588S是具有8通道16位精度同步采样的SAR ADC,采样速度最大为200KSPS, 广泛应用于电力系统的采样电路,具有高精度和高可靠性,ADS8588S有灵活的与主机通讯模式,同时支持串行(serial mode),并行(parallel mode)和并行字节(parallel byte mode)通讯。ADS8588S的通讯有特定的时序要求,必须完全满足时序才能正确读取数据。并行字节相对串行和并行而言稍复杂,这里介绍并行字节通讯的一些要点。
并行字节是把一个16位的数据分为两个8位的字节来读,并行的先读高8位,再读低8位,依次读完8个通道,一共读16次。读完后再进行下一次转换,下一个周期然后再读16次。Datasheet中parallel byte mode的读时序如下图1: 其中CS是片选,RD是读信号,一般CS和RD可以连在一起,DB[7:0]是8位并行字节信号,FRSTDATA信号指示开始读第一通道, 根据datasheet, FRSTDATA会在RD的第一个下降沿变成高电平,表示这是读一通道数据。
图1
如果只遵守这个读的时序仍然有可能出现读数错误,我们读的时候还需要参考另外一个时序,ADC的转换时序,Datasheet中如下图2:其中CONVSTA和CONVSTB是ADC开始转换信号,BUSY表示正在转换,如果BUSY是高,表示本次转换还没有结束,CS是上图中的片选, RESET是复位信号。
图2
这其中隐藏着一个潜在的逻辑,在图1的时序中,在读信号RD的第一个下降沿,FRSTDATA会升高指示第一个通道,但是前提是必须在BUSY由高到低之后的第一个下降沿,如果16次读数的起始不是从BUSY变低之后开始读,就有可能出现严重的错误,举例如下:下图3中CS就是RD信号,两个连在一起,我们看到先是CONVST(A/B)信号上升表示ADC开始转换,BUSY升高表示正在转换,但是这时RD信号已经开始读数,每一个脉冲是一个BYTE, 两个脉冲表示一个16位数据,一共8个数据,所以每个周期RD是16个脉冲。这里RD在BUSY开始之前读了,当BUSY结束(下降沿)后第一个RD读数(为图3CS/RD信号第6个脉冲下降沿)会让系统认为这是第一个通道数据的高8位,后面的数据依次往下,然而实际MCU发出的却是第3组信号的低8位,这时MCU认为的读数逻辑不仅在通道的对应上出错,连在每个16位数据的高8位低8位的顺序也会出错。
图3
我们在第8通道加5V,对应的16进制数位0x7FFF,其余通道都是对地即0V, 对应的16进制数是0x0000,我们用图3时序进行读数,从MCU中看到的结果如下:我们发现MCU认为的第8通道数据并不是0x7FFF,其中高8位的7F变成了3通道的低8位,其中低8位的FF变成了2通道的高8位,另外本来应该是0x0001(1个bit的误差很正常)的其他通道也变成了0x0100, 高8位和低8位也反了,和以上分析的逻辑完全吻合。
表1
我们尝试改变读的时序,如下图4:可以看到,RD的16次读数起始点是在BUSY下降沿之后,第一个下降沿即FRSTDATA的上升沿。
图4
改了时序之后的数据如下表2:读数和预计的完全一致。
表2
总结:
在使用ADS8588S的parallel byte mode读数时一定要注意读数的起始点要在BUSY信号下降沿之后,MCU认为的第一通道要与 FRSTDATA的上升沿指示的第一通道对应上,否则会出现读数通道错误或者高低位顺序错误的情况。