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:兼容模式 SPI DMA 保持 CS 激活

Guru**** 2435010 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1303881/tms570lc4357-compatibility-mode-spi-dma-hold-cs-active

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

我当前使用 SPI1进行一些通信。  在我写入缓冲区时、我要与之对话的器件需要 CS 保持有效状态(低电平)。 但是、使用 DMA 似乎失去了控制 SPI CS 保持的能力。 在每次发送缓冲区并保持 CS 处于活动状态之前、我必须稍微修改 halcogen 代码、以便可以发送特定的3个字节。

在下图中、显示了每次8位传输后 CS 线路的切换、这就是我要防止的情况。 其他一切似乎都正常。  

只是我希望 CS 线路在整个 DMA 传输期间保持低电平有效。 以下是我的问题:
1.是否有办法使用 CS 的 SPI 模式引脚和 DMA 来控制 CS 在整个块传输期间保持低电平? 或者我是必须改用 GIO 引脚吗?

2.切换到 mibSPI 是否是更好的选择? 这是否通过 DMA 提供对 CS 引脚的更多控制?

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

    尊敬的 Spencer。

    对于该要求、您可以执行一项操作、您可以从 DMA 进行8位传输、而不是进行32位传输 、从 DMA 传输到"SPIDAT1"寄存器。

    通过这种方法、你可以获得对 CSHOLD 位的完全控制、这意味着你可以决定从 DMA 传输的每次 CSHOLD 位的值应该是多少。

    例如:

    在我最近的线程中、一位客户要求使用 DMA 从 SPI 进行24位传输、实际上24位传输不能直接从 SPI 进行、因为它仅支持最大16位传输。

    我们所做的是创建从 DMA 到 SPIDATA1寄存器的32位传输、在该传输中、我们前两次使 CSHOLD = 1、第三次使 CSHOLD = 0、这意味着每3字节传输就会激活 CS。

    如果您在上面的 TX_DATA 数组中进行验证、则可以看到每个数据中的第28位(CS_HOLD)值。

    因此、我们得到了这种输出:

    您可以看到、CS 线路仅在24位传输且 CS 每3个字节处于保持状态后才激活。

    我在这里提供了我的代码、您可以根据您的要求进行验证和修改:

    e2e.ti.com/.../3005.SPI_5F00_DMA_5F00_TEST_5F00_LC4357-_2800_2_2900_.zip

    --
    谢谢。此致、
    Jagadish。

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

    感谢您的答复。 我正在寻找与您提供的解决方案略有不同的解决方案。 前3个字节只附加到我需要发送的缓冲区的开头。 以下是在没有 DMA 的情况下使用 SPI 的截图、其中我将 CS 保持为低电平(CS 上的脉冲只是噪声、实际上不会切换)。 在这种情况下、只要需要、我就可以将 CS 保持为低电平。

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

    我在这方面已经取得了一些进展。 首先、我在从 halcogen 复制代码以启动 SPI 传输过程中出现了一个拼写错误、并且未正确设置 CS 保持。 在此之后、我只需要制定一些逻辑来重置 CS 保持时间、从而进入下一个要点。

    为了再次将 CS 保持为非活动状态、我将在 TX 通道上为 LFS (最后一个帧开始)设置中断、并且可以设置 SPI DAT1寄存器中的 CS HOLD 位。 但是、这一帧太晚了(我发送了1个元素或每帧1个字节、帧计数是我发送的所有数据的长度)。 因为 通过在下一个 SPI TX 之后将 CS 引脚设置为非活动状态、设置 CS 保持只会影响下一帧。 目前、DMA 允许 SPI 在将 CS 引脚设置为非活动状态之前发送1个额外的字节、从而导致问题。

    因此、了解其他相关知识来使用 BTC 或 LFS 中断强制 CS 引脚处于非活动状态将会有所帮助。 我宁愿避免使用 CS 引脚的 GIO 功能、因为 SPI 读取仍由 CPU 完成、并且利用了所有引脚的 SPI 功能。

    编辑:
    这实际上似乎只是在第一次 SPI DMA 传输时发生、其余部分不知何故可以。 下面的第一张图片是我希望在 SPI 传输结束时实现的效果。 第二张图片是我将获得的内容(复制的最后一个字节、因为 CS 保持低电平、另外进行一次传输)。  当前将 CS 保持设置为在 LFS 中断条件下无效。

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

    如果有任何人具有类似的问题、我在最后通过同时使用 SPI 和 GIO 功能解决了我的问题。 我删除了 LFS 中断、并且仅使用 BTC 中断。

    在为 SPI 启用 DMA 之前、我使用 PC0将 CS 引脚设置为 GIO 功能、并使用 PC3将其设置为活动(低电平)。 此外、对于 SPI->DAT1、我必须将 CS_HOLD 设置为0。

    在获得 BTC 中断后、我仅使用 PC0将 CS 引脚设置回 SPI 功能、特别是不要使用 PC3再次将其设置为非活动状态。 这是因为 DMA 将在 SPI 实际完成之前设置 BTC 标志、如果您使用 GIO 手动复位 CS、它会中断最终字节。 但将其设置回 SPI 让我们用 SPI 复位 CS、但请注意、对于整个 DMA、您需要特别将 SPI->DAT1寄存器中的 CS_HOLD 位设置为0。 否则 SPI 将再发送一个重复的字节。