This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS1243: 单片机在读取ADS1243数据时,单片机SPI的SCLK管脚设置为外部上拉时无法正确读取到寄存器的值,单片机SPI的SCLK管脚配置为推挽时读取就可以。

Part Number: ADS1243

3.3V的电源,MCU在读取ADS1243数据时,SPI的SCLK管脚设置为外部上拉时无法正确读取到寄存器的值,外部上拉电阻为5.1K,SPI的SCLK管脚配置为推挽时读取就可以。

本来是用5V的单片机读取发现有问题,就改成3.3V的单片机读取试下,就发现了该问题,为什么会出现这种现象。

所有上拉电阻选型为5.1K

电路看着应该没啥问题,单片机的SCLK、MOSI、CS都配置成开漏外部上拉,MISO配置成外部上拉输入,读取寄存器错误。

单片机的MOSI、CS配置成开漏外部上拉,MISO配置成外部上拉输入,SCLK的配置成推挽,读取寄存器就正确。

写寄存器都没有问题和SCLK上拉推挽无关,读寄存器存在问题,配置完ADS1243后,开始读取寄存器值。

下图为读取错误示波器图片

SCLK开漏外部上拉ADS1243读取错误0x4B,0x1F

下图为读取正确示波器图片

SCLK推挽ADS1243读取正确0x22,0x61

ADS1243写寄存器,SCLK推挽和开漏外部上拉都正常,通过反复配成推挽或开漏测试无影响,只要保证读的时候SCLK配置成推挽,读的数据都是正确的,说明写寄存器和SCLK推挽或开漏外部上拉无关。

由于使用条件有限必须搞清楚为啥SCLK外部上拉存在问题是使用方法不当还是别的什么问题,请教老师前辈们给指导下

  • 用两个ADS1243芯片为了兼容直插和贴片封装,预留了有源晶振和无源晶振,测试只使用一种。

  • 您好,

    ADS1243 您是使用几伏供电?MCU 与ADS1243 SPI 接口的电平需要兼容:

    本来是用5V的单片机读取发现有问题,就改成3.3V的单片机读取试下,就发现了该问题,为什么会出现这种现象。

    您的意思是不管5V还是3.3V的单片机读取都有问题是吗?

    上述SCLK 波形您是在ADS1243的SCLK 管脚处测量的是吗?在不同配置(SCLK推挽或开漏外部上拉)下,ADS1243 SCLK 管脚处波形质量一样吗?

  • 刚开始采用的是S912ZVM单片机IO端口5V,IO端口默认推挽,ADS1243是5V供电,读取寄存器有问题,写寄存器应该没有问题,拿AIN0~AN7做为IO输出测试正常。

    然后就改成STM32F103单片机3.3V,ADS1243是3.3V供电测试,STM32的SCLK配置推挽读取寄存器没有问题,但是SCLK配置成开漏外部上拉3.3V上拉电阻为5.1K,读取就有问题了。CS、MOSI、MISO端口配置对结果无影响。但配置成开漏上拉,写寄存器应该是没问题的,因为AIN0~AN7可配置成数字口进行输出,配置让这几个管脚输出高低都没有问题,因此写寄存器应该没有问题。现在搞不清楚问题出在哪,是我使用方法有问题还是芯片使用起来比较苛刻。

  • 图片上是ADS1243的SCLK管脚处测量的,从右边上下两个图片对比,SCLK推挽和开漏外部上拉,SCLK下降沿应该是近乎一样的,都是直接从高到低,但是SCLK上升沿开漏上拉不是直接上去稍微有一点点斜率上去的,但是理论上ADS1243芯片应该不会那么苛刻,就是搞不清楚问题在哪?推挽肯定驱动能力强,但是主要是作为IO口驱动ADS1243的SCLK管脚,理论上推挽或者开漏上拉应该不影响。

  • 您的意思是两款单片机读取寄存器的现象还不一致?即STM32F103 单片机SCLK配置推挽可以正确读取寄存器,而S912ZVM单片机SCLK 配置推挽读取寄存器有问题?它们的区别是一个使用3.3V电平通信,一个使用5V电平通信?

    推挽肯定驱动能力强,但是主要是作为IO口驱动ADS1243的SCLK管脚,理论上推挽或者开漏上拉应该不影响。

    我也这么认为,所以您可以附上上面两种单片机读取异常的完整波形图(cs、SCLK、DIN、DOUT)吗?我想具体看下波形质量或时序是否存在问题

  • 是的,两款单片机读取寄存器的现象还不一致,STM32F103的IO是3.3V,S912ZVM单片机的IO是5V。我测试是STM32的SCLK推挽读取寄存器正常,SCLK开漏上拉3.3V读取寄存器不正常。S912ZVM单片机推挽也读取寄存器不正常,但是两个单片机写寄存器应该是正常的,因为写寄存器控制AIN0~AIN7作为IO口输出都是正常的。也不知道我这问题是跟电路有关还是跟程序配置有关,如果是跟程序有关,按说STM32的SCLK推挽和开漏上拉应该是一样的现象,但是一个结果正确推挽,一个不正常开漏。

  • STM32单片机3.3V 下,通过ADS1243指令复位后,不进行写寄存器,直接读取0x00~0x01地址的寄存器数据。发送指令0x10,0x01,0x00,0x00,一共四个字节,ADS1243后两个字节返回默认应该是0x20 0x01。

    SCLK推挽  DOUT(ADS1243 SPI输出口)波形

         

    SCLK推挽   SCLK 和DOUT(ADS1243 SPI输出口)正确 读出的确实是0x20,0x01

    SCLK开漏上拉   SCLK 和DOUT(ADS1243 SPI输出口)错误 读出的是0x80,0x1F。

    从上面两个图对比SCLK上拉和推挽,上拉上升时间长一些,而且明显第一个SCLK的上升沿有个窄脉冲,这个窄脉冲感觉是有问题的,按道理说这个事ADS1243发出的SCLK又是稳定的,不应该出现窄脉冲的现象,可能是SCLK上升沿产生的干扰,导致ADS1243的DOUT输出数据错位,我感觉可能读取异常可能跟这个窄脉冲有关,但是为什么会出现这个现象呢,就搞不清楚。

  • 这是单片机发送的波形,即ADC的接受DIN波形,SCLK不管推挽和开漏上拉,发出的波形都一样。ADC的DIN都为开漏上拉

    ,SCLK推挽,ADC的接受DIN波形

    ,SCLK开漏上拉,ADC的接受DIN波形

    这个应该没啥区别,问题应该不在这。

  • 看波形唯一比较明显的区别是那个窄脉冲,那个窄脉冲是在DOUT上出现的是吗?在输入DIN数据时的第一个SCLK的上升沿出现的吗?在整体波形上我怎么没看出来。

    读寄存器有个延迟,不知道您注意到了没有,如下截图:

  • SCLK改为开漏外部上拉

    是在ADS1243的DOUT脚上出现的,就是单片机的输入口,是在第一个SCLK的上升沿出现的,那个脉冲比较窄,整体波形可能淹没了,而且我测试不是每次都有那个脉冲,寄存器是有延迟,但是我的晶振是4M,读每个字节之间的两个SCLK的间隔从示波器上看有500us,等待时间应该是够的。原理是ADS1243的DOUT脚变化也应该是在SCLK的上升沿出现,,但是出现那个窄脉冲是挺奇怪的,而且不是每次都有。

  • 那个脉冲比较窄,整体波形可能淹没了,而且我测试不是每次都有那个脉冲,

    没有那个脉冲时可以正确读取寄存器值吗?

    DOUT 走线附近或DOUT走线过孔附近有没有其他数字信号?有没有可能是其他数字信号对DOUT 造成的干扰?

    看下面读时序图,在DIN 输入命令时,DOUT是高阻抗状态,是没有输出的,因此我认为DOUT的这个窄脉冲可能是其他数字信号对其造成的干扰。

    您可以用四通道示波器测量CS、SCLK、DIN、DOUT 读取寄存器波形吗?您现在仅是读取寄存器没有启动AD转换是不是?

    您可以检查下程序配置吗?两种单片机读取情况不一样,我觉着也不能排除程序的问题

    STM32单片机读取您测试了几块板子是这种现象?可以多测试几块板子吗以排除焊接和芯片存在问题?

  • 我今天重新测试了一下,S912ZVM单片机IO端口5V,IO端口默认推挽,读取寄存器不正常,这个我最后在SCLK对地加了一个30pF的电容,读取寄存器正常了。

    但是STM32单片机SCLK推挽和开漏外部上拉,结果还是不一样,推挽就正常,开漏上拉就不正常,目前测试两块ADS1243测试板都不正常,我用的战舰STM32F103的开发板用杜邦线接到ADS1243的电路板上,从推挽测试正常,ADS1243电路板电路设计应该没啥问题。ADS1243这个ADC只要外接外部晶振是自动启动转换的,从DRDY上就能看到有脉冲信号,证明AD转换进行着。暂时没有条件用四通道示波器测试。

    STM32F103的开发板连接ADS1243的电路板的时候,我在SCLK对地也接了个30PF的电容,但是开漏上拉还是读取数据不正常,给我感觉读取错位移位的感觉。但是写寄存器控制AIN党IO口用又全部都正常。ADS1243数据输入应该是下降沿读取,而数据输出是上升沿输出,上升沿开漏上拉和推挽的区别就是上拉上升沿慢一点,推挽上升沿是直接上去的,我分析到的区别就这个,不知道这个是芯片设计缺陷还是我设计的电路还是程序有问题,我还用STM32F103开发板挂了ADI的AD7705也是ADC芯片,那个芯片读取寄存器就正常着。用的都是SPI程序,只是指令和SPI模式不一样,但是那个ADC芯片推挽和开漏上拉读寄存器测试都正常。

  •  我用战舰STM32F103的开发板测了两个不同的ADS1243电路板,一个是我上面画,一个是我伙伴画的,两个板子结果都是一样,SCLK推挽读取正常,开漏上拉结果都一样不正常。从读的数据结果上看,我分析就是上升沿可能有干扰,导致读出的数据错位,因为从DOUT波形数据上看明显看出数据往左偏移了。但是我SCLK对地加了30pF电容不起作用。还有CS、DIN、DOUT这个三个管脚我自始至终配置都是一样的,他们对结果没有影响。在SCLK推挽的情况下,这三个管脚开漏上拉或者推挽,测试结果都正常。

  • S912ZVM单片机IO端口可以配置开漏上拉吗?看下是否可以正确读取寄存器?

    目前测试两块ADS1243测试板都不正常,我用的战舰STM32F103的开发板用杜邦线接到ADS1243的电路板上,从推挽测试正常,

    配置开漏上拉时也是杜邦线接线吗?如果是这样的话有可能是驱动能力不够导致的,因为杜邦线接线会增加线路的寄生电容。

    ADS1243数据输入应该是下降沿读取,而数据输出是上升沿输出,上升沿开漏上拉和推挽的区别就是上拉上升沿慢一点,推挽上升沿是直接上去的,我分析到的区别就这个,

    我也认为可能是这里的原因。

    我还用STM32F103开发板挂了ADI的AD7705也是ADC芯片,那个芯片读取寄存器就正常着。用的都是SPI程序,只是指令和SPI模式不一样,但是那个ADC芯片推挽和开漏上拉读寄存器测试都正常。

    SPI 走线长度一样吗?SPI走线影响线上的寄生电容,越长寄生电容越大,需要的驱动能力越大。

    您是否可以想办法减短STM32  开漏上拉时与ADS1243 的接线长度,不要再对地外接电容,如上所述,线上电容越大需要的驱动能力越大,而开漏上拉驱动能力没那么强。

  • S912ZVM单片机IO端口可以配置开漏上拉,后期我测试下看读取寄存器正常不,现在放假了等收假了再进行测试。

    STM32F103开发板挂接AD7705和ADS1243走线都是杜邦线都是20cm,AD7705板子SPI走线几乎很短几乎可以忽略不计也就2cm到4cm左右,ADS1243的板子SPI走线距离就更短了只有不到2cm。

  • S912ZVM单片机IO端口可以配置开漏上拉,后期我测试下看读取寄存器正常不,现在放假了等收假了再进行测试。

    好的,等您测试结果。

    STM32F103开发板挂接AD7705和ADS1243走线都是杜邦线都是20cm,AD7705板子SPI走线几乎很短几乎可以忽略不计也就2cm到4cm左右,ADS1243的板子SPI走线距离就更短了只有不到2cm。

    不确定 ADS1243的SPI 时序是否哪里存在比AD7705苛刻的地方,您这里可以先尽量缩短杜邦线的长度再进行测试吗?

  • 今天我测试了一下,S912ZVM单片机SCLK推挽可以读取到ADS1243寄存器的数据,画了两个ADS1243板一种需要SCLK并一个30pF的电容,开漏上拉不管并不并电容读取到的都是错误的。S912ZVM单片机和STM32F103开发板现象是一样的,S912ZVM单片机IO口是5V,接到ADS1243供电也是5V,STM32F103开发板IO口是3.3V,接到ADS1243供电也是3.3V。都是开漏上拉有问题,推挽正常,还有其他的管脚比如MOSI和CS推挽和开漏上拉不影响,只要在SCLK推挽的情况下都能读到数据。这个是S912ZVM单片机SCLK推挽和开漏上拉的波形   

    SCLK推挽波形       

     

    SCLK开漏波形

  • ADS1243数据输入应该是下降沿读取,而数据输出是上升沿输出,上升沿开漏上拉和推挽的区别就是上拉上升沿慢一点,推挽上升沿是直接上去的,我分析到的区别就这个,

    估计是你分析的这个原因,你可以尽量缩短杜邦线的长度再进行测试吗?因为线长越长信号线上寄生电容越大,使得信号的上升沿越缓慢。尽量缩短走线长度应该可以改善信号上升时间,看是否可以解决这个问题?

  • 你看下我的板子连接图,我觉得我的这个问题应该不是杜邦线的距离问题,两个板子已经相对是短的距离,再短就没法操作了,而且我的SCLK速率也不高,如果速率高接线的长短可能有影响,但是我的SCLK速率明显很低。有些实际情况可能就是两个板子之间通讯,可以低速率只要能通讯就行。

  • 我不认为这是SCLK 速率的问题,这应该主要是SCLK上升沿的问题,SCLK上升沿时间太长的问题。我现在考虑到您可以减小OD上拉的电阻值来减小上升时间,你可以尝试下不同上拉电阻值看是否可以解决OD配置下不能读取的问题

  • 今天测试 3.3V IO端口的STM32F103开发板连接ADS1243板开漏模式下SCLK管脚上拉电阻选用5.1K和2K读取寄存器数据都不正确不管对地接没接30pF的电容,选用1K的上拉电阻并且在该管脚接一个30pF对地的电容测试正常,不接30p电容不正常。

    而5V IO端口的S912ZVM开发板接ADS1243板5.1K、2K、1K的上拉电阻都测试了读取寄存器数据都不行,接不接电容都不正常。上拉电阻太小还会导致低电平不能归零。

    推挽两个开发板都正常。

    同下图能看出3.3V STM32F103开发板接1K上拉电阻上升沿要比S912ZVM开发板稍微快一些,但是IO端口的特性就是这样也改变不了,是不是ADS1243的芯片设计存在缺陷,对上升沿要求太苛刻,假如用有些单片机没有推挽功能只能外部上拉是不是就没法用了?

    STM32F103开发板连接ADS1243上拉电阻1K

    S912ZVM开发板连接ADS1243上拉电阻1K

    S912ZVM开发板连接ADS1243上拉电阻2K

  • 在3.3V和5V不同电压供电下,SCLK OD 上拉电压不同,那么其需要的上升时间也不同(一个上升到5V,一个上升到3.3V),因此可能需要不同的上拉电阻来设置合适的上升时间,同时上升时间还与线上的电容有关。也就是设置合适的上拉电阻和合适的线上电容来达到一个合适的上升时间,使SCLK 可以正常工作。

    假如用有些单片机没有推挽功能只能外部上拉是不是就没法用了?

    通过你的测试,两个开发板通过不同的上拉电阻和电容都可以正常读取了,为什么说使用OD接口上拉就没法用了?

  • S912ZVM开发板5V的单片机OD上拉一直没法用,我接了5.1K、2K、1K电阻上拉都不行,上面那个回复有2K和1K上拉的波形。只是STM32F103开发板3.3V OD上拉正常。3.3V单片机上拉1K电阻正常,上拉2K和5.1K都不行。而5V单片机上拉1K、2K、5.1K都不行,使用上还是有问题。

  • 如上所述,上拉电压不同所需要的上升时间tr不同,上升时间主要由下面关系公式决定,Rp就是上拉电阻,Cb就是线上电容(包括芯片的输入电容、connector 电容、线缆电容、PCB 走线电容、外接电容等所有线上电容),我觉着你可以调换其他电阻电容值以调节上升时间tr,因为上拉电压不同所以不能使用3.3V上拉电压的经验值。这肯定不好调,但不代表不可以调出来。

    上面这个公式来源于下面文档,下面文档也说明了Rp不能太小的原因,或者说Rp太小会造成VOL太大。

    I2C Bus Pull-Up Resistor Calculation

  • 一般情况下很多SPI的芯片或者设备如果是开漏的,SPI端口外部上拉5.1K一般就能用了,很少出现用不了的现象。我也调试程序电路10来年了,不会犯哪种低级失误,我现在把1K、2K,5.1K都测试了,对地那个电容30pF已经够小了,再换电阻意义不大。按正常是应该比如ADS1243芯片给出假如5V的情况下,开漏状态需要接多大的上拉电阻,需不需要接电容接多大电容,应该要在手册标出来而不是我在这来回试。因为每个芯片都不一样,可能有些芯片只接上拉电阻电阻值5K到50K都能用,电容10pF到1nF都能用,对于芯片内部不了解,试了几个典型值不行,再试其他阻值我觉得无意义。如果该芯片上拉条件苛刻,我觉得有必要在芯片里面说明上拉使用条件,用多大的范围的电阻,多大范围的电容写到手册里面。

  • 如上所述,开漏接口信号的上升时间与上拉电阻和线上电容共同作用的,线上电容影响的参数比较多包括芯片的输入电容、connector 电容、线缆电容、PCB 走线电容、外接电容等所有线上电容,上拉电压(上拉电压也影响OD信号上升时间)也与实际应用确定,因此没法给出上拉电阻和外接电容。用户可使用上面截图公式根据自己的应用进行估算。

  • SCLK 是斯密特触发输入,这样的输入接口对输入信号的上升沿应该没那么苛刻,你可以附一个完整的读取寄存器值的通信波形吗?我对照datasheet 时序要求看下是否都符合规范参数。

  • IO口为5V,我配置完前两个寄存器的值0x22,0x63,然后读取,第一张图SCLK推挽,读取正确的图。

    之后更改SCLK为开漏外部上拉,上拉电阻选用2K,下拉对地电容选用30pF,其他管脚如MOSI、MISO、CS配置不变和第一张图配置一模一样。寄存器读出来的值不仅不对还不稳定。

    2K上拉上升沿波形。

  • 还有写ADS1243寄存器,和SCLK开漏上拉或者推挽无关,因为我测试过,先将SCLK配置为开漏上拉的模式,然后写寄存器,写完后更改SCLK为推挽模式,然后读取寄存器值正常,反复这么测试都是正常的,说明写ADS1243寄存器和SCLK配置开漏上拉或者推挽无关。

  • 好的,读寄存器时仅SCLK 的接口形式由推挽改为OD 上拉,其他包括读取时序都没变是吗?因为你仅给出了SCLK和DOUT 波形,没有给出CS和DIN的波形,我担心这里读取时序不一样,我没法完全整个时序对照datasheet 参数来核对。

  • 我注意到在DOUT 输出两个字节后,后面像是还在输出,你读取的时候不是读取两个寄存器的值吗?为什么DOUT 还在输出?

  • CS和DIN的配置都是一样没有变,所以就没给出波形,我也测量波形正常,我觉得给不给意义不大。还有我是读取三个字节寄存器的数据,所以DOUT还有波形,因为示波器再把最后一个字节显示出来,那示波器波形就得压缩了更看不清楚。

  • 在配置SCLK为开漏外部上拉时,仔细看SCLK 波形,在SCLK波形上升沿会存在台阶现象,我想这个现象会影响ADC的识别。

  • 我觉得你分析的不对,开漏上拉上升沿跟推挽比本来就有个过程上升过来的,我觉得可能和我拍照有关或者示波器精度有关,我用的事泰克TDS1012C-SC,如果把示波器窗口展开测试就正常着。我觉得这个肯定不是问题的主要原因,如果是这个原因,最起码有读对的时候,但是整个过程每隔多次时间读一次,读完CS拉高,下次接着读,但是没有一次读对的,如果有时读对有时读错,我还觉得和这个有关。是每次读都读不对,而不是有时读对有时读错的现象。

    你看下图上升沿明显没有台阶的现象,不照样读不对。所以我觉得不是这个原因。现象是次次都读不对,没有一次读对的。

  • 有时为了展示整个时序,有时就要牺牲精度。如果为了展示精度,又没法给你展示整个时序。这可能是TDS1012C-SC该类示波器的缺点,还有我是手机拍照的,也可能有影响。但是按我的分析不是这个原因,比如我100ms读一次,每次读完CS拉高,等100ms到又接着读,但是次次都读不对,我觉得应该不是这个原因。

  • 我明白你的意思。

    ADS1243数据输入应该是下降沿读取,而数据输出是上升沿输出,上升沿开漏上拉和推挽的区别就是上拉上升沿慢一点,推挽上升沿是直接上去的,我分析到的区别就这个,

    我认为你说的这个是主要原因,通过你上面的测试也验证了是这个问题,我想只有改善SCLK的上升沿才能解决问题。调节上拉电阻和线上电容不太好调节,我希望你可以尽量缩短杜邦线的长度再进行测试。

  • 这是我新做的S912ZVM测试板,和ADS1243测试板通过杜邦线连接,5V IO,就是SCLK推挽正常,开漏上拉不行,这个线距离我觉得不是很长,你可以看下图片,如果非要太短的距离,那两个板子就没法用了,不可能非得要求ADS1243和MCU布在一个板子上,我觉得芯片设计不可能这么苛刻。

  • 我只是想让你验证缩短走线距离OD上拉可行。OD上拉确实驱动能力低,在走线较长的场合很可能不适用。我觉着我们没有再讨论的必要了,结论基本就是这个意思。

  • 好的,谢谢