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.

[参考译文] TMS570LC4357:经过 DMA 处理的 SCI-TRANSMITE-PACKET 是一个常量(无法更新)

Guru**** 2394295 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1361659/tms570lc4357-dma-ed-sci-transmit-packet-is-a-constant-cannot-be-updated

器件型号:TMS570LC4357

我正在使用 DMA 实现 SCI 传输、这基于 example_sci_dma.c 示例文件。 I CAN (硬件)触发要定期传输的正确字节数、但发送数据包的内容保持不变。 我已经在调试器中验证 DMA 目标地址是 SCI 发送缓冲器的正确地址、但 DMA 在 DMA 初始化时重复传输发送缓冲器的值。 换句话说、当我初始化 DMA 寄存器时、SCI-TX 缓冲区是{1,2,3,4,5,6,7,8,9}、只有这些数据通过 SCI 传输、即使 SCI-TX 存储器发生了变化。  

我通过以下方式触发 DMA 传输: dmaREG->HWCHENAS = 1 (对于 DMA_CH0)。 我是否还需要执行其他操作来更新内部 DMA 存储器/FIFO?

谢谢!

吉姆

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

    我将代码精简为  example_sci_dma.c 代码。 我在末尾添加了以下 while 循环:

    while (1)

      //在此处循环、并更改第一个 TX 字节
      while ((dmaREG->BTCFLAG & 0x02)!= 0);
      if (RxPtr[0]== TxPtr[0]){ passCount++;} else { failcount++;}
      TxPtr[0]+= 1;
      dmaREG->BTCFLAG = 0x03;
      dmaREG->HWCHENAS = 0x03;//不更新(保持为零)
    }

    此循环只执行一个 DMA 传输;我认为清除 BTCFLAG 并设置 HWCHENAS 标志会导致另一个传输、但我无法写入 HWCHENAS -它保持为零。 BERFLAG 寄存器为零(无位错误);我是否必须停止或禁用 DMA (在 GCTRL0中、然后设置 HWCHENAS、然后为每个新的传输重新启用? 基本上、我是问--上面的代码是什么导致重复的 DMA 传输?

    谢谢!

    吉姆

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

    Jim、您好!

    您能否参考我在以下主题中的第一条评论:

    (+) TMS570LC4357:DMA 翻转-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    我在这里说明了如何在一个块传输完成后重新启动另一个 DMA 传输。

    ——
    谢谢、此致、
    Jagadish。

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

    Jagadish、

    你有没有专门针对 TMS570LC4357的示例? LS3137项目不会在我的目标上运行-它会加载、然后只有红色的停止按钮可用(运行和暂停显示为灰色)。 我认为这意味着代码是关闭在杂草。 我将目标处理器更改为 LC4357、它仍然无法运行。

    谢谢!

    吉姆

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

    我错了(在本期的标题中)、DMA 数据不能更新、有时不会更新。  

    让我重新解决这个问题;我使用硬件触发器每秒 DMA 输出一个9字节的 SCI 传输。 假定发生的情况是字节1-8在每个周期递增、字节 0 =字节2。 使用一个 DMA-硬件触发器、byte0 (写入 SCI->TD)启动 DMA 传输。 但是、剩余的8个字节有时会更新、有时不会更新。  这里是一些传输。 了解整个数据包有时如何更新、有时如何 以可变数量的周期更新 而不进行更改:

    02 01 02 03 04 05 06 07 08
    03 01 02 03 04 05 06 07 08
    04 01 02 03 04 05 06 07 08
    05 01 02 03 04 05 06 07 08
    06 01 02 03 04 05 06 07 08
    07 06 07 08 09 0A 0B 0C 0D
    08 07 08 09 0A 0B 0C 0D 0E
    09 07 08 09 0A 0B 0C 0D 0E
    0A 07 08 09 0A 0B 0C 0D 0E
    0b 0A 0B 0C 0D 0E 0F 10 11
    0C 0A 0B 0C 0D 0E 0F 10 11
    0D 0A 0B 0C 0D 0E 0F 10 11
    0E 0A 0B 0F 10 11 12 13 14
    0F 0E 0F 10 11 12 13 14 15

    我知道:
    9字节 dma-source-memory-buffer 被更新(通过检查和调试器中)
    DMA 传输正在发生(因为实际上已经传输了9个字节、即使我只写入第一个字节也是如此)
    DMA 源地址正确指向此缓冲区。

    就像 DMA 外设有自己的这个缓冲区副本、并且 DMA 外设并不总是读取新数据。 这是可行的吗?

    谢谢!

    吉姆

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

    Jim、您好!

    我们可以有现场调试会话吗? 在那里你可以分享你的屏幕和解释问题,我将提供我的建议来纠正它。

    如果您可以、请创建一个会议请求并与我分享。

    我的时间为上午10点至下午7点 IST (印度标准时间)

    ——
    谢谢、此致、
    Jagadish。

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

    Jagadish、

    下面是一个 Microsoft 团队会议邀请;我们将查看是否有效。 我在美国俄勒冈州、太平洋标准时间、我相信你比我早12个半小时、所以早上6点我的会议应该是下午6:30。 如果时间不正确、请告诉我。 我们将尝试仅30分钟的会议、因为它对我来说比较早、对您来说也比较晚。 我会准备,所以希望你能给我一些想法。  

    我想这就是参加团队会议所需要的一切。  

    会议 ID:247 507 306 629

    密码:M9hDY

    谢谢!

    吉姆

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

    Jim、您好!

    所以这次早上6点的会议应该是下午6点30分。

    您是对的。

    [报价 userid="2713" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1361659/tms570lc4357-dma-ed-sci-transmit-packet-is-a-constant-cannot-be-updated/5220354 #5220354"]

    会议 ID:247 507 306 629

    密码:M9hDY

    [报价]

    感谢您参加本次会议、我将在 IST 今天下午6:30登录。

    ——

    谢谢、此致、
    Jagadish。

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

    Jim、您好!

    我正在等待您加入会议。

    ——
    谢谢!
    Jagadish。

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

    我将会议显示为明天早上6:00。 希望您明天可以加入。

    谢谢!

    吉姆

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

    Jim、您好!

    好的、肯定、我明天会参加。

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

    我现在在打电话

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

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

    Jim、您好!  

    由于其他问题、今天我没有机会测试此问题、我将在星期一尝试测试此问题。

    ——
    谢谢、此致、
    Jagadish。

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

    Jim、您好!

    我创建了一个与您的项目类似的项目、并使用缓存进行了验证、但没有缓存。

    启用高速缓存:

    禁用高速缓存时:

    如果我们启用高速缓存、则始终会得到全零。 我的意思是、即使我更新的数据不是来自 SCI 的。

    根据我的理解、这种情况的根本原因是这样

    高速缓存将介于 CPU 和主内存之间。  高速缓存存储器 、 临时存储常用数据以加快  CPU 处理速度的补充内存系统。 由于缓存的这种行为、在本例中、如果我们将数据写入 RAM、则数据不会直接写入 RAM、更新后的数据会由缓存保留。 这是因为缓存认为、如果 CPU 再次请求数据、则可以从其存储器快速提供、但不知道 DMA 希望将 RAM 中的这些数据传输到 SCI。 因此我们没有向 SCI 获得正确更新的数据。

    该问题的解决方案是

    1.一种方法是禁用缓存、如下所示。

    我已经在上面的图片中分享了这个结果。

    2.另一种方法是需要将相应的存储器配置为直写式配置,如下所示。

    正如您在本例中看到的、我启用了高速缓存、但我将 RAM 区域配置为直写式、如果我们确实进行了类似的配置、那么 CPU 写入的数据不仅会写入高速缓存、而且还会立即更新到 RAM 中。 所以、如果 DMA 访问 RAM、那么我们就可以随时获得更新的数据。

    测试结果如下:

    我随附供您参考的项目、请仔细阅读:

    e2e.ti.com/.../DMA_5F00_SCI_5F00_ISSUE_5F00_ESI_5F00_Motion_5F00_LC4357.zip

    ——

    谢谢、此致、
    Jagadish。

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

    Jagadish、

    将内存配置更改为直写式解决了问题。

    谢谢!

    吉姆

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

    Jim、您好!

    将内存配置更改为直写式已修复此问题。

    很高兴听到这个消息。

    谢谢、此致、
    Jagadish。