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.

[参考译文] CC2652RB:在低优先级任务中运行 SPI 传输可能会导致任务卡住。

Guru**** 2539160 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1137660/cc2652rb-running-spi-transfers-in-low-priority-tasks-can-cause-tasks-stuck

器件型号:CC2652RB
Thread 中讨论的其他器件:SysConfig

大家好、

以下是客户的请求:

使用 SPI_TRANSFCTION 进行传输并使用块模式时、将调用 SPICC26X2DMA_TRANSFCTION、并最终停留在 spiPollingTransfer 中。  然后调试该函数并发现它卡在 SSIDataGet 中。 应该是 SSIDataGet 在轮询状态时被高优先级任务中断。

如何处理?

您可以帮助检查此案例吗? 谢谢。

此致、                                                        

Nick  

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

    您好、Nick、

    他们是否使用 TI 驱动程序 SPI 示例进行评估、是否可以共享他们正在评估的 SDK 版本?  SPI_TRANSFS_TRANSFS_Tfer 经常卡滞并尝试回调模式?  他们能否共享 SPI 初始化、SysConfig 模块和 SPI 用法的代码摘录?

    此致、
    Ryan

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

    这是 SPI 初始化  

    static void stamp_SpiInit(void)
    {
      GPIO_write(CONFIG_GPIO_SPI_0_CS, 0);
      CPUdelay(480);
      GPIO_write(CONFIG_GPIO_SPI_0_CS, 1);
      SPI_Params spiParam;
      SPI_Params_init(&spiParam);
      SPI_init();
      spiHandle = SPI_open(SPI_0, &spiParam);
    }

    这是 SPI 的工作状态

    bool xpt2046_StampXYZZ(xpt2046_data_t *pData)
    {
      bool ret;
      uint8_t wBuf[9] = {ADC_REG_X,0x00,ADC_REG_Y,0x00,ADC_REG_Z1,0x00,ADC_REG_Z2,0x00,0x00};
      uint8_t rBuf[9] = {0,0,0,0,0,0,0,0,0};
      uint16_t tmp;
      
      SPI_Transaction masterTransaction;
      memset(&masterTransaction, 0, sizeof(SPI_Transaction));
      masterTransaction.rxBuf = rBuf;
      masterTransaction.txBuf = wBuf;
      masterTransaction.count = 9;
      
      GPIO_write(CONFIG_GPIO_SPI_0_CS, 0);
      ret = SPI_transfer(spiHandle, &masterTransaction);
      GPIO_write(CONFIG_GPIO_SPI_0_CS, 1);
      
      tmp = BUILD_UINT16(rBuf[2], rBuf[1]);
      tmp >>= 3;
      pData->x = tmp;
      tmp = BUILD_UINT16(rBuf[4], rBuf[3]);
      tmp >>= 3;
      pData->y = tmp;
      tmp = BUILD_UINT16(rBuf[6], rBuf[5]);
      tmp >>= 3;
      pData->z1 = tmp;
      tmp = BUILD_UINT16(rBuf[8], rBuf[7]);
      tmp >>= 3;
      pData->z2 = tmp;  
      return ret;
    }
    
    
    static void stamp_loop(void)
    {
      while(1)
      {
        StampTick ++;
        Task_sleep(100);
        xpt2046_data_t xptData;
        xpt2046_StampXYZZ(&xptData);
        if((xptData.x != 0) && (xptData.y != 0x0FFF))
        {
    
    .....
    
    
        }
      }
    }
    
    
    
    

    这是 SPI SysConfig

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

    谢谢 Aries。  下面是 SPI TI 驱动程序运行时 APIspimaster 示例。  您是否还在该项目中使用射频堆栈?  SPI 函数在错误发生前多久挂起一次、您是否能够成功发送/接收任何字节?  以下是一些建议:

    • 在 SPI_Params_init 之前调用 SPI_Init
    • 确认 xpt2046支持 SPI_POL0_PHA0 SPI_Params.frameFormat 或进行相应修改
    • 如果使用 LaunchPad、请确保禁用具有 Board_shutdownExtFlash 的板载 MX25R8035F SPI 闪存、并确保 Board_EXT_FLASH_SPI_CS 保持高电平以保持器件禁用。
    • 使用示波器或逻辑分析仪监控 SPI 线路、以进一步确定 SPI 事务的保存位置。

    此致、
    Ryan

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

    1、SPI_Init 已被调用

    2、xpt2046在 POL0_PHA0模式下工作。

    3、MX25R8035的 CS 引脚保持高电平。

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

    您是否能够在 spimaster 示例项目中重现此问题?  每次调用 SPI_transfer 时是否都会发生此行为、如果不是、则是否可以使用 SPI_Params.transferTimeout 退出 以恢复?

    此致、
    Ryan

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

    我已经尝试在我的 IAR 项目中添加"SPICC26X2DMA.c"、并在"SPICC26X2DMA_transfer"中的"spiPollingTransfer (object、hwAttrs、transaction)"之后执行"HwP_RESTORE (key)"、"SPI_transfer  "不会卡住。

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

    如果在"spiPollingTransfer (object、hwAttrs、transaction)"之前执行了"Hwip_restore (key)"、 则较  高优先级的任务将占用 SPI_transfer

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

    感谢您的详细信息、我将把此内容转交给 TI 驱动程序开发团队。  您还可以考虑围绕 SPI_TRANSFTION 创建关键段 或评估 SPI_MODE_CALLACK。

    此致、
    Ryan