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.

[参考译文] RTOS/CC2640R2F:当 SPI 已初始化时、应用程序无法建立连接

Guru**** 2551110 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/818976/rtos-cc2640r2f-app-fails-to-establish-connection-when-spi-has-been-initialised

器件型号:CC2640R2F

工具/软件:TI-RTOS

您好!

我在这里有一点问题。 我现在需要使用 SPI 来连接一些传感器。 如果我在任务的 main 中调用"spi_init()"、那么出于某种原因、应用程序(nRFConnect)无法与器件建立连接。 但是,当我删除 SPI_init()时,所有内容都开始正常工作。  

是否知道调用 SPI_init()可能导致什么问题?  

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

    尊敬的 Vinay:

    1.您使用的是 CC240R2 SDK 的哪个版本?

    2.您的项目基于什么示例项目?

    3. SPI 是在单独的任务中运行还是在应用任务中运行?

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

    您能否发布代码片段以便我们更好地为您提供帮助?  

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

    您好、Marie、

     simplelink_cc2640r2_sdk_2_40_00_32

    2.多角色

    3.除了本例中已经存在的任务外,我还创建了一个新任务,用于使用传感器控制器和处理一些其他与应用相关的函数。 因此、我在我创建的新任务中初始化 SPI、如下所示。

    静态空 AppTaskFxn (UArg a0、UArg A1)
    {
    /* IPC 的 Msg 对象*/
    MsgObj msgPktRec;
    grSigState_t grState = SIG_LOW;
    
    /*初始化传感器控制器*/
    AppInitSensorController();
    
    /*初始化 GPIO 模块*/
    GPIO_Init();
    //GPIO_SelectRelay (All_Relays);
    //GPI_TRIGGEROffAllRelays();
    
    /* Init Pkt */
    pkt_Init();
    
    /* Init SPI */
    SPI_Initialize();
    
    /* Init h/w 计时器*/
    //initHwTimer (TMR_A);
    
    while (1)
    {
    
    。}
    } 

    按照Christin 的要求、下面是我用来初始化和使用 SPI 的一些代码。

    引脚初始化

    GPIO_PinConfig gpioPinConfigs[]={
    /*输入引脚*/
    GPIOCC26XX_DIO_13 | GPIO_DO_NOT _CONFIG、/*保留*/
    GPIOCC26XX_DIO_14 | GPIO_DO_NOT _CONFIG、/* RED SIG 输入*
    
    GPIOCC26XX_DIO_15 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_MASTER_READY *
    GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、// CC2640R2_LAUNCHXL_SPI_SLAVE_READY *
    
    /*输出引脚*/
    GPIOCC26XX_DIO_07 | GPIO_DO_NOT _CONFIG、/* RELAY_1 */
    GPIOCC26XX_DIO_06 | GPIO_DO_NOT _CONFIG、/* RELAY_2 */
    //GPIOCC26XX_DIO_08 | GPIO_DO_NOT _CONFIG、/*继电器3 *
    //GPIOCC26XX_DIO_09 | GPIO_DO_NOT _CONFIG、//中继4 *
    GPIOCC26XX_DIO_30 | GPIO_DO_NOT _CONFIG、// TMP116_EN *
    
    /* SPI 闪存 CSn *
    GPIOCC26XX_DIO_20 | GPIO_DO_NOT _CONFIG、
    
    /* SD CS */
    GPIOCC26XX_DIO_21 | GPIO_DO_NOT _CONFIG、
    
    /* Sharp Display - GPIO 配置将在 Display 文件中完成*/
    GPIOCC26XX_DIO_24 | GPIO_DO_NOT _CONFIG、/* SPI 芯片选择*
    GPIOCC26XX_DIO_22 | GPIO_DO_NOT _CONFIG、/* LCD 电源控制*
    GPIOCC26XX_DIO_23 | GPIO_DO_NOT _CONFIG、/* LCD 使能*/
    //GPIOCC26XX_DIO_11 | GPIO_DO_NOT _CONFIG
    、};
    
    CONST PIN_Config BoardGpioInitTable[]={
    
    CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/
    CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、 /* LED 最初关闭*/ /*按钮为低电平有效*/
    CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_BM_迟滞、 /*按钮为低电平有效*/
    CC2640R2_LAUNCHXL_DIO15 | PIN_INPUT_EN | PIN_PULLUP|PIN_BM_迟滞、
    CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MIN、/*外部闪存芯片选择*
    CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN、 /*通过调试器反向通道的 UART RX */
    CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull、 /*通过调试器反向通道的 UART TX */
    //CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/
    //CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/
    CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输出-从器件输入*/
    CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 主器件输入-从器件输出*/
    CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN、 /* SPI 时钟*/
    
    PIN_TERMINATE
    };
    
    /* SPI */
    #define CC2640R2_LAUNCHXL_SPI_FLASH_CS ioID_20
    #define CC2640R2_LAUNCHXL_FLASH_CS_ON 0
    #define CC2640R2_LAUNCHXL_FLASH_OFF 1
    
    /* SPI 板*/
    #define CC2640R2_LAUNCHXL_SPI0_MISO ioID_8. /* RF1.20 */
    #define CC2640R2_LAUNCHXL_SPI0_MOSI ioID_9. /* RF1.18 */
    #define CC2640R2_LAUNCHXL_SPI0_CLK ioID_10 /* RF1.16 */
    #define CC2640R2_LAUNCHXL_SPI0_CSn ioID_11
    #define CC2640R2_LAUNCHXL_SPI1_MISO PIN_UNLOADed
    #define CC2640R2_LAUNCHXL_SPI1_MOSI PIN_UNLOADed
    #define CC2640R2_LAUNCHXL_SPI1_CLK 未分配引脚
    #define CC2640R2_LAUNCHXL_SPI1_CSn 未分配的 PIN_DELOADD/*
    
    !
    *@def CC2640R2_LAUNCHXL_GPIOName
    *@GPIO 名称的简短枚举
    */
    typedef enum CC2640R2_LAUNCHXL_GPIOName{
    CC2640R2_LAUNCHXL_GPIO_S1 = 0、 //绿色 SIG 输入
    CC2640R2_LAUNCHXL_GPIO_S2、 //红色 SIG 输入
    CC2640R2_LAUNCHXL_SPI_MASTER_READY、
    CC2640R2_LAUNCHXL_SPI_SLAVE_READY、
    CC2640R2_LAUNCHXL_GPIO_LED_GREEN、 // Relay_1
    CC2640R2_LAUNCHXL_GPIO_LED_RED、 // Relay_2
    CC2640R2_LAUNCHXL_GPIO_DIO_8、 // Relay_3
    CC2640R2_LAUNCHXL_GPIO_DIO_9、 // Relay_4
    CC2640R2_LAUNCHXL_GPIO_TMP116_EN、
    CC2640R2_LAUNCHXL_GPIO_SPI_FLASH_CS、
    CC2640R2_LAUNCHXL_SDSPI_CS、
    CC2640R2_LAUNCHXL_GPIO_LCD_CS、
    CC2640R2_LAUNCHXL_GPIO_LCD_POWER、
    CC2640R2_LAUNCHXL_GPIO_LCD_ENABLE、
    CC2640R2_LAUNCHXL_GPIOCOUNT、
    CC2640R2_LAUNCHXL_CS
    }CC2640R2_LAUNCHXL_GPIOName; 

    2. SPI 代码

    /* spiUser 静态 Lib 变量*/
    static SPI_Handle masterSpi;
    静态 SPI_Params Parspiams;
    

    /********
    *函数名称:SPI_Initialize
    *说明:Initialize the SPI bus
    * returns. :无
    *参数 :无
    /
    void SPI_Initialize (void)
    {
    spi_init();
    SPI_Params_init (&spiParams);
    SPI_InitParams (&spiParams、SPI_BIT_RATE、SPI_FRAME_SIZE、SPI_MODE_BLOCKING、SPI_MASTER、
    SPI_POL0_PHA0、NULL);
    masterSpi = SPI_open (Board_SPI_master、&spiParams);
    if (masterSpi ==空)
    {
    #ifdef ENABLE_DBG_UART
    display_print0 (dispHandle、30、0、"SPI Init failed!!!!");
    #endif
    }
    }
    
    /********
    *函数名称:SPI_InitParams
    *说明:初始化 I2C 实例对象
    *返回 :无
    *参数 @pidijPtr:ptr 至 SPI 对象
    * @比特率:总线速度
    * @txMode:执行模式
    * μ@模式:SPI 模式
    * @格式:帧格式
    * @SPI_CbFunc:回调函数
    ******** /
    void SPI_InitParams (SPI_Params * spiObjPtr、uint32_t 位速率、uint32_t dataSize、SPI_TransferMode txMode、
    SPI_Mode、SPI_FrameFormat、
    void (* SPI_CbFunc)(SPI_Handle、SPI_Transaction *事务)
    {
    spiObjPtr -> bitrate =比特率;
    spiObjPtr ->dataSize = dataSize;
    spiObjPtr -> transferMode = txMode;
    spiObjPtr -> mode = mode;
    spiObjPtr->frameFormat =格式;
    spiObjPTR->transferCallbackFxn = SPI_CbFunc;
    }
    

    - Vinay

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

    您好!

    我看到您正在使用阻塞模式、在本例中、任务 SPI 将等待、直到它在阻止其他任务的同时获得某些结果。

    我建议您查看我们的 simple_serial_socket 示例、尽管这些示例是针对 UART 设计的、但与 BLE 堆栈集成的概念是相同的。

    https://github.com/ti-simplelink/ble_examples/tree/simplelink_cc2640r2_sdk-2.20/examples/rtos/CC2640R2_LAUNCHXL/bleapps/simple_serial_socket_client

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

    尊敬的 Christin:

    我有一个问题, 如前面所述,即使只是调用 SPI_Init() API,也会导致在不执行任何事务的情况下出现此问题。

    当您说、SPI 将阻止、直到它返回某些内容、 我相信只有在执行传输时才有效。 但是、我不会对传输进行任何调用、我只是初始化 SPI 模块、我不确定这会如何阻止任务?

    无论采用哪种方式、我都将在明天尝试使用非阻塞回拨方法、并返回结果。

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

    尊敬的 Christin:

    我将 SPI 配置为非阻塞模式。 此问题似乎仍然存在、但这次连接确实会建立、然后应用程序会尝试发现服务(加载发现)一段时间、然后断开连接。 在负载发现期间、 以下是终端输出:

    0x546C0E9F02EC
    连接到1 maxNumBleConns 1
    非连接的广告开始了!!!

    参数更新0
    地址:0x57583209E1FB ConnHdl:0 ConnRole:0x04
    GATT 服务器/外设 Rx MTU 大小:65


    一段时间后、它会断开连接并低于我获得的输出。

    0x546C0E9F02EC
    连接到0
    可连接的广告开始了!!!

    已断开连接!
    地址:0x57583209E1FB ConnHdl:0 ConnRole:0x04
    GATT 服务器/外设 Rx MTU 大小:65

     

    一些代码供您参考、除了分配回调并更改为回调模式之外、没有重大更改、如下所示:

    /*
    === transferCompleteFxn ===
    * SPI_TRANSFCTION ()的回调函数。
    //
    void transferCompleteFxn (SPI_Handle handle、SPI_Transaction *事务)
    {
    /*不做任何事情*/
    }/********
    
    
    *函数名称:SPI_Initialize
    *说明:Initialize the SPI bus
    * returns. :无
    *参数 :无
    /
    void SPI_Initialize (void)
    {
    spi_init();
    SPI_Params_init (&spiParams);
    SPI_InitParams (&spiParams、SPI_bit_rate、SPI_frame_size、SPI_mode_callback、SPI_master、
    SPI_POL0_PHA0、CompletetransferFxn);
    masterSpi = SPI_open (Board_SPI_master、&spiParams);
    if (masterSpi ==空)
    {
    #ifdef ENABLE_DBG_UART
    log_info0 ("初始化主 SPI\r\n 时出错");
    #endif
    }
    }
    
    /********
    *函数名称:SPI_InitParams
    *说明:初始化 I2C 实例对象
    *返回 :无
    *参数 @pidijPtr:ptr 至 SPI 对象
    * @比特率:总线速度
    * @txMode:执行模式
    * μ@模式:SPI 模式
    * @格式:帧格式
    * @SPI_CbFunc:回调函数
    ******** /
    void SPI_InitParams (SPI_Params * spiObjPtr、uint32_t 位速率、uint32_t dataSize、SPI_TransferMode txMode、
    SPI_Mode、SPI_FrameFormat、
    void (* SPI_CbFunc)(SPI_Handle、SPI_Transaction *事务)
    {
    spiObjPtr -> bitrate =比特率;
    spiObjPtr ->dataSize = dataSize;
    spiObjPtr -> transferMode = txMode;
    spiObjPtr -> mode = mode;
    spiObjPtr->frameFormat =格式;
    spiObjPTR->transferCallbackFxn = SPI_CbFunc;
    }
    

    然后,我在 应用程序任务的 main 中调用了 SPI_Initialize()。 有什么见解吗?

     

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

    是否有关于此问题的任何更新?

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

    很抱歉、由于我过去两周都不上班、回复延迟。

    您的 AppTask 优先级是什么?  

    您能否添加可观察到的射频(LNA 和 PA)以进行调试? 并使用逻辑分析仪检查连接期间的 LNA、PA 和 SPI 引脚活动。

    http://dev.ti.com/tirex/content/simplelink_cc2640r2_sdk_3_20_00_21/docs/blestack/ble_user_guide/html/ble-stack-3.x-guide/debugging-index.html#debugging-rf-output

    您能否检查是否正在运行堆用尽? 如需更多信息、请参阅以下文档

    http://dev.ti.com/tirex/content/simplelink_cc2640r2_sdk_3_20_00_21/docs/blestack/ble_user_guide/html/ble-stack-3.x-guide/debugging-index.html#debugging-common-heap-issues

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

    我有两个具有相同优先级的应用任务、即1。 SPI 在其中一个任务中进行初始化。

    我一有时间就会听从您的建议、然后再接再回。 目前正在研究其他一些东西。

    谢谢、

    Vinay

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

    您好!

    请注意、如果您在1个月内未对此主题提供任何注释、该主题将被锁定。

    因此、如果您认为自己没有时间在1个月内处理它并提供更多信息、那么我想关闭此主题、然后您可以返回到此主题并提出相关问题。

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

    由于不活动而关闭线程。