新手想请教
我利用MSP430F5529控制ADS1292R,使它在连续转换数据的模式下运行,
但时序看起来似乎有问题,想请有经验的人指点我一下。
下面是示波器的截图,第一条(红线)是DRDY讯号,第三条(绿色)是SCLK讯号。
据我看数据的时序图,在连续转换的资料模式时时序都是很规则的,
但在我的截图中可以看到,DRDY的宽度是变化的,甚至在SCLK有讯号时,
DRDY还产生trigger,想请教是出了什麽问题,谢谢!
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.
新手想请教
我利用MSP430F5529控制ADS1292R,使它在连续转换数据的模式下运行,
但时序看起来似乎有问题,想请有经验的人指点我一下。
下面是示波器的截图,第一条(红线)是DRDY讯号,第三条(绿色)是SCLK讯号。
据我看数据的时序图,在连续转换的资料模式时时序都是很规则的,
但在我的截图中可以看到,DRDY的宽度是变化的,甚至在SCLK有讯号时,
DRDY还产生trigger,想请教是出了什麽问题,谢谢!
Hi
DRDY是数据转换完成与输出提示符,当它置低后会在DOUT第一位的SCLK的下降沿回复高状态。
也就是说并没有固定的DRDY低电平时间定义。
注意此时的必须有正常的SCLK(因为要下降沿DRDY才跳变), 而在这二个过程中DIN保持低。
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
芯片Power on 后reset一下,然后在写相关配置。(很多寄存器配置采用默认设置就可以了, 此时PGA=6, Vref=2.42.)
SPI的时序参考datasheet:http://www.ti.com.cn/cn/lit/ds/symlink/ads1292.pdf 第十页。
Hi
上述,如果你采用外部CLK, 也就是说你的MCU必须要有CLK输入到ADS1298.
另外确认一下powerpup的时序, 见datasheet: http://www.ti.com.cn/cn/lit/ds/symlink/ads1292.pdf 第六十二页 figure 62.
Hi
事实上,你可以按照datasheet 第63页的步骤来做一个测试,主要是参考他的步骤,也就是你确认你整体的时序。
Hi
在做测试时,不要无输入,可以接GND(外接,或者内部设置都可以), 此时ADC如果有非常非常小的数字输出是正常的。
EVM当数字输出为0时,最好还要还要加一个小电压测试一下,判定ADS1292是有在转换。
您好,看到你回复的帖子,相比您应该对ADS1292r特别了解,我现在的问题是内部晶振可以正常起振,寄存器可读可写,就是连续模式的时候,DRDY和SCLK的时序不对,DRDY也是在SCLK的第一个下降沿变化,但是每次只能发送状态位的前八位,然后DRDY就拉低,因此发回来的数据就是C0,C0,C0,全是C0。希望能够得到您的帮助。