新手想请教
我利用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的时序依然正常