TI中文支持网
TI专业的中文技术问题搜集分享网站

ads1292R的SPI时序问题

新手想请教

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

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

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

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

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

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

Johnsin Tao:

Hi

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

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

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

Ray Hsu:

回复 Johnsin Tao:

谢谢Johnsin Tao的回覆。

我有一些疑问如下 :

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

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

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

谢谢!

Johnsin Tao:

回复 Ray Hsu:

Hi

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

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

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

Ray Hsu:

回复 Johnsin Tao:

目前读回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;}

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

Johnsin Tao:

回复 Ray Hsu:

Hi

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

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

Ray Hsu:

回复 Johnsin Tao:

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

Johnsin Tao:

回复 Ray Hsu:

Hi

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

Johnsin Tao:

回复 Johnsin Tao:

Hi

   上述指的是数字输出。

   

Johnsin Tao:

回复 Johnsin Tao:

Hi

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

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

Ray Hsu:

回复 Johnsin Tao:

hi,Johnsin Tao

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

今天再测试一次,却发现DUOT没有讯号了,检查ads1292r的CLK output(pin 17)也没有clock,是否是ic损坏的状况?不过DRDY与SLCK的时序依然正常

赞(0)
未经允许不得转载:TI中文支持网 » ads1292R的SPI时序问题
分享到: 更多 (0)