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.

MSP430 SPI&UART问题请教

Other Parts Discussed in Thread: MSP430G2553, MSP430F5529

大家好,
我是MSP430的初学者,遇到一些问题想麻烦大家指导我。

主要是想调试SPI串口的功能,测试情境如下:
我用lanchpad的MSP430G2553作为Master,用MSP-EXP430F5529作为Slave,
Master将资料从0x00每次递增加1、透过SPI传送给Slave,Slave接收再使用UART将资料传送PC,借此观察结果的正确性。

不过我用Access看回传值一直是错的(不是递增数值),调试很久找不出问题所在,所以上来跟各位高手讨教,请大家指导我一下。

以下是我的程序 :

//Master

#include <msp430.h>

/*
 * main.c
 */
int main(void) {
     unsigned int data=0x00;
     WDTCTL = WDTPW + WDTHOLD;                  // Stop watchdog timer

     P1OUT = 0x00;                              // P1 setup for reset output
     P1DIR |= BIT5;

     // Set DCO Clock
     BCSCTL1 = CALBC1_1MHZ;
     DCOCTL = CALDCO_1MHZ;

     // SPI Initialize
     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**

     // Reset SPI Slave
     P1OUT &= ~BIT5;                           // Now with SPI signals initialized,
     P1OUT |= BIT5;                            // reset slave
     __delay_cycles(100);
     // Wait for slave to initialize

     // Data Transmit
     for(;;)
     {
         while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?
         UCA0TXBUF = data;
         data++;
         __delay_cycles(1000);
     }
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------

// Slave

#include <msp430.h>

/*
 * main.c
 */
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer

    // CLK Set
    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
                                // 32 * 32768 = "1 MHz"

    // SPI Initialize
    P3SEL = BIT0|BIT1|BIT2;                 // Set Pin Function for SPI Mode
    UCB0CTL1 |= UCSWRST;                    // Put State Machine in Reset
    UCB0CTL0 |= UCSYNC+UCMSB+UCCKPH;        // 3-pin, 8-bit SPI Master,MSB First,Mode 0(UCCKPL=0,UCCKPH=1)
    UCB0CTL1 &= ~UCSWRST;                   // SPI
    UCB0IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

    // UART Initialize
    P4SEL |= BIT4+BIT5;                       // P3.3,4 = USCI_A0 TXD/RXD
    UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
    UCA1CTL1 |= UCSSEL_2;                     // SMCLK
    UCA1BR0 = 6;                              // 1MHz 9600 (see User's Guide)
    UCA1BR1 = 0;                              // 1MHz 9600
    UCA1MCTL = UCBRS_0 + UCBRF_13+UCOS16;     // Modln UCBRSx=0, UCBRFx=0,
    UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**


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

#pragma vector=USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  while (!(UCA1IFG & UCTXIFG));              // USCI_A1 TX buffer ready?
  UCA1TXBUF = UCB0RXBUF;
}

  • Ray Hsu,

    建议调试程序时,逐步增加程序。你可以先调试程序,首先保证MSP430G2553 SPI发送数据正确,再次保证MSP-EXP430F5529 SPI接收数据正确。可以发送相同的数据,使用示波器观察,对于slave可以在线调试,直接查看接收值。都正确后,再在5529上添加UART程序。

    事实上,TI均有对应例程,

    首先附件为MSP430Ware中 G2553的SPI master发送程序;由于只能添加一个附件,下帖续。

  • 此贴附件为F5529 SPI slave例程。它将接收到的数据,又依次发送出去了。

    用这个例程和前面G2553的例程合作,即可看到G2553上面的LED亮了。说明G2553依次发数给5529,后又收到了5529返回的数。数据均正确,LED就会亮。

  • SPI发送和接收均正确后,再调试UART发送的程序,就较为简单了。使用调试助手看看F5529发送出去的数据对不对,正确的话,把SPI  slave和UART程序合起来就行了。当然这些例程你需要理解,并按照自己的想法改变,组合一下。O(∩_∩)O~

    附件为UART例程,可以参考一下。

  • 谢谢Lina Lian大,

    我调试了您给的两个例子,但结果却仍是不正确,
    但当我将reset pin的连结拿掉后结果就正确了,
    (Slave的reset pin是从MSP-EXP430F5529板的RST button焊出来的,
     不知道是不是这裡有问题)
    想请教原因是什麽呢?
    感谢!!

  • Ray Hsu, 它连接RST pin管脚的存在只是为了让主从工作匹配而已,你的硬件连接是不正确的。Master中使用P1.5直接控制slave的RST,让其复位并准备好接收( Slave reset <-|P1.5)。之后master才发送数据。

    我测试的时候一般都是先让slave上电,让其工作起来之后,再给master供电即可。

  • 不好意思想再请教一下

    范例确实调试正确结果0X01,0X02,0X03,...
    但当我将9600波特率调成115200
    一直收到重覆0XFF,0XFF,0XFF,...
    请问这可能是什么现象呢
    谢谢

  • Ray Hsu,

    你先用示波器看看发送出来的数是什么,发送的波特率是多少?先保证发送正确了。

    记得将MSP430 uart程序中调为115200时,user guide中有个表,是相关UART波特率配置参数表,按照那个来。串口调试助手中UART也设置为115200.

    希望对你有帮助!O(∩_∩)O~

  • 谢谢的回覆,
    我有试了你的方法。

    容我先解释一下我的实验 :
    我透过g2553 SPI传送递增的data(0x00,0x01,0x02,0x03…)给f5529,f5529再将SPI所收到的值经由UART传回电脑。
    在baud rate是9600的情况下,电脑确实的收到正确递增数值,但透过示波器看g2553的SPI DOUT接脚,却仅是一连串的方波,如下图。


    在baud rate是115200的情况下,电脑不断收到0xFF,g2553的SPI DOUT输出仍如上图。

    我的f5529 UART配置如下 :

    P4SEL |= BIT4+BIT5;                       // P3.3,4 = USCI_A0 TXD/RXD
    UCA1CTL1 |= UCSWRST;                      // **Put state machine in reset**
    UCA1CTL1 |= UCSSEL_2;                     // SMCLK
    UCA1BR0 = 8;                              // 1MHz 115200 (see User's Guide)
    UCA1BR1 = 0;                              // 1MHz 115200
    UCA1MCTL |= UCBRS_6 + UCBRF_0;            // Modulation UCBRSx=1, UCBRFx=0
    UCA1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

    找不出原因,再麻烦您指教了!


  • Ray Hsu,

    请在观察SPI的输出数据时,把SPI CLK也加进去看,这是我曾经用SPI互传数据时,保存的一个图,你可以清楚的看到发送数据是1,2,3,4,……

    你先保证SPI发送和接收到的数据是正确的后,再调UART.

  • Ray Hsu,

    对于MSP430F5529而言,你的SMCLK是多大啊?是1MHz,还是默认的1.048576MHz?

    参考user guide中的Table 34-4. Commonly Used Baud Rates, Settings, and Errors, UCOS16 = 0设置正确。看你的设置应该是1MHz.

  • 谢谢Lina Lian的回答


    我的SMLCK1MHZ有照着用户指南上设

    后来发现可能是这段代码有问题,因为其他部份都是代码示例里面的东西

         // Data Transmit
         for(;;)
         {
             while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?d
             UCA0TXBUF = data;
             data=data+1;
             __delay_cycles(100000);
         }

    示波器显示就是如之前的PO文那样
    DOUT规则SCLK维持高电平
    不晓得这段代码什么问题

  • 你好,我想请问一下msp430g2553 spi发送数据时就这么写“UCA0TXBUF = MST_Data;”吗?

    那接收数据怎么写成查询方式呢?

    谢谢!

x 出现错误。请重试或与管理员联系。
x 出现错误。请重试或与管理员联系。
x 出现错误。请重试或与管理员联系。
x 出现错误。请重试或与管理员联系。