微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ads1292R的SPI时序问题

ads1292R的SPI时序问题

时间:10-02 整理:3721RD 点击:

新手想请教

我利用MSP430F5529控制ADS1292R,使它在连续转换数据的模式下运行,

但时序看起来似乎有问题,想请有经验的人指点我一下。

下面是示波器的截图,第一条(红线)是DRDY讯号,第三条(绿色)是SCLK讯号。

据我看数据的时序图,在连续转换的资料模式时时序都是很规则的,

但在我的截图中可以看到,DRDY的宽度是变化的,甚至在SCLK有讯号时,

DRDY还产生trigger,想请教是出了什麽问题,谢谢!

Hi

   DRDY是数据转换完成与输出提示符,当它置低后会在DOUT第一位的SCLK的下降沿回复高状态。

   也就是说并没有固定的DRDY低电平时间定义。

   注意此时的必须有正常的SCLK(因为要下降沿DRDY才跳变), 而在这二个过程中DIN保持低。

谢谢Johnsin Tao的回覆。

我有一些疑问如下 :

1.据我看的理解,当资料转换处于连续模式时,
DRDY应该是以固定的周期做高低电平交换DRDY Should Toggle at fCLK),
这里是我理解错误吗

2.在我贴的三张图中,第一与第三张的DRDY确实是在SCLK的第一个下降沿转换电平,

但如第二张图,我的DRDY常会在SCLK中有很短暂的低电平表现,想请教这是什麽问题。

谢谢!

Hi

   是的,作为一个稳定的连续转换,DRDY是固定周期出现的,并且DRDY置低的时间是固定的。

   这个就要检查从DRDY开始置低到第一个SCLK下降沿的时间中是否有不固定的因数存在,例如SPI口的配置,从CS置低开始有SCLK输出, 这其中的时间控制是否固定。

   DRDY常会在SCLK中有很短暂的低电平表现, 需要检查一下转换设置,是否有其他的控制影响到DRDY, 例如在这个过程中DIN一直处在低,或者其他的接口信号出现变动影响到ADC的正常转换。

目前读回command的值是对的,表示命令有写进去。

但我的DRDY仍不是週期方波,且下降沿出现的位置也不正确(如首贴文的图所示)。

我的程式是照datasheet p.63的程序所写的,不晓得哪裡出错了 :

int main(void) {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    unsigned char dat[3];


    // CLK setting
     UCSCTL3 |= SELREF_2;         // Set DCO FLL Reference = REFO
     UCSCTL4 |= SELA_2;             // Set ACLK = REFO
     __bis_SR_register(SCG0);      // Disable the FLL Control Loop
     UCSCTL0 = 0x0000;               // Will be Set Automatically by FLL

     UCSCTL1 = DCORSEL_2;        // 1 MHz range
     UCSCTL2 = FLLD_1 + 32;        // Set FLL to approximately 1 MHz:
                                                       // FLL divider result = 32768
                                                       // 64 * 32768 = "2 MHz"

     // set related pins with ADS1292R
     P2DIR |= BIT3;                           // P2.3 -> CLK_SEL
     P8DIR |= BIT0 + BIT1 + BIT2;   // P8.0 -> RESET, P8.1 -> START, P8.2 -> CS'

     // SPI initialization
     P3SEL = BIT0|BIT1|BIT2;                                                                   // Set Pin Function for SPI Mode
     UCB0CTL1 |= UCSWRST;                                                                  // **Put state machine in reset**
     UCB0CTL0 |= UCMST+UCSYNC+UCCKPL+UCCKPH+UCMSB;    // 3-pin, 8-bit SPI master
                                                                                                                 // Clock polarity high, MSB
     UCB0CTL1 |= UCSSEL_2;                                                                 // SMCLK
     UCB0BR0 = 0x02;                                                                              // /2
     UCB0BR1 = 0;                                                                                    //
     UCB0MCTL = 0;                                                                                 // No modulation
     UCB0CTL1 &= ~UCSWRST;                                                              // **Initialize USCI state machine**

     // indicate ADS1292R use internal clock
     P2OUT = BIT3;                                                                                   // indicate ADS1292R use internal clock
     __delay_cycles(100);                                                                         // wait for oscillator to wake up

     // wait for 1s for ADS1292R's power-on reset
     P8OUT |= BIT0;                                                                                // set RESET'=1
     delay_ms(1000);                                                                               // wait for 1s for power-on reset

     // reset ADS1292R & CS' pin tied low
     P8OUT &= ~BIT0;                                                                            // issue reset pulse
     delay_ms(100);                                                                                // wait 0.1s
     P8OUT |= BIT0;                                                                               // clear reset
     P8OUT &= ~BIT2;                                                                           // CS' tied permanently low

     // send command
     Send_CMD(0x11);                                                                          // sent SDATAC command
     dat[0]=0xA0;                                                                                   // CONFIG2 = A0;
     Send_CMD_Multi(0x40+0x02, 1, dat);                                           // Config. CONFIG2 = 0xA0 to use internal reference
     dat[0]=0x2C;                                                                                   // RLDSENS = 2C;
     Send_CMD_Multi(0x40+0x06, 1, dat);                                           // right leg drive
     dat[0]=0xC2;                                                                                   // RESP1 = C2;
     Send_CMD_Multi(0x40+0x09, 1, dat);                                           // turn on RESP demodulation&modulation

     // DRDY' interrupt
     P1IE |= BIT0;                                                                                  // P1.0 interrupt enabled
     P1IES |= BIT0;                                                                               // P1.0 Hi/lo edge
     P1IFG &= ~BIT0;                                                                           // P1.0 IFG cleared

     // START = 1
     P8OUT |= BIT1;                                                                            // START = 1

     // send continue mode command
     Send_CMD(0x10);                                                                       // enter the continue mode

     __bis_SR_register(LPM0_bits + GIE);                                       // CPU off, enable interrupts
    return 0;
}


调试很久还是没成功,希望有人可以指点一下,谢谢!

Hi

  建议通过从时序上确认错误,在修正程序,在datasheet:http://www.ti.com.cn/cn/lit/ds/symlink/ads1298.pdf

  在datasheet中有很多参考时序都是可以参考的。

hi, Johnsin Tao

谢谢你的建议,目前我的时序已经正确了。

不过接收到的值却是错误的,
我用电源供应器从INP和INN输入0.5V的直流电压,
经PGA(*6)放大后应该是3V,超过参考电压的2.42V
所以输出应该是7FFFFF,但从示波器上看到的值却不是这样的,
想请问该从哪裡debug?
谢谢~!

Hi

  你在示波器上看到的值是多少?

Hi

   上述指的是数字输出。

   

Hi

    芯片Power on 后reset一下,然后在写相关配置。(很多寄存器配置采用默认设置就可以了, 此时PGA=6, Vref=2.42.)

   SPI的时序参考datasheet:http://www.ti.com.cn/cn/lit/ds/symlink/ads1292.pdf 第十页。

hi,Johnsin Tao

我在power on时有作reset的动作。

今天再测试一次,却发现DUOT没有讯号了,
检查ads1292r的CLK output(pin 17)也没有clock,
是否是ic损坏的状况?

不过DRDY与SLCK的时序依然正常

Hi

    CLK 配置如下:

    如果你是采用内部CLK, 并设置CLK_EN=1, 正常供电,就有CLK输出。

    CLK_EN的默认设置是0,也就是没有CLK输出,所以没有CLK并不意味着芯片损坏了。

     

Hi

   上述,如果你采用外部CLK,  也就是说你的MCU必须要有CLK输入到ADS1298.

   另外确认一下powerpup的时序, 见datasheet: http://www.ti.com.cn/cn/lit/ds/symlink/ads1292.pdf  第六十二页 figure 62.

Hi

   事实上,你可以按照datasheet 第63页的步骤来做一个测试,主要是参考他的步骤,也就是你确认你整体的时序。

 

Hi, Johnsin Tao

谢谢你的回覆。

事实上我的设计就是参照p.63的程序,
经过一天的测试有一些疑问如下,想请教你 :

    目前在无输入的状态下,ECG和呼吸仍有不小的值,如下示波器截图。


   

同时我量测PGA输出,大约有1.x伏的直流,据我理解,类比讯号经PGA
    放大后就会经过ADC转换成数位讯号,所以我在示波器看到输出值不如
    预期是0(或是很小)其实是正常的,即是上述的直流本身。
    
    另外我量测ADS1292RECG-FE开发板上的DOUT讯号,在无输入讯号的
    情况下完全为0(包括状态位元组),这是正常的吗?

Hi

  在做测试时,不要无输入,可以接GND(外接,或者内部设置都可以), 此时ADC如果有非常非常小的数字输出是正常的。

  EVM当数字输出为0时,最好还要还要加一个小电压测试一下,判定ADS1292是有在转换。

Hi

打扰下,我最近也在做MSP430F5529与AD1292通讯的,时序那边一直没通过,软件仿真时序可以读值,但是真正用时钟的时候不行,不知道你的成功了吗?能不能指教一下,我有几个问题:

1:MSP430与AD1292 SPI通讯的时候是不是对时钟严格,我的CLK是1M,SCLK是512K(1/2),不知道这样可否。

2:通讯SCLK对信号的相位那些有要求吗?即UCCKPH 与UCCKPL需要设置吗

3:是否需要用SPI中断去读取数据

谢谢

您好,看到你回复的帖子,相比您应该对ADS1292r特别了解,我现在的问题是内部晶振可以正常起振,寄存器可读可写,就是连续模式的时候,DRDY和SCLK的时序不对,DRDY也是在SCLK的第一个下降沿变化,但是每次只能发送状态位的前八位,然后DRDY就拉低,因此发回来的数据就是C0,C0,C0,全是C0。希望能够得到您的帮助。

你好!我的读到的数据也是C0,C0,C0,.........不知道是怎么回事。

Hi Ray Hsu

    虽然你的帖子已经很久,但是还是想想你请教。

    我现在用的ADS1291,复位后,对寄存器的读写操作,DOUT一直都没有数据出来。

    但是我通过IO口启动转换,DRDY却有定时的脉冲输出。

    我看到你在前面也提到过DOUT没有数据,请问你是如何解决的?程序上应该注意哪些问题呢?(我已经安装Datasheet的时序及流程去初始化了,一直不行呢)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top