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.

[参考译文] CC1312R:使用 DMA 置为有效的 SPI 传输

Guru**** 2557100 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/977806/cc1312r-spi-transfer-using-dma-asserts

器件型号:CC1312R
Thread 中讨论的其他器件:SYSBIOS

您好!

使用 SimpleLink SDK 4.20、我的代码基于 TI 15.4传感器项目。

我执行一个新的 TIRTOS 任务、除其他外、定期启动 SPI 传输。 除了为 SPI 传输启用 DMA (需要 DMA 以实现更可预测的时序)外、一切似乎都正常。

启用 DMA 后、应用程序在这里的798行(Semaphore_pend 函数实际上返回 SemaphoreP_OK)置为有效、但单步执行该行不起作用、如果我暂停调试器、我位于 main 的主应用程序异常处理程序中。

感谢您提供故障排除方面的任何指导!

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

    在我的 cfg 中启用更多调试后、我看到断言位于 SYSBIOS/KNL 中 Semaphore.c 的第203行:

    为了使这项工作正常、我应该采取哪些不同的行动?

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

    您能否提供有关您所使用的驱动程序函数调用及其放置位置的信息、无论是对于正常情况还是不工作的情况、都是如此。

    最好的一点是、您可以生成一个触发相同错误的小型演示项目、以便我们可以在此处尝试重现任何问题。

    BR

    Siri

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

    您好、Siri、

    嗯,在这两个实例中,我都在执行 SPI_TRANSF()。 一个仅在使用 DMA 时不起作用、另一个正常工作。 它是一个在 tirtos 任务上下文中使用的小类。 相关位、您可能会觉得有些东西显然是错误的。 我正在努力创建一个尽可能简单的用例、以重现问题。

    专用:
    SPI_Transaction 事务;
    SPI_Params Parspiams;
    uint8_t spiIndex; 

    RGBLED::RGBLED (uint8_t 索引、uint16_t 计数){
    ledCount = count;
    spiIndex =索引;
    
    spi_init();
    
    SPI_Params_init (&spiParams);
    spiParams.bitrate = 2400000;
    spiParams.dataSize = 8;
    spiParams.frameFormat = SPI_POL0_PHA1;
    transaction.rxBuf =空;
    outputBuffer = new uint8_t[ledCount*9 + 480]();
    transaction.txBuf =(void *) outputBuffer;
    transaction.count = ledCount*9+480;
    }
    

    void RGBLED::output(){
    SPI_Handle SPI = SPI_OPEN (spiIndex、&spiParams);
    SPI_TRANSFCTION (SPI、事务);
    SPI_CLOSE (SPI);
    }
    

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

    不确定我是否理解。

    我认为 minDmaTransferSize 默认情况下= 10、这意味着您始终使用 DMA、因为您的事务计数始终大于10。

    正确、或者您是否使用不同的事务数和不同的 minDmaTransferSize 进行测试?

    此外、计数有多大?

    UDMA 控制器仅支持多达1024个数据帧的数据传输。 超过1024帧的传输将在1024大小的多个部分中发送/接收、直到发送/接收完所有数据

    您是否遇到了所有 transaction.count > minDmaTransferSize 的问题

    Siri

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

    您好、Siri、是的、我使用 minDmaTransferSize 来启用/禁用 DMA 传输。 计数大约为620字节。 是的、当 count > minDmaTransferSize 时会出现问题。  

    我已在应用程序中修改了一些逻辑。 最后、我认为传输发生在任务上下文之外(由于使用 C++和 C 包装程序函数进行回调)、从而导致问题。

    虽然我不能完全确定情况、但我想可以将其视为已解决。

    谢谢。