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.

CC2640中:如何配置SPI的片选线,使其在低电平时传输多个字节?

Other Parts Discussed in Thread: CC2640, LAUNCHXL-CC2640R2

当我使用CC2640的SPI发送数据时,发现每发送一个字节,SPI的片选线就会出现一次上升沿。但是我传输的每一帧,都包含多个字节,这就导致SPI的片选线出现多个上升沿。如何配置SPI的片选线,使其能够在低电平时传输多个字节?

1、我的SPI的配置,CC2640配置为master模式。我的全部代码可从附件中下载。

(1)SPI的管脚配置

#define CC2640R2_LAUNCHXL_SPI0_MISO             IOID_6          /* RF1.20 */
#define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_7          /* RF1.18 */
#define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_10         /* RF1.16 */
#define CC2640R2_LAUNCHXL_SPI0_CSN              IOID_20 //PIN_UNASSIGNED

const PIN_Config BoardGpioInitTable[] = {

    CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
    CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
    CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
    CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
    //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
    CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
    /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/
    CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
    /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/                    /* UART TX via debugger back channel */

    CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
    CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
    CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
    CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,

    /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/
	/*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/

    PIN_TERMINATE
};

(2)SPI的函数配置

SPI_Handle handle;
SPI_Params params;

uint8_t txBuffer[]  = { 0x5A ,0x5A ,0xA5 ,0xA5 ,0x01 ,0xFF ,0x00 ,0x16 ,0x33 ,0x44 ,
                        0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 ,
                        0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 ,0x55 ,0x66 ,0x33 ,0x44 ,
                        0x00 ,0xDB};


static void Spi_task_init(void)
{
    SPI_init();  // Initialize the SPI driver
    // Init SPI and specify non-default parameters
    SPI_Params_init(&params);

    params.bitRate     = 1000000;
    params.dataSize    = 8;       // 8-bit data size
    params.frameFormat = SPI_POL0_PHA0;
    params.mode        = SPI_MASTER;
    params.transferMode= SPI_MODE_BLOCKING;


    // Configure the transaction
    transaction.count = sizeof(signature);
    transaction.txBuf = (void *)signature;
    transaction.rxBuf = NULL;

    // Open the SPI and perform the transfer
    handle = SPI_open(Board_SPI0, &params);


}

uint8_t SPI_transfer_frame_write(SPI_Handle handle, SPI_Transaction *transaction,uint8_t *buffer, size_t size)
{
    uint8_t uint8t_ret = 0;
    bool bool_ret = true;

    transaction->count = size;
    transaction->txBuf = buffer;
    transaction->rxBuf = NULL;

    bool_ret = SPI_transfer(handle, transaction);
    if(bool_ret == true)
    {
        uint8t_ret = 1;
    }
    else
    {
        uint8t_ret = 0;
    }

    return uint8t_ret;

}

static void Spi_taskFxn(UArg a0, UArg a1)
{
  Spi_task_init();

  SPI_transfer_frame_write(handle, &transaction,txBuffer, 32);
}

2、我传输一帧数据的波形图,如图1所示。每一个字节对应一个上升沿。

图1

3、我想实现的波形图,如图2所示。每一帧数据对应一个上升沿。

图2

4、附件
(1)SPI MASTER的源代码可在这里下载:

source_code.rar

(3)simplelink_cc2640r2_sdk_1_40_00_45 可从如下路径下载:

(4)CC2640R2 launchpad 可从这里购买:

5、我的开发环境
CCS:Code Composer Studio 7.2.0
SDK:simplelink_cc2640r2_sdk_1_40_00_45
hardware:CC26640R2 launchpad develop kit
VS: Microsoft Visual C++ 2010 Express
系统:win7 64 位

  • Hi Heng,

    这个时候你需要在代码里面自己去控制SPI的CS引脚。

    要实现自己控制,你需要:

    1. 在你的代码里面我看到CSN引脚是定义为IOID_20. 你需要把它改成PIN_UNASSIGNED。在这个配置下这个CSN引脚就会一直为低。

    2.在你的APP层代码里面自己初始化IOID_20, 打开这个PIN得到这个PIN的handle,然后从APP层自己控制它。比如:

    定义:

    static PIN_Config BoardCSPinTable[] =
    {
        Board_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MIN,
        PIN_TERMINATE
    };

    初始化:

        hCSPin = PIN_open(&pinCSState, BoardCSPinTable);
        if (hCSPin == NULL)
        {
            return false;
        }

    调用:

    PIN_setOutputValue(hCSPin,Board_CS,Board_FLASH_CS_ON);

    Best Regards,

    Barbara

  • 非常感谢你的建议!
    但是按照你的建议,无法发送数据。请问还有没有别的办法?

    1、根据你的建议做的代码的修改
    (1)更改IO口的配置

    #define CC2640R2_LAUNCHXL_SPI0_MISO             IOID_6          /* RF1.20 */
    #define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_7          /* RF1.18 */
    #define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_10         /* RF1.16 */
    #define CC2640R2_LAUNCHXL_SPI0_CSN              PIN_UNASSIGNED//IOID_20
    #define CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL       IOID_20

    (2)在spi_task.c中添加IO口的调用函数

    #include <ti/drivers/PIN.h>
    #include <ti/drivers/pin/PINCC26XX.h>
    
    PIN_Handle hPins;
    PIN_Handle hButtons;
    
    PIN_Config SPI_CSN_PinTable[] = {
        CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,
        PIN_TERMINATE
    };
    
    static void Spi_task_init(void)
    {
        SPI_init();  // Initialize the SPI driver
        // Init SPI and specify non-default parameters
        SPI_Params_init(&params);
    
        params.bitRate     = 1000000;
        params.dataSize    = 8;       // 8-bit data size
        params.frameFormat = SPI_POL0_PHA0;
        params.mode        = SPI_MASTER;
        params.transferMode= SPI_MODE_BLOCKING;
    
        // Configure the transaction
        transaction.count = sizeof(signature);
        transaction.txBuf = (void *)signature;
        transaction.rxBuf = NULL;
        transaction.arg   = NULL;
    
        // Open the SPI and perform the transfer
        handle = SPI_open(Board_SPI0, &params);
    
        interrupt_event_init();
        mcu_msg_fifo_init();
    
        PIN_init(SPI_CSN_PinTable);
        hPins = PIN_open(&SPI_CSN_PinState, SPI_CSN_PinTable);
    
    }

    (3)在SPI发送函数中,添加片选信号的拉低和拉高

    uint8_t SPI_transfer_frame_write(PIN_Handle pin_handle,SPI_Handle handle,
                                     SPI_Transaction *transaction,uint8_t *buffer, size_t size)
    {
        uint8_t uint8t_ret = 0;
        bool bool_ret = true;
    
        transaction->count = size;
        transaction->txBuf = buffer;
        transaction->rxBuf = NULL;
    
        PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 0);
        delay_us(1);
    
        bool_ret = SPI_transfer(handle, transaction);
        if(bool_ret == true)
        {
            uint8t_ret = 1;
        }
        else
        {
            uint8t_ret = 0;
        }
    
        PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 1);
        delay_us(1);
    
        return uint8t_ret;
    
    }
    
    static void Spi_taskFxn(UArg a0, UArg a1)
    {
      Spi_task_init();
    
      //SPI_transfer_frame_write(handle, &transaction,txBuffer, 32);
      SPI_transfer_frame_write(hPins,handle, &transaction,signature, 51);
    
    }

    2、运行程序后,发现CC2640无法发送数据。如图1所示。发送失败的原因是片选信号拉低之后,CLK依旧保持高电平。

    3、调整片选信号拉低和拉高后的延时时间,无论使用delay_us(1)还是delay_us(2),都会发送失败

    请问还有没有别的方法?

  • Hi Heng,

    这个方法是我验证过的方法,我使用这个方法和外部SPI slave设备通信成功。

    我看到你的CC2640是做SPI master。所以clock应该是从CC2640出的。这个PIN脚的修改应该不会影响到clock PIN脚的表现, 在代码里面,整个流程应该是没有什么问题。

    唯一就是在操作CS PIN脚之后,你调用了delay_us(1) 函数。 这个函数不需要调用的,麻烦你把这个去掉试一下。

    Best Regards,

    Barbara

  • 问题已经解决。

    解决方法就是删除Spi_task_init(void)函数中的PIN_init(SPI_CSN_PinTable),同时删除delay_us()函数

    1、由于PIN_init()函数的调用时间是“Must be called early in the boot sequence to ensure that I/O pins have safe configurations.”,如图1所示,因此我不可以在Spi_task_init(void)函数中调用PIN_init(SPI_CSN_PinTable)。只需要调用PIN_open(&SPI_CSN_PinState, SPI_CSN_PinTable)即可。

    2、删除PIN_init(SPI_CSN_PinTable)后,Spi_task_init(void)的正确写法如下

    static void Spi_task_init(void)
    {
        SPI_init();  // Initialize the SPI driver
        // Init SPI and specify non-default parameters
        SPI_Params_init(&params);
    
        params.bitRate     = 1000000;
        params.dataSize    = 8;            // 8-bit data size
        params.frameFormat = SPI_POL0_PHA0;
        params.mode        = SPI_MASTER;
        params.transferMode= SPI_MODE_BLOCKING;
    
        // Configure the transaction
        transaction.count = sizeof(signature);
        transaction.txBuf = (void *)signature;
        transaction.rxBuf = NULL;
        transaction.arg   = NULL;
    
        // Open the SPI and perform the transfer
        handle = SPI_open(Board_SPI0, &params);
    
        hPins = PIN_open(&SPI_CSN_PinState, SPI_CSN_PinTable);
    
        interrupt_event_init();
        mcu_msg_fifo_init();
    }

    3、删除delay_us()函数。SPI_transfer_frame_write()的正确写法如下

    uint8_t SPI_transfer_frame_write(PIN_Handle pin_handle,SPI_Handle handle,SPI_Transaction *transaction,uint8_t *buffer, size_t size)
    {
        uint8_t uint8t_ret = 0;
        bool bool_ret = true;
    
        transaction->count = size;
        transaction->txBuf = buffer;
        transaction->rxBuf = NULL;
    
        PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 0);
    
        bool_ret = SPI_transfer(handle, transaction);
        if(bool_ret == true)
        {
            uint8t_ret = 1;
        }
        else
        {
            uint8t_ret = 0;
        }
    
        PIN_setOutputValue(pin_handle, CC2640R2_LAUNCHXL_SPI0_CSN_MANUAL, 1);
    
        return uint8t_ret;
    
    }

    4、逻辑分析仪的截图如图2所示

  • 我已经将master配置成功,但是slave配置失败,导致SPI通信失败

    参照上述帖子中的内容,成功配置master。但是slave的片选管脚该如何配置?

    1、slave节点的配置代码如下所示
    (1)slave节点的片选信号设为IOID-20

    #define CC2640R2_LAUNCHXL_SPI0_MISO             IOID_6          /* RF1.20 */
    #define CC2640R2_LAUNCHXL_SPI0_MOSI             IOID_7          /* RF1.18 */
    #define CC2640R2_LAUNCHXL_SPI0_CLK              IOID_10         /* RF1.16 */
    #define CC2640R2_LAUNCHXL_SPI0_CSN              IOID_20

    (2)在IO口的初始化列表中初始化slave节点的IO口

    const PIN_Config BoardGpioInitTable[] = {
    
        CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
        CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
        /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/
        CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
        /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/                    /* UART TX via debugger back channel */
    
        CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
        CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,
    
        /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/
    	/*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/
    
        PIN_TERMINATE
    };

    2、slave节点的SPI初始化函数如下所示

    static void Spi_task_init(void)
    {
        SPI_init();  // Initialize the SPI driver
        // Init SPI and specify non-default parameters
        SPI_Params_init(&params);
    
        params.bitRate     = 1000000;
        params.dataSize    = 8;       // 8-bit data size
        params.frameFormat = SPI_POL0_PHA0;
        params.mode        = SPI_SLAVE;
        params.transferMode= SPI_MODE_BLOCKING;
    
        // Configure the transaction
        transaction.count = sizeof(signature);
        transaction.txBuf = (void *)signature;
        transaction.rxBuf = NULL;
    
        // Open the SPI and perform the transfer
        handle = SPI_open(Board_SPI0, &params);  
       
    }

    3、slave节点的SPI接收函数如下所示

    uint8_t frame_total_dummy[32]  = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                                       0x00,0x00};
    
    uint8_t SPI_transfer_frame_read_head(SPI_Handle handle, SPI_Transaction *transaction)
    {
        uint8_t uint8t_ret = 0;
        bool bool_ret = true;
    
        transaction->count = 8;
        transaction->rxBuf = &frame_total_dummy[0];
        transaction->txBuf = NULL;
    
        bool_ret = SPI_transfer(handle, transaction);
        if(bool_ret == false)
        {
            return 0;
        }
    
        /*帧头长度为8,帧尾长度为数据域长度加上校验域长度*/
        uint8t_ret = frame_total_dummy[7]+2;
    
        return uint8t_ret;
    }

    4、当master节点发送一帧数据后,slave节点仅能接收到第一个字节,然后CC2640就处于block状态,且蓝牙广播信号消失。master节点发送的一帧数据如图1所示

  • Hi Heng,

    我看了一下代码,感觉这两个地方配错了

    CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,

    这个应该是output

    CC2640R2_LAUNCHXL_SPI0_CSN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,

    这个应该是Input

     

  • 重新配置CC2640R2_LAUNCHXL_SPI0_CSN,将其配置为输入模式,SPI通信依旧失败。

    CC2640R2_LAUNCHXL_SPI0_CSN的配置代码如下所示:

    const PIN_Config BoardGpioInitTable[] = {
    
        CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
        CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
        /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/
        CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
        /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/                    /* UART TX via debugger back channel */
    
        CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
        CC2640R2_LAUNCHXL_SPI0_CSN | PIN_BM_INPUT_EN | PIN_PULLDOWN,
    
        /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/
    	/*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/
    
        PIN_TERMINATE
    };

  • 将MISO和CSN管脚都更改后,依旧通信失败。slave节点还是只能接收到第一个字节。代码配置如下:

    const PIN_Config BoardGpioInitTable[] = {
    
        CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        //CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
        CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
        /*-----当不使用UART时,应该将UART TX拉低,避免漏电 -----*/
        CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
        /*CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,*/                    /* UART TX via debugger back channel */
    
        CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        CC2640R2_LAUNCHXL_SPI0_MISO | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL,                       /* SPI master in - slave out */
        CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
        CC2640R2_LAUNCHXL_SPI0_CSN | PIN_BM_INPUT_EN | PIN_PULLDOWN,
    
        /*-----这里的配置是多余的,在ccfg.c中配置bootloader back door就足够 -----*/
    	/*BOOTLOADER_BACKDOOR | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH,*/
    
        PIN_TERMINATE
    };

  • 看起来没有问题, 唯一我能想到的原因,1. transaction->count = 8;

    transaction->rxBuf = &frame_total_dummy[0]; 这两个把长度写一样试试
    2. 不知道CSN脚的修改是不是对Slave有影响。
  • 可以咨询一下FAE
  • 时钟线需要上拉吗
  • 时钟线需要上拉吗
  • 时钟线不需要上拉
    时钟线初始化时使用如下代码:
    CC2640R2_LAUNCHXL_SPI0_CSN | PIN_BM_INPUT_EN | PIN_PULLDOWN,
  • 1、我将两个长度写成一致,SPI的从节点依旧只能接收到第一个字节
    2、CSN的管脚使用的是GIO-20,这个管脚是否不可以作为CSN管脚?


    3、当SPI MASTER发送数据,CSN管脚为低电平时只传输一个字节的数据,这种情况下SPI SLAVE就可以接收到全部的数据。因此,我推测,CC2640 的SPI的默认配置,就是CSN管脚为低电平时只传输一个字节的数据,多个字节的数据就需要多个低电平。请问这种推测是否正确?