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.

[参考译文] CC3220S-LAUNCHXL:如何启用 SPI DMA?

Guru**** 2551600 points
Other Parts Discussed in Thread: CC3220S-LAUNCHXL, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/725014/cc3220s-launchxl-how-to-enable-spi-dma

器件型号:CC3220S-LAUNCHXL
Thread 中讨论的其他器件: CC3200

您好!

我正在将 CC3220S-LAUNCHXL 用于我的项目、在该项目中、我尝试通过 SPI 发送数据、还包括 DMA、以减少 CPU 开销并加快速度。 我已使用中断通过 SPI 成功发送和接收数据,但当我使用包括 DMA 在内的相同代码时,我遇到了一个问题。 我卡在 Hwi 中的 while 循环中。 我从我的角度尝试了所有东西、但我不知道问题是什么。

我还发现、cc3220 SDK 中没有 Udma_if.c、我可以在 cc3200 SDK 中看到它。

有人可以帮帮我吗?  

/*
*==== Hwi_exHandler ===
*
void Hwi_exHandler (UINT * exstack、UINT LR)

Hwi_module->exACTIVe[0]= true;

/*如果没有插入异常处理程序,请在此处旋转*/
while (Hwi_excHandlerFunc = NULL){

Hwi_exHandlerFunc (exstack、LR);

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

    如果您要在 CC3220上开始代码开发、强烈建议您使用 TI 驱动程序。 这是一组更高级别的驱动程序、涵盖了 CC3220上从 I2C 到 SPI 的所有硬件外设、并消除了在编写 DMA 和 driverlib 寄存器等方面您之前必须在 CC3200上执行的大量努力。

    对于 SPI 驱动器、TI 驱动程序实际上已默认使用 DMA 进行高效传输。 SDK 中的 spimaster 示例介绍了如何将 TI 驱动程序用于 SPI。 我建议您查看它以熟悉 TI 驱动程序的开发。

    如果您需要进一步的帮助、请告诉我。 您是否将现有 CC3200项目移植到 CC3220? 如果是这样、我建议您将 driverlib 移植到 TI 驱动程序、因为这样做可以在将来尝试调试时避免很多麻烦。

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

    您好、Michael、

    感谢你的答复。

    是的、我正在移植现有的 cc3200项目。

    在我的项目中、我尝试发送我 从 SPI (作为从器件)获取的接收数据。我想用我将从连接到传感器的 I2C 接收的数据标记它、最后我想通过 UDP 发送它。 UDP 器件可通过 cc3200驱动程序与 SPI 接收的数据正常工作。

    我尝试使用 CCS 中提供的 cc3220的 SPI 从站示例、但它不起作用。我对 cc3200的了解不多、因此我使用了它的库和项目、我从 SPI 接收到了正确的数据、但当我包含 DMA 时、我在前面提到的 while 循环中卡住了。 我理解这是因为我尝试为 cc3200中的 cc3220 (udma_if.c)使用错误的驱动程序、我还发现在 cc3220中、新驱动程序已包含在 SPICC32XXDMA 中。 您能帮助我了解一下我现在应该采取的应对上述情形的方法吗?

    此致、

    Nitin

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

    即使您要移植现有的 CC3200项目、我也强烈建议您使用 TI 驱动程序。 如果您仍然想将 DMA 集成到您拥有的 SPI driverlib 中、我建议您查看 SPICC32XXDMA.C 中的 SPI 驱动程序实现 通过查看 configDMA()和 spiHwiFxn(),您将了解如何设置 DMA 传输和处理 DMA 传输完成中断。 但是、简单了解如何使用 TI 驱动程序的更简单 API 要比尝试绕过头尝试使 DMA 与外设一起工作要简单得多。

    当您提到 CC3220 SDK 提供的 SPI 从站示例不起作用时、它到底是如何失败的? 如果需要、我可以帮助您在 SDK 示例中正确启动 SPI 并运行 SPI。

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

    您好、Michael、

    根据您的建议,我在我的项目中使用了 SPI 从站示例,它单独与 SPI 一起工作正常,但我所面临的问题是,当我尝试接收连续数据时, 因为它在接收到768字节的数据并进入我的第一个问题中提到的同一个 Hwi 中断后被停止。 我的意思是、我在连续循环中使用 SPI_TRANSFER 函数、同时通过 UDP 传输接收缓冲器数据、无论数据何时被填充。 可以帮我解决这个问题吗?

    此致、

    Nitin

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

    如果你不使用 UDP 发送 RX 数据、你是否仍然会在 Hwi 中结束呢?
    此外、您还提到、您最终在768个字节后进入 Hwi。 这是否一致? 传输在768字节后停止的根本原因不应是这样。 在您接收到的字节中、如果您检查 RX 缓冲区、它是否与您随 SPI 主器件发送的数据匹配?

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

    您好、Michael、
    我的连续性问题已解决、我之前使用 SPI_MODE_BLOCKING、但现在使用 SPI_MODE_CALLACK。 现在、我的问题是、我在从站端 cc3220 Rx 缓冲器中接收的数据大部分时间都是正确的、但有时它会被移位和反向数据、例如:

    情况1:已移位数据

    RX 的原始数据:0x1514 = 0001 0101 0001 0100
    接收到的数据:0x2A28 = 0010 1010 0010 1000

    案例2:反向数据

    RX 的原始数据:0x1514 = 0001 0101 0001 0100
    接收到的数据:0x5141 = 0101 0001 0100 0001

    案例3:已移位数据的反向

    RX 的原始数据:0x1514 = 0001 0101 0001 0100
    接收到的数据:0xA282 = 0101 0010 1000 0010

    您能帮我解决这个问题吗?


    此致、
    Nitin