关于ADS1299的SPI读取器件ID的程序移植
各位好。
现在我用msp430f5529lp与ads1299通信。下面是energia的程序
测试读取结果 0011 1110 与手册中的说明符合
Bits[7:5] Not used
Bit 4 Must be set to '1'
Bits[3:0] Factory-programmed device identification bits
1110 = ADS1299
然后我用CCS写5529的程序
#include <msp430.h>
char a=0;
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P3SEL |= BIT3+BIT4; // P3.3,4 option select
P2SEL |= BIT7; // P2.7 option select
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL0 |= UCMST+UCSYNC+UCCKPH+UCMSB; // 3-pin, 8-bit SPI master
//, MSB
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 2; // /2
UCA0BR1 = 0; //
UCA0MCTL = 0; // No modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
//P1OUT &= ~0x02; // Now with SPI signals initialized,
//P1OUT |= 0x02; // reset slave
for(i=50;i>0;i--); // Wait for slave to initialize
P2OUT &=~BIT3; //CS LOW
while (!(UCA0IFG&UCTXIFG));//SDATAC
UCA0TXBUF=0X11;
P2OUT |= BIT3; //CS HIGH
__delay_cycles(4);//4CLK
while(1)
{
P2OUT &=~BIT3; //CS LOW
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF=0X20;
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF=0X00;
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF=0X00;
while (!(UCA0IFG&UCRXIFG));
a=UCA0RXBUF;
P2OUT |= BIT3; //CS HIGH
__delay_cycles(300000);
}
}
然后读取,结果都是0;请指教
这类 SPI 通信结果全0和全1 的情况, 很可能是连接,芯片供电和复位等因素,先检查芯片有没有能够工作了
感谢您的回答,关于供电和复位的原因,我之前就遇到过,已经排除了,当时是只给数字电源,然后模拟电压没给,以为不需要芯片转换,只读ID是没问题的,但是发现无法读取,然后加上模拟电源就可以读取
现在我是5529与ADC连接好,然后分别开energia和CCS下载,这样我应该没有去动过两者间的连线,
然后我发现下面相同程序片段在CLK上输出的波形不一样(在CLK周期相同的情况下)
CCS: energia:
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF=0X11 ; SPI.transfer(0x11);
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF=0X11 ; SPI.transfer(0x11);
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF=0X11 ; SPI.transfer(0x11);
下面是波形示意图,energia在发送8位数据时,中间有明显的延迟,
结贴了,亲测可以430g2955-ads1299 SPI读取ID 0011 1110 3E
时钟8M, UCB0BR0 = 0x02最简单的初始化顺序:
csLow();
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF=0X11; //RDATAC
csHigh();
delay_us(100);
csLow();
delay_us(4);
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF=0X20; //Addr+0X20
delay_ns(1300); //不加延时读出0x00,很关键
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF=0X00; //ID
delay_ns(1300);
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF=0X00;
delay_ns(1300);
//while (!(IFG2 & UCB0RXIFG));
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF=UCB0RXBUF; //串口发送
csHigh();
//delay_ms(50);