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.

[参考译文] AM6442:CacheP_inv () 与 DMA SPI (MCSPI)—RX 缓冲区内容恢复/显示清除

Guru**** 2899250 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1632276/am6442-cachep_inv-with-dma-spi-mcspi-rx-buffer-contents-revert-appear-cleared

器件型号: AM6442
主题: SysConfig 中讨论的其他器件

您好:

我正在使用 MCU+ SDK 为客户提供 AM64x 支持、并想确认 SPI 接收缓冲区的建议缓存/DMA 处理。 客户看到缓存维护似乎影响接收缓冲区内容的意外行为。

环境:

  • CCS:20.3.0.14_1.9.0
  • 编译器:TI Clang v4.0.3.LTS
  • MCU+ SDK:mcu_plus_sdk_am64x_11_01_00_17

开发过程中使用/组合的示例项目:

  • UART:mcu_plus_sdk_am64x_11_01_00_17\examples\drivers\uart\uart_echo_callback\am64x-evm\r5fss0-0_nortos\ti-arm-clang
  • MCSPI:mcu_plus_sdk_am64x_11_01_00_17\examples\drivers\mcspi\mcspi_loopback\am64x-evm\r5fss0-0_nortos\ti-arm-clang  
  • OSPI:mcu_plus_sdk_am64x_11_01_00_17\examples\drivers\ospi\ospi_flash_io\am64x-evm\r5fss0-0_nortos\ti-arm-clang

问题/症状:

客户使用与 DMA 的 SPI 通信。 当他们为接收缓冲区区域调用 CacheP_inv() 时、接收缓冲区(例如 transaction->rxBuf)似乎被清除(数据变为 0x00)、并且/或者之后内容似乎意外恢复。 他们怀疑与 DMA 一起使用时缓存失效的时间/顺序可能不正确。 作为一种解决方法,他们当前在调用 CacheP_inv () 之前将接收到的数据复制到临时缓冲区(通过 memcpy )。

我想确认的是:

1) 对于 AM64x MCU+ SDK (R5F、NoRTOS)、建议用于基于 DMA 的 SPI 接收的高速缓存操作序列是什么?   -例如:我们是否应该对某些缓冲区使用 CacheP_wbInv () 与 CacheP_inv (),在哪个精确点与 DMA 开始/完成/ ISR 回调?

2) 是否预期 CacheP_inv() 可以使 RX 缓冲区显示为“已清除“、如果是、正确的解释是什么(过时的高速缓存行与无效的行与 DMA 完成时间)?

3) MCU+ SDK 11.01.00.17 中是否有任何关于高速缓存维护+带有 MCSPI 的 DMA 的已知限制可以解释这一点?

客户无法公开提供源代码。 如果 TI 工程师可以通过 E2E 私信与我联系、我可以根据需要私下共享相关代码片段、缓冲区放置详细信息和工程配置。

提前感谢您的指导。此致,

Michael

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

    您好、

    在回答您的问题之前、我希望您访问 MCSPI + DMA 上的这个 SDK 示例、并查看代码本身。

    注意一些指针、例如调用写入回调、调用失效以及缓存对齐的缓冲区。

    以下是相同的 GitHub 链接: https://github.com/TexasInstruments/mcupsdk-core/blame/next/examples/drivers/mcspi/mcspi_loopback_dma/mcspi_loopback_dma.c

    如果您在此处找到一些指针并获得您的查询的答案、请告诉我。

    此致、

    Vaibhav

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

    你好、 Vaibhav

    感谢您的答复。

    我与客户共享了代码链接、并指示他们 CacheP_inv() 在 DMA 完成回调后将 RX 缓冲区移动到。

    但是、问题仍未解决、我们感谢您对进一步调查此行为的支持。

    为清楚起见、 CacheP_wbInv() 在开始 DMA 传输之前使用、并 CacheP_inv() 在 DMA 完成后调用。

    此致、
    Michael

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

    您好、Michael:

    为了清晰起见、 CacheP_wbInv() 在开始 DMA 传输之前使用、并 CacheP_inv() 在 DMA 完成后调用。

    你是正确的,这就是它应该被调用的方式。

    但是、问题仍未解决、我们感谢您对进一步调查此行为的支持。

    让我知道客户的反馈。

    如果可能、还请共享客户的代码;调用 MCSPI_TRANSFER 的部分、这个部分及其周围的一段代码会有所帮助。

    此致、

    Vaibhav

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

    你好、Vaibhav、

    感谢您的答复。

    很遗憾、我不允许在面向公众的论坛上分享他们的代码、因此我私下与您联系。

    您能看一下我的信息、并告诉我是否有什么特别之处?

    此致、

    Michael

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

    您好、Michael:

    我看了你分享的两个图像,他们看起来不错,但完整的背景是未知的。

    您能否请求客户运行支持 DMA 的 MCSPI 环回的 SDK 示例?

    以下是该链接: https://github.com/TexasInstruments/mcupsdk-core/tree/next/examples/drivers/mcspi/mcspi_loopback_dma

    它将位于本地安装的 SDK 中的类似路径。

    请告诉我默认示例是否正常工作。

    此致、

    Vaibhav

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

    你好、Vaibhav、

    感谢您的答复。

    他们运行该示例并确认它按预期工作。

    下一步、他们共享完整的.c 文件是否有帮助、或者您建议首先检查其他方面吗?

    此致、

    Michael

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

    您好、Michael:

    他们运行了该示例并确认它按预期工作。

    如果 MCSPI DMA 的默认示例工作正常、我建议客户比较 MPU ARM v7 配置(这可以在 Application 的> SysConfig GUI 文件中找到)。

    找到之后、将设置与 MCSPI DMA SDK 示例与其应用进行比较。

    如果发现差异、请告诉我。

    此外、还会有一个指针用于确保缓冲区被缓存对齐。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    感谢您发送编修。

    >高速缓存行对齐
    我让客户检查其缓冲区对齐情况、然后 他们确认其自定义工程与示例工程匹配。

    >缓冲区的 MPU ARM v7 配置
    根据链接器映射文件、DMA 缓冲区位于 MSRAM (0x7008xxxx/0x7009xxxx) 中。 我在工作 SDK 示例和自定义工程之间比较了对应于该区域(区域 3)的 MPU ARM v7 设置、并且配置看起来实际上是相同的。

    *自定义(左)和示例(右)


    ‑排除任何细微或不明显的问题、我将通过私人消息共享客户的完整 SysConfig 文件。 您能否回顾一下并告诉我是否存在任何危险信号或已知问题?

    您是否建议接下来检查其他方面?

    此致、

    Michael

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid=“668281“ url=“~/support/processors-group/processors/f/processors-forum/1632276/am6442-cachep_inv-with-dma-spi-mcspi-rx-buffer-contents-revert-appear-cleared/6318743
    ‑排除任何细微或不明显的问题、我将通过私人消息共享客户的完整 SysConfig 文件。 您能否回顾一下并告诉我是否有任何危险信号或已知的 gotchas?

    我正在检查此项、并会在稍后更新您。

    谢谢、

    Vaibhav

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

    您好、

    SysConfig 看起来不错。 您是否也有机会尝试轮询模式? 现在我看到您已将其配置为中断模式、并且遇到了问题、您能检查“正常轮询“还是“正常中断“操作模式(无 DMA)。

    这是为了在 DMA 导致问题或其中断/轮询模式导致问题时进行滤除。

    请在与客户讨论后告知我。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    检查它们的设置后、我认为当前问题可能是由于为 DMA 模式写入代码、尽管从未在 SysConfig 文件中启用 DMA 模式。 缓存无效可能会导致观察到过时的数据(全零)。

    尝试轮询模式时、其软件从不从 MCSPI_transfe 函数返回。  

    我让它们也尝试 dma+callback 模式、但它们报告称从未到达回调。

    因此、我建议他们尝试 DMA +阻塞模式来帮助确定 DMA 是否正常运行。

    我会在收到更新时更新您、但在此期间、请告诉我是否应该让他们检查其他任何信息。

    谢谢!

    此致、

    Michael

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

    您好、Michael:

    因此、我建议他们尝试 DMA +阻塞模式、以帮助确定 DMA 是否正常运行。

    我期待这一更新。

    此致、

    Vaibhav