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.

[参考译文] MSP430FR2355:SPI 通信问题

Guru**** 1133960 points
Other Parts Discussed in Thread: MSP430FR2355
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1349093/msp430fr2355-problem-with-spi-communication

器件型号:MSP430FR2355

您好!  

我想在两个 MSP430FR2355之间累积一个 SPI 通信。 我有一个主微控制器和五个从微控制器(所有微控制器均为 MSP430FR2355)。

我的主器件在3Wire 中进行 SPI 配置、我使用5个 IO 为芯片选择正确的从器件。 所有从器件都采用4线配置。

我的问题如下:

使用从 SPI (芯片选择低电平有效)的 MODE_2时、我无法发送和接收任何数据。 但是、当我使用 MODE_1 (芯片选择高电平有效)时、我可以发送和接收数据。 我的 IO 连接到 STE 引脚保持高电压在1.6V、即使我将 IO 配置为低电平。

使用这种类型的微控制器是否可以将 STE 连接到 IO?

//SLAVE SPI

#include <msp430.h>
#include "gpio.h"
int main(void)
{
    WDTCTL = WDTPW|WDTHOLD;                   // Stop watchdog timer


    //Configuration SPI pins on Hardawre
    P4SEL0 |= BIT0 | BIT1 | BIT2 | BIT3;             // set 4-SPI pin as second function

    GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN3); //indication alimentation
    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);

    GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4); //indication reception
    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);

    UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**
    UCA1CTLW0 |= UCSYNC|UCMSB|UCMODE_1|UCSTEM;         // 3-pin, 8-bit SPI slave
                                              // Clock polarity high, MSB
    UCA1CTLW0 |= UCSSEL__SMCLK;                // ACLK
    UCA1BR0 = 0x02;                           // BRCLK = ACLK/2
    UCA1BR1 = 0;                              //

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

    PM5CTL0 &= ~LOCKLPM5;                     // Disable the GPIO power-on default high-impedance mode
                                              // to activate previously configured port settings
    UCA1IE |= UCRXIE;                     // Enable TX interrupt
    __bis_SR_register(GIE);       // Enter LPM0, enable interrupts
}

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{   while (!(UCB1IFG&UCTXIFG));               // USCI_B1 TX buffer ready?
    UCA1TXBUF = UCA1RXBUF;                    // Echo received data
    GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN4);
}

//MASTER SPI

#include <msp430.h> 
#include "gpio.h"

/**
 * main.c
 */

//3.6 CS
//UCA1 SPI


unsigned char TXData;
unsigned char RXData;                            // Holds TX data

int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	
    P4SEL0 |= BIT3 | BIT2 | BIT1;             // set 3-SPI pin as second function

    GPIO_setAsOutputPin(GPIO_PORT_P3, GPIO_PIN6);


    GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN3);

    UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**

    UCA1CTLW0 |= UCMST|UCSYNC|UCMSB;          // 3-pin, 8-bit SPI master
                                              // Clock polarity high, MSB
    UCA1CTLW0 |= UCSSEL__SMCLK;                // Select SMCLK

    UCA1BR0 = 0x02;                           // BRCLK = SMCLK/2
    UCA1BR1 = 0;                              //

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

    TXData = 0x01;                            // Holds TX data

    PM5CTL0 &= ~LOCKLPM5;

    GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);
    //GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN6);
    while(1)
    {
        UCA1IE |= UCTXIE;                     // Enable TX interrupt
        __bis_SR_register(GIE);   // enable global interrupts, enter LPM0
        __no_operation();                     // For debug,Remain in LPM0
        __delay_cycles(10000);                 // Delay before next transmission
        TXData++;                             // Increment transmit data
    }
}



#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
    switch(__even_in_range(UCA1IV,USCI_SPI_UCTXIFG))
    {
        case USCI_NONE: break;                // Vector 0 - no interrupt
        case USCI_SPI_UCRXIFG:
              RXData = UCA1RXBUF;
              UCA1IFG &= ~UCRXIFG;
              break;
        case USCI_SPI_UCTXIFG:
            GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN6);
              UCA1TXBUF = TXData;             // Transmit characters
            GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN6);
              UCA1IE &= ~UCTXIE;
              break;
        default: break;
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的图似乎显示您将从器件 STE (P4.0)连接到3.6V (高电平)、我怀疑这不是 您的意图。 您的代码似乎认为您已经将(从) STE 与(主) P3.6联系起来。  

    这实际上是如何布线的?

    [编辑:在更大的印刷中看到这一点,我怀疑你的画是说 P3.6,而不是3.6V。

    更进一步:您的主器件似乎假定 STE 为低电平有效、但从器件假定为高电平有效(UCMODE=1)。  

    另外:如果您使用 Launchpad、请确保从 J101上拆下 RXD/TXD 跳线。 这些会影响 SIMO/SOMI、不会影响 STE、但您仍然应该这么做。]

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

    未经请求:

    > GPIO_setOutputLowOnPin (GPIO_PORT_P3、GPIO_PIN6);
    > UCA1TXBUF = TXData;//发送字符
    > GPIO_setOutputHighOnPin (GPIO_PORT_P3、GPIO_PIN6);

    这可能会在字节移出之前使 STE 无效、从而冻结从器件 SPI (正如我所讲的、甚至是中间字节)。 您应该延迟、直到字节完成、类似于以下内容:

    > while (UCA1STATW 和 UCBUSY)/*空*/; //等待字节移出

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

    > { while (! (UCB1IFG&UCTXIFG));// USCI_B1 TX 缓冲器是否准备就绪?

    我认为这是偶然的。 可能是

    > { while (! (UCA1IFG&UCTXIFG));// USCI_A1 TX 缓冲器是否准备就绪?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。

    我修改了我的程序、可以在 MODE_ 1中正确发送和接收(STE、从站为高电平)。

    但我无法在 MODE_2 (从器件为 STE 低电平)中发送和接收、但我将 IO 置于低电平输出。 我认为 STE (从器件)和3.6之间的总线保持高电平(当我将 IO (3.6)的输出仅置于低电平时测量出的电压为1.3V)。

    为什么我的巴士总是在高? 从属方中的 STE 是否输出电压? 我加入我的新代码。

    #include <msp430.h>
    #include "gpio.h"
    
    void main(void)
    {
        WDTCTL = WDTPW|WDTHOLD;                   // Stop watchdog timer
    
    
        //Configuration SPI pins on Hardawre
        P4SEL0 |= BIT0 | BIT1 | BIT2 | BIT3;             // set 4-SPI pin as second function
    
        GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN3); //indication alimentation
        GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);
    
        GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4); //indication reception
        GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
    
        UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**
        UCA1CTLW0 |= UCSYNC|UCMSB|UCMODE_1;         // 3-pin, 8-bit SPI slave
                                                  // Clock polarity high, MSB
        UCA1CTLW0 |= UCSSEL__SMCLK;
        UCA1BR0 = 0x02;
        UCA1BR1 = 0;                              //
    
        UCA1CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**
    
        PM5CTL0 &= ~LOCKLPM5;                     // Disable the GPIO power-on default high-impedance mode
                                                  // to activate previously configured port settings
        UCA1IE |= UCRXIE;                     // Enable TX interrupt
        __bis_SR_register(GIE);       // Enter LPM0, enable interrupts
    }
    
    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR(void)
    {   while (!(UCA1IFG&UCTXIFG));               // USCI_A1 TX buffer ready?  //erreur 15/04/24 B1->A1
        UCA1TXBUF = UCA1RXBUF;                    // Echo received data
        GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN4);
    }
    

    #include <msp430.h> 
    #include "gpio.h"
    
    /**
     * main.c
     */
    
    //3.6 CS
    //UCA1 SPI
    
    
    unsigned char TXData;
    unsigned char RXData;                            // Holds TX data
    
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	
        P4SEL0 |= BIT3 | BIT2 | BIT1;             // set 3-SPI pin as second function
    
        GPIO_setAsOutputPin(GPIO_PORT_P3, GPIO_PIN6);
        GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN6);
    
        GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN3);
    
        UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**
    
        UCA1CTLW0 |= UCMST|UCSYNC|UCMSB;          // 3-pin, 8-bit SPI master
                                                  // Clock polarity high, MSB
        UCA1CTLW0 |= UCSSEL__SMCLK;                // Select SMCLK
    
        UCA1BR0 = 0x02;                           // BRCLK = SMCLK/2
        UCA1BR1 = 0;                              //
    
        UCA1CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**
    
        TXData = 0x01;                            // Holds TX data
    
        PM5CTL0 &= ~LOCKLPM5;
    
        GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN3);
    
        while(1)
        {
             UCA1IE |= UCTXIE | UCRXIE ;                     // Enable TX interrupt
            __bis_SR_register(GIE);   // enable global interrupts, enter LPM0
            //__no_operation();                     // For debug,Remain in LPM0
            __delay_cycles(10000);                 // Delay before next transmission
            TXData++;                             // Increment transmit data
        }
    }
    
    
    
    #pragma vector=USCI_A1_VECTOR
    __interrupt void USCI_A1_ISR(void)
    {
        switch(__even_in_range(UCA1IV,USCI_SPI_UCTXIFG))
        {
            case USCI_NONE: break;                // Vector 0 - no interrupt
            case USCI_SPI_UCRXIFG:
                  RXData = UCA1RXBUF;
                  UCA1IE &= ~UCRXIE;
                  break;
            case USCI_SPI_UCTXIFG:
               // GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN6);
                UCA1TXBUF = TXData;                    // Transmit characters
                while (UCA1STATW & UCBUSY) ;           /*EMPTY*/
               // GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN6);
                UCA1IE &= ~UCTXIE;
                  break;
            default: break;
        }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、它听起来确实像总线冲突(一些其他工程师将导线拉高)、但根据您发布的内容、我不知道这会是如何发生的。  

    您正在使用什么平台? 是这些 Launchpad 吗?