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.

msp430g2553 SPI 通信数据不正确

Other Parts Discussed in Thread: MSP430G2553

大家好!我现在尝试用两块MSP430G2553 LaunchPad进行SPI通信,示例代码用的TI的官方代码:

Master:

#include "msp430g2553.h"

unsigned char MST_Data, SLV_Data;

void main(void)

{

  volatile unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  P1OUT = 0x00;                             // P1 setup for LED & reset output

  P1DIR |= BIT0 + BIT5;                     //

  P1SEL = BIT1 + BIT2 + BIT4;

  P1SEL2 = BIT1 + BIT2 + BIT4;

  UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;  // 3-pin, 8-bit SPI master

  UCA0CTL1 |= UCSSEL_2;                     // SMCLK

  UCA0BR0 |= 0x02;                          // /2

  UCA0BR1 = 0;                              //

  UCA0MCTL = 0;                             // No modulation

  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

  IE2 |= UCA0RXIE;                          // Enable USCI0 RX interrupt

  P1OUT &= ~BIT5;                           // Now with SPI signals initialized,

  P1OUT |= BIT5;                            // reset slave

  __delay_cycles(75);                        // Wait for slave to initialize

 

  MST_Data = 0x01;                          // Initialize data values

  SLV_Data = 0x00;

  UCA0TXBUF = MST_Data;                     // Transmit first character

  __bis_SR_register(LPM0_bits + GIE);            // CPU off, enable interrupts

}

// Test for valid RX and TX character

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCIA0RX_ISR(void)

{

  volatile unsigned int i;

  while (!(IFG2 & UCA0TXIFG));                // USCI_A0 TX buffer ready?

  if (UCA0RXBUF == SLV_Data)                // Test for correct character RX'd

    P1OUT |= BIT0;                           // If correct, light LED

  else

    P1OUT &= ~BIT0;                         // If incorrect, clear LED

  MST_Data++;                               // Increment master value

  SLV_Data++;                               // Increment expected slave value

  UCA0TXBUF = MST_Data;                   // Send next value

  __delay_cycles(50);                          // Add time between transmissions to

}                                           // make sure slave can keep up

Slaver:

#include "msp430g2553.h"

void main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer

  while (!(P1IN & BIT4));                   // If clock sig from mstr stays low,              // it is not yet in SPI mode

  P1SEL = BIT1 + BIT2 + BIT4;

  P1SEL2 = BIT1 + BIT2 + BIT4;

  UCA0CTL1 = UCSWRST;                       // **Put state machine in reset**

  UCA0CTL0 |= UCCKPL + UCMSB + UCSYNC;      // 3-pin, 8-bit SPI master

  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

  IE2 |= UCA0RXIE;                          // Enable USCI0 RX interrupt

  __bis_SR_register(LPM4_bits + GIE);       // Enter LPM4, enable interrupts

}

// Echo character

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR (void)

{

  while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?

  UCA0TXBUF = UCA0RXBUF;

}

现在我碰到下面的问题:

(1)在master的SDO端口,可以看到发出的数据,但是只有7个时钟信号,而不是8个时钟信号。另外,数据发送完成后,数据线上没有STOP信号,而是保持高电平或低电平?

(2)在发送的两个相邻数据,可以看到数据为递增的,但是从Master代码可以看到,只有在进入到接收中断后。数据才进行累加,而我在SDI端口并没有看到数据。那是什么触发中断而对MST_Data++的。

(3)在Master的SDI端口没有数据输入,即slaver没有数据回报,只有杂波。我想问问上面的Master和Slaver代码这样配合能通信成功吗?如果不行,哪里需要注意或修改?

大家帮忙看看,谢谢了!