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.

[参考译文] MSPM0G1505:SPI 外设的最小复位

Guru**** 2392405 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1360293/mspm0g1505-minimum-reset-of-spi-peripheral

器件型号:MSPM0G1505

如相关问题中所述、当 SPI 设置为外设时、无法清除 TX FIFO。  我希望能够让控制器随时通过 SPI 与我的外设通信。  我想使用在芯片选择的上升沿触发的 SPI 空闲中断将 DMA 通道指向要传输的下一组数据。  但是、因为我不知道控制器从外设中读取了多少数据、所以我不知道 FIFO 中是否还有内容。  我被告知需要在每个事务后复位 SPI 外设、以刷新 FIFO、为下一个事务做好准备。

为了将 TX FIFO 清空、以便能够使其进入清除状态、我需要执行的最小"复位"量是多少?  我是否可以仅切换 CTL1中的使能位?  是否需要在 RSTCTL 中设置 RESETASSERT?  我希望尽可能避免重新配置-从尽可能减少潜在的 SPI 停机时间的角度来看、并避免 IO 出现故障等。

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

    从进一步测试的后面、我发现空闲中断可能未链接到"芯片选择"。  甚至在控制器结束事务时、正确的判断方法是什么?

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

    您好、Alan!

    切换 SPI CTL1寄存器中的 ENABLE 位不会导致 TX FIFO 清零。 到目前为止、看起来您需要复位 SPI 外设来刷新缓冲区。 您可以使用 DL_SPI_RESET()函数执行此操作。 我使用复位功能、然后重新启用电源并重新配置外设、来实现这一点。 然后 FIFO 被清除、外设可用并且再次正常工作。

    对于 IDLE 信号、它应该与片选相关。 SPI 空闲中断表示 SPI 外设已完成传输并更改为空闲模式。 当传输完成时、SPI 片选也应变为 false。 根据我们的 TRM、IDLE 中断被绑定到 STAT。 BUSY 寄存器、当 SPI 正在发送或接收数据时、或当 TX FIFO 不为空时变为真。 因此、当 MSPM0作为外设运行、并且 SPI 传输完成时、空闲中断应有效出现以指示传输结束。

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

    迪伦

    感谢您的反馈-我将尝试如您所述实施重置。

    对于这样的描述我感到困惑、当时的描述是外设将保持繁忙状态、而"发送 FIFO 不为空"。  由于我的问题是、在控制器不断请求数据的情况下、我需要一直将数据放入 TX FIFO、这是否意味着即使在控制器由于数据释放片选线路之后外设也会一直处于繁忙状态?

    阿兰

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

    我明白你的意思了。 我想这只是 TRM 中的一些不明确的措辞、我会为此做注释。 您也可以在 TRM 的第17.2.3.1和17.2.3.2节中查看有关器件何时进入空闲模式的更详细说明、BUSY 位仅用于检测总线何时空闲。 因此通常而言、当控制器停止驱动总线上的数据(通过读取或写入)时、总线将进入空闲模式、忙位将返回0、并且将发生空闲中断。

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

    迪伦

    我已经配置了 DMA 通道来继续将更改的数据写入 TX FIFO、并启用了空闲中断。  当我配置外部 SPI 控制器来跨多个事务读取字时、我可以看到由 DMA 馈送的不断变化的数据。  但是、我不会发出空闲中断。  (我在配置 SPI 外设时会看到空闲中断、因此我相当确信我正确配置了它)。  这意味着 TRM 措辞可能是正确的-拥有 TX FIFO 中的数据足以停止空闲中断触发、因此使我无法检测到事务的结束。  我很高兴被证明是错误的,虽然!

    我还尝试过在芯片选择的上升沿配置 GPIO 中断(同时它被 SPI 外设"使用")、但同样我没有看到中断被触发。  是否可以混合 n 匹配 GPIO/外设功能这样?

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

    您好、Alan!

    在看到您的评论后、我自行返回进行测试、结果看起来您是对的、TRM 没有写错、只要 TX FIFO 已满、空闲中断就不会触发。 我尝试了一个与自己的实现非常相似的实现方案、但从未看到空闲中断触发、然后添加了一个延时时间来重新加载 FIFO、并开始看到空闲中断触发。 因此、您是正确的、您需要使用另一种方法来检测 SPI 控制器的活动结束。

    尝试考虑其他检测传输结束的方法、另一种选择是将计时器与 RX 中断结合使用。 使用该方法、您可以为下一个读取/RX 中断等待设定的时间量、如果没有发生中断、则复位外设以清除缓冲区。 也许有一个更简单的方法可以做到这一点、但我不想这么做。 如果我认为更好的解决方案、我将更新该主题。

    编辑:意识到我没有回答你的第二个问题。 可以手动操作和监控片选信号。 您可以将器件置于3线模式并使用 GPIO 来监控芯片选择、然后您可以使用该模式来确定控制器剩余的 TX 和 RX 行为。 因此、可以进行混合和匹配。 我认为、如果您的目标是将其保留为4线制模式、然后同时将 CS 引脚用作 GPIO、这是不可能的。 我不明白为什么这是必要的。 3线模式应该适用于您所描述的内容。

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

    迪伦

    感谢确认我的结果。  我想我将继续介绍您建议在 RX 中断之后使用计时器的方法-有一个内置的 RX 超时、看起来它应该能够完成该任务、 但它的时间范围太有限、无法满足我的需求、因此我将使用单独的计时器来实现。

    我希望能够使 SPI 保持4线制模式、并且仍然能够从 CS 线路触发中断。  按照您建议的3线模式使用它是可行的、但对于我的需求来说速度太慢-初始测试建议我无法始终在 CS-LOW 后启用 SPI 外设(以使其开始驱动 POCI 线路)足够快。

    我会将您之前的回答标记为最初问题的正确答案、尽管 从那时起已经进行了一些有用的更正/跟进。