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.
您好!
我目前正在开发用于 LED 驱动器的通信协议。 我想知道如何通过 SysConfig 将 DMA 目标地址连接到 CLB 推送 FIFO、从而扩展有效深度。 此外、我想知道是否有任何示例将 DMA 配置为将值从代码中的变量发送到外设寄存器。
提前感谢、
大卫
尊敬的 David:
遗憾的是、CLB 模块没有 DMA 访问权限。 对于具有 DMA 访问权限的模块、可以在 SysConfig 中执行以下操作:
要使用"Manual"选项 、您可以直接输入地址作为 目标地址 (例如0x6B38)。
若要使用"变量/函数名称" 、他们可以在 C 代码中的某个位置定义一个指针(例如、const void * scitdAddr =(const void *)(myLIN0_BASE + LIN_O_SCITD);)、然后使用 指针名称作为 目标地址(scitdAddr)。
此致、
德拉尼
您好 Delaney:
感谢您的解释。 因此、应该可以使用该方法将 DMA 互连到 CLB、而不是直接外设互连? 我之所以提出这个问题、是因为我阅读了 TRM 中的以下内容:
此致、
大卫
尊敬的 Delaney:
没问题、感谢您的澄清。 是否有其他方式可以在不使用中断的情况下填充 FIFO?
此致、
大卫
尊敬的 David:
CLA 可以访问 CLB 模块、因此您可以设置 CLB 以触发 CLA 上持续写入拉 FIFO 的任务。
另一种选择是使用 SPI RX 缓冲区来导出数据、如 TRM 的以下部分所述。
我 也会在 CLB 专家的环路中对我的建议进行评论。
此致、
德拉尼
尊敬的 David:
我已经与 CLB 专家讨论过、他们在提出建议之前有几个问题:
此致、
德拉尼
您好 Delaney:
您能解释更多有关您的应用程序以及想要避免对 PULL FIFO 使用中断的原因吗?
当然、我来进一步解释一下我们的应用。 根据 PWM 协议、CLB 用于控制包含21个 LED 的 LED 条。 每个逻辑值对应于不同的占空比。 PWM 频率大约为800kHz。 如您所知、拉取 FIFO 具有4个字的深度、因此、由于 LED 消耗高达32位的数据来理解命令、因此我最多可以控制4个 LED。 调度程序中用于更新 LED 条的更新任务具有1ms 的周期性。
我们想知道是否有其他选项的原因是、如果我使用中断、它们需要与更重要的中断的其余部分实现很好的同步、这样在重新加载 CLB 时、它们永远不会触发。 这会在数据线中引起延迟、并且可能会达到 LED 发出新命令所需的最短复位时间。 此外、我们目前的 CPU 时间也很短。 我们想让这个管理之王留给另一个外设或另一个简单的外设来减轻 CPU 的负担。
您 在原帖中"扩展有效深度"是什么意思? 您是指从不同的外设扩展 FIFO 的有效深度吗?
说到有效的深度、我的意思是如果可以有任何方法将所有 LED 数据放入 FIFO 或类似文件中、这样 CLB 或其他外设就可以直接消耗这些数据、因此无需为 CLB 拉动 FIFO 充电。 理想情况下、DMA 是理想的备选器件、因为它会将数据从一个方向移动到另一个方向、从而有效地增加 FIFO 深度。
此致、
大卫
尊敬的 David:
要在不显著更改 CLB 实现的情况下实现该目标、最直接的方法是让 CLB 触发 CLA 写入前面提到的 Delaney 的 PULL FIFO。 这在您的应用中是否可行、或者 CLA 是否已经执行可能中断进入拉 FIFO 的数据流的任务?
谢谢!
卢克
Luke、您好!
目前、我们没有使用 CLA、我认为这可能是一个合适的解决方案。 谢谢你的建议 Delaney 和 Luke。
此致、
大卫