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.

[参考译文] LAUNCHXL-CC3235S:MSP430FR5969和 CC3235S 之间的 SPI 连接

Guru**** 2392275 points
Other Parts Discussed in Thread: CC3235S, MSP430FR5969

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1118389/launchxl-cc3235s-spi-connection-between-msp430fr5969-and-cc3235s

器件型号:LAUNCHXL-CC3235S
主题中讨论的其他器件:CC3235SMSP430FR5969

您好、TI 团队、

我正在尝试在 MSP430FR5969 (作为主设备)和 CC3235S (作为从设备) Launchpad 之间建立 SPI 通信。

我已使用 spimaster 和 spislave TI-RTOS 示例作为项目的参考。

我的方法如下-

首先、我从两个器件之间的握手开始。

之后,我将在 MSP430处于等待状态时(在 MSP SPI 中是在之前启动的)在 CC3235S 中打开 SPI。

然后,我将向 MSP 发送“保存准备接收”信号。

在接收到上述信号数据传输后、应出现真正 的传输状态、用于显示结果。

问题:

我所面临的问题是,在第一次迭代中,SPI_TRANSF()提供了真值,但数据的传输和接收没有发生,因此也不调用回调函数。

而从第二次迭代 SPI_TRANSF()中,由于没有发生数据传输,因此会给出错误值。

我还在连接代码和输出。

TI 团队能否帮助我尽快解决问题。

/* CC3235S as a Slave */


/* RTOS header files */
#include <ti/sysbios/BIOS.h>

#include <ti/drivers/Board.h>
#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>

/* POSIX Header files */
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>

/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/SPI.h>
#include <ti/display/Display.h>

/* Driver configuration */
#include "ti_drivers_config.h"

#define THREADSTACKSIZE (1024)

#define SPI_MSG_LENGTH  (30)
#define SLAVE_MSG       ("Hello from Slave, msg#: ")

#define MAX_LOOP        (10)

static Display_Handle display;
bool transferStatus;
sem_t slaveSem;
unsigned char slaveRxBuffer[SPI_MSG_LENGTH];
unsigned char slaveTxBuffer[SPI_MSG_LENGTH];

void transferCompleteFxn(SPI_Handle handle, SPI_Transaction *transaction);

void main(void)
{

    SPI_Handle      slaveSpi;
    SPI_Params      spiParams;
    SPI_Transaction transaction;
    uint32_t        i;
    bool            transferOK;
    int32_t         status;

    Board_init();
    Display_init();
    GPIO_init();
    SPI_init();

    display = Display_open(Display_Type_UART, NULL);
    if (display == NULL) {
        /* Failed to open display driver */
        while (1);
    }
    Display_printf(display, 0, 0, "Starting the SPI slave example");


    GPIO_setConfig(CONFIG_SPI_SLAVE_READY, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
    GPIO_setConfig(CONFIG_SPI_MASTER_READY, GPIO_CFG_INPUT);

    /*
     * Handshake - Set CONFIG_SPI_SLAVE_READY high to indicate slave is ready
     * to run.  Wait for CONFIG_SPI_MASTER_READY to be high.
     */
    GPIO_write(CONFIG_SPI_SLAVE_READY, 1);
    while (GPIO_read(CONFIG_SPI_MASTER_READY) == 0) {}
    Display_printf(display, 0, 0, "Handshake done !!");

    status = sem_init(&slaveSem, 0, 0);
    if (status != 0) {
        Display_printf(display, 0, 0, "Error creating slaveSem\n");

        while(1);
    }

    SPI_Params_init(&spiParams);
    spiParams.frameFormat = SPI_POL1_PHA0;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    spiParams.transferMode = SPI_MODE_CALLBACK;

    slaveSpi = SPI_open(CONFIG_SPI_SLAVE, &spiParams);
    if (slaveSpi == NULL) {
        Display_printf(display, 0, 0, "Error initializing slave SPI\n");
        while (1);
    }
    else {
        Display_printf(display, 0, 0, "Slave SPI initialized\n");
    }

    /* Copy message to transmit buffer */
    //strncpy((char *) slaveTxBuffer, SLAVE_MSG, SPI_MSG_LENGTH);

    for (i = 0; i < MAX_LOOP; i++) {
            /* Initialize slave SPI transaction structure */
           //slaveTxBuffer[sizeof(SLAVE_MSG) - 1] = (i % 10) + '0';
            memset((void *) slaveRxBuffer, 0, SPI_MSG_LENGTH);
            transaction.count = SPI_MSG_LENGTH;
            //transaction.txBuf = (void *) slaveTxBuffer;
            transaction.rxBuf = (void *) slaveRxBuffer;

            /* Toggle on user LED, indicating a SPI transfer is in progress */
             GPIO_toggle(CONFIG_GPIO_LED_1);

            /*
             * Setup SPI transfer; CONFIG_SPI_SLAVE_READY will be set to notify
             * master the slave is ready.
             */
            transferOK = SPI_transfer(slaveSpi, &transaction);
            if (transferOK) {
                Display_printf(display, 0, 0, "Transfer OK : Ready to receive ");
                GPIO_write(CONFIG_SPI_SLAVE_READY, 0);

                Display_printf(display, 0, 0, "sem_wait");
                sem_wait(&slaveSem);
                // callback function will be called

                GPIO_write(CONFIG_SPI_SLAVE_READY, 1);

                if (transferStatus == false) {
                    Display_printf(display, 0, 0, "SPI transfer failed!");
                }
                else {
                    Display_printf(display, 0, 0, "Slave received: %s",
                            slaveRxBuffer);
                }
            }
            else {
                Display_printf(display, 0, 0, "Unsuccessful slave SPI transfer");
            }

    }
        SPI_close(slaveSpi);

        /* Example complete - set pins to a known state */
        GPIO_setConfig(CONFIG_SPI_MASTER_READY, GPIO_CFG_OUTPUT | GPIO_CFG_OUT_LOW);
        GPIO_write(CONFIG_SPI_SLAVE_READY, 0);

        Display_printf(display, 0, 0, "\nDone");

        return (NULL);
}

void transferCompleteFxn(SPI_Handle handle, SPI_Transaction *transaction)
{
    Display_printf(display, 0, 0, "callback fcn called : sem_post");

    if (transaction->status != SPI_TRANSFER_COMPLETED) {
        transferStatus = false;
    }
    else {
        transferStatus = true;
    }
    sem_post(&slaveSem);

}

/*MSP430FR5969 as a Master */



#include "driverlib.h"
#include <msp430.h>
int i,j;
char packet[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x7, 0x08, 0x09, 0x0A, 0x0B , 0x0C, 0x0D, 0x0E, 0x0F};
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    FRCTL0 = FRCTLPW | NWAITS_1;
    PM5CTL0 &= ~LOCKLPM5;       // take out GPIO from LPM
    // ----- Setup Button and LED
    P1DIR |= BIT0;      //P1.0 is set as output
    P1OUT &= ~BIT0;     //P1.0 is set at LOW

    P4DIR |= BIT6;      //P4.6 is set as output
    P4OUT &= ~BIT6;     //P4.6 is set at LOW

    P1REN |= BIT1;      //Internal Resistor enable @ P1.1
    P1OUT |= BIT1;      //Pull Up Resistor
    P1IE  |= BIT1;      //Interrupt Enabled
    P1IFG &= ~BIT1;     //Interrupt Flag cleared
    P1IES |= BIT1;      //Interrupt Edge Selection HtoL

    P1DIR |= BIT4;      //P1.4 is set as output
    P1OUT &= ~BIT4;     //P1.4 is set at LOW

    /*    P3DIR &= ~BIT4;      //P3.4 is set as input
    P3REN |= BIT4;      //Internal Resistor enable @ P3.4
    P3OUT |= BIT4;      //Pull Up Resistor
    P3IE  |= BIT4;      //Interrupt Enabled
    P3IFG &= ~BIT4;     //Interrupt Flag cleared
    P3IES &= ~BIT4;      //Interrupt Edge Selection LtoH
*/
    GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P3,GPIO_PIN4);
    GPIO_enableInterrupt(GPIO_PORT_P3,GPIO_PIN4);  //Interrupt Enabled.
    GPIO_clearInterrupt(GPIO_PORT_P3,GPIO_PIN4);  //Interrupt Cleared.
    GPIO_selectInterruptEdge(GPIO_PORT_P3,GPIO_PIN4,GPIO_HIGH_TO_LOW_TRANSITION);  //Interrupt Edge Selection HtoL

    // ----- Setup Clock
    CSCTL0 = CSKEY;             //CSKEY password. Must always be written with A5h
    CSCTL1 = DCORSEL  ;         //DCO range select
    CSCTL1 = DCOFSEL_0;         //DCO frequency select
    CSCTL2 = SELS__DCOCLK  ;    //Selects the SMCLK source
    CSCTL3 = DIVS__1   ;        // SMCLK Source Divider f(SMCLK)/1
    CSCTL0_H = 0;

    // ----- Setup SPI
    UCB0CTLW0 |= UCSWRST ;   // Unlock software reset

    UCB0CTLW0 |=UCSTEM ;
    UCB0CTLW0 |= UCSSEL__SMCLK; // SMCLK as clock source
    UCB0CTLW0 |= UCSYNC;        // Synchronous - SPI Mode
    UCB0CTLW0 |= UCMODE_2;      //
    UCB0CTLW0 |= UCMST;         // SPI Master Mode
    UCB0CTLW0 &= ~UC7BIT;       // 8 BIT Mode
    UCB0CTLW0 |= UCMSB;         // MSB First
    UCB0CTLW0 |= UCCKPL;        // Clock Polarity = 1
    UCB0CTLW0 &= ~ UCCKPH;      // Clock Phase = 0
    UCB0BRW = 0x0010;           // SMCLK/10

    P1SEL1 |= BIT6;             // P1.6 as MOSI Pin
    P1SEL0 &= ~BIT6;

    P1SEL1 |= BIT7;             // P1.7 as MISO Pin
    P1SEL0 &= ~BIT7;

    P2SEL1 |= BIT2;             // P2.2 as SCLK Pin
    P2SEL0 &= ~BIT2;

    UCB0CTLW0 &= ~UCSWRST ;     // Lock software reset

    UCB0IE |= UCTXIE;           // Transmit interrupt enable
    UCB0IFG &= ~UCTXIFG;        // Clear Transmit interrupt flag
    UCB0IE |= UCRXIE;           // Transmit interrupt enable
    UCB0IFG &= ~UCRXIFG;        // Clear Transmit interrupt flag


    while(!(GPIO_getInputPinValue(GPIO_PORT_P3,GPIO_PIN4))){}
    GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN4);

    GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);  //LED
    // Handshake done


    __enable_interrupt();
    while(1){}

}


#pragma vector = PORT3_VECTOR
__interrupt void PORT_3(void){

 // Slave is ready for transfer (wait for low)

        UCB0TXBUF = packet[i] ;
        i++;

        P1OUT ^= BIT0;       //Toggle the output @ P1.0 (transfer completed)

    P3IFG &= ~BIT4;      //Interrupt Flag cleared
}

结果-  

开始 SPI 从器件示例

握手完成!!

从器件 SPI 已初始化


传输正常:准备接收

SEM_WAIT

SPI 传输失败!

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败

从器件 SPI 传输失败


完成

此致-

Tushar Rathore  

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

    您好、Tushar、

    我已将此主题指派给我们的主题专家、并将很快返回给您。

    谢谢、此致、

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

    好的,我在等回复!!!

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

    您好、Tushar、

    我想确认一下、您已经尝试了 SPI 主设备和 SPI 从设备演示、并且能够在它们之间进行通信。 如果不是、我建议将其作为下一步。 SPISlave MSP432 SPIMaster 的调试功能

    此致、

    Rogelio

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

    你好 Rogelio

    [引用 userid="525828" URL"~/support/wireless-connectivity/wi-fi-group/wi-fi-fi-fi-forum/1118389/launchxl-cc3235s-spi-connection-between -msp430fr5969-and-cc3235s/4147019#4147019"]我已尝试在 SPI 主站之间进行通信并确认这些主站/从站之间进行了通信。]

    是的、我已经使用两个"CC3235S" Launchpad 尝试了 SPI 主设备和从设备演示。

    但是、现在我正在尝试 在 MSP430FR5969  和 CC3235S 之间进行通信。

    对于 CC3235S、我使用了 TI-RTOS 和 Pthread、而对于 MSP430FR5969、我刚刚使用了寄存器级编程。

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

    您好、Tushar、

     使用您已编写的 CC3235S 代码在 MSP430上运行以下演示(链接)。 让我知道输出是什么。

    *请注意、演示使用 eUSCI_A SO 引脚(2.0、2.1和1.5)

    -Rogelio

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

    你好、Rogelio

    您能否解释一下如何在此处使用 RX/TX 中断在  代码末尾接收和发送数据。

    我无法清楚地了解这一点

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

    您好、Tushar、

    我建议阅读 《MSP430用户指南》的第31节、尤其是第31.3.3节和第31.3.8节

    这些中断用于确保在对缓冲区进行写入之前正确读取数据。

    BR、

    Rogelio