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.

关于ADS1299的SPI读取器件ID的程序移植

Other Parts Discussed in Thread: ADS1299, ENERGIA

各位好。

现在我用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);

  • 可以敘述一下完整的程式碼嗎?我也在研究這個,目前讀ID都是0xE0,不知道為什麼

  • 建议使用示波器或者逻辑分析仪抓一下spi的波形,与手册中比对,有些MCU每个字节发送完毕得加US延时才行,