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.

[参考译文] CC2640R2F:使用 SPI_MODE_CALLBACK 传输模式时未看到任何 RX 数据。

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1416689/cc2640r2f-not-seeing-any-rx-data-when-using-spi_mode_callback-transfermode

器件型号:CC2640R2F

工具与软件:

尊敬的社区:

我在定制设计中将 SPI0用于外部闪存。 当我使用 SPI_MODE_BLOCKING 作为传输模式时、工作状态非常好。 最近、我不得不在非阻塞模式下使用它、而我将传输模式更改为 SPI_MODE_CALLBACK。  

我的回调将针对每次传输进行调用、并且我看到事务状态正在变为 SPI_TRANSFER_COMPLETED。 传输计数也完全匹配。  但我在 Rx 缓冲区中看不到任何接收数据。  

以下是我的初始化和读取闪存 ID 例程、供您参考:

int smartMCT_SPI0Init(void)  // SPI0 init
{
//SPI0 init

    SPI_Params_init(&SbpSpiParams);
    SbpSpiParams.bitRate = 8000000;

    SbpSpiParams.transferMode =SPI_MODE_CALLBACK;
    SbpSpiParams.frameFormat = SPI_POL0_PHA0;
    SbpSpiParams.dataSize = 8;
    SbpSpiParams.transferCallbackFxn = wdt_spi_cb;
    SbpSpiHandle = SPI_open(MY_SPI0, &SbpSpiParams);
    if(SbpSpiHandle == NULL)
    {
        return -1;
    }
}

// Reading flash ID 
uint8 MH_SPIReadID(uint8 addr,uint8 *out)
{

     txbuf[0] = 0x9F; // read command 
     txbuf[1] = 0xFF;
     txbuf[2] = 0xFF;
     txbuf[3] = 0xFF;
     txbuf[4] = 0xFF;
     txbuf[5] = 0xFF;
     txbuf[6] = 0xFF;
     txbuf[7] = 0xFF;

     spiTransaction.arg = NULL;
     spiTransaction.count = 8;
     spiTransaction.txBuf = txbuf;
     spiTransaction.rxBuf = out;

     PIN_setOutputValue(myPins, MH_CS, 0);                              // /CS enable
     SPI_transfer(SbpSpiHandle, &spiTransaction);
     PIN_setOutputValue(myPins, MH_CS, 1);                           // /CS disable

     return 0;

}


 

我可能会做错什么? 在回调模式下接收数据有什么注意事项?  

好的

Lakshmi

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

    尊敬的社区:

    有人想看看这个问题吗? 我们必须进一步开展工作。

    提前感谢。

    好的

    Lakshmi

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

    你好 lakshmikanth satyavolu

    将 uint8 -> uint8_t (此处出现错误)。

    我对一些代码函数缺乏一点背景信息、您是否能够在空项目中运行某个版本的 SPI 代码? 这是为了确认没有其他配置导致该问题。  

    孤岛示例使用回调模式 SPI、此处应采用合适的资源。  

    谢谢!
    Alex F

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

    尊敬的 Alex F:

    感谢您的响应。  


    1) 1)我正在使用 simple_peripheral_cc2640r2lp_oad_onchip_app 作为参考。 我正在应用中测试回调模式 SPI (在 BLE 初始化之前)。 这就够了吗? 或者我是否应该仅使用没有 OAD 和堆栈的应用?  另外、阻塞模式运行良好。

    2) 2)另一个问题是、我想在回 调模式下(将来)在看门狗复位回调期间使用 SPI。 由于驱动程序文档不建议使用阻塞模式、因此我选择了 SPI 的回调模式。  如果我进行 SPI 事务、SPI 回调函数是否在看门狗复位回调上下文中工作?  

    提前感谢。

    好的

    Lakshmi

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

    你好  lakshmikanth satyavolu、

    1) 1)如果它在 BLE 堆栈之前、并且 SPI 引脚是空闲的、那么我们应该没问题、如果我们有问题、可以尝试其他方式。  

    我正在应用程序中测试回调模式 SPI (在 BLE 初始化之前)。 这是否足够?

    2) 2)有趣的问题、我们可以在看门狗期间摆脱 UDMA 事务(这是 SPI 在第12.3.4.2节中使用的东西)、但 SPI 回调是另一个中断、因此无论哪个被配置为更高优先级、都将关闭。  

    谢谢!
    Alex F

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

    您好、Alex、  

    [报价 userid="567427" url="~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1416689/cc2640r2f-not-seeing-any-rx-data-when-using-spi_mode_callback-transfermode/5431918 #5431918"]1)如果它在 BLE 堆栈之前、并且 SPI 引脚是空闲的、那么我们应该可以了、如果我们有问题的话我们可以试试另外一种方法。  [报价]

    您建议的另一种方法是什么? 我看到仅回调模式有问题。 SPI 事务在阻塞模式下完美工作。  

    当系统因未知原因挂起时、我打算将应用的一些配置参数和动态索引保存到外部闪存中。

    我正在寻找以下解决方案之一:-

    1) 1)将几个应用程序的 RAM 变量保存到外部闪存中、以便在 WDT 复位后检索它们。  

    2) 2)如果可以在 WDT 复位期间保留 RAM、也很好。 我已经阅读过 关于 TRM 中的 SRAM 保留的信息。 您可以告诉我、SDK 中有任何具有相同功能的示例吗?  

    3)我尝试使用 NVS 写入。 但如果使用 NVS API、应用程序的大小会增加到4KB、这种情况无法适应闪存。  

    非常感谢您的任何帮助。

    提前感谢。  

    好的

    Lakshmikanth。  

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

    你好  lakshmikanth satyavolu、

    1) 1)将几个应用程序的 RAM 变量保存到外部闪存中以在 WDT 复位后检索它们:  

    - SPI 或使用 memset 应该在这里工作(或 osal_snv_firte ),虽然回调不工作是奇怪的,因为阻塞工作,只是问,但断点集有什么行为?  

    2) 2)如果可以在 WDT 复位期间保留 RAM、也很好。 我已经阅读过 关于 TRM 中的 SRAM 保留的信息。 您可以告诉我、SDK 中有任何具有相同功能的示例吗?  

    -我想我们可以使用 SNV(简单的非易失性存储)这里,使用函数  OSAL_SNV_WRITE、  您可以在此处的 SDK 文档中查找更多详细信息/用例(BLE5-Stack 用户指南(TI.com))。

    3)

    -像上面让尝试 SNV 而不是!  

    谢谢!
    Alex F

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

    您好、Alex、

    感谢您引导我了解 API。 这对我来说很有用。

    好的

    Lakshmikanth