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.

[参考译文] TMS320F28034:SPI 从模式问题

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/910714/tms320f28034-the-questions-of-spi-slave-mode

器件型号:TMS320F28034

大家好、

根据 TRM 、当待发送的字符的所有位都已移出 SPIDAT 时、写入 SPITXBUF 寄存器的数据将被传输到 SPIDAT 寄存器。 如果在 SPITXBUF 被写入时当前没有字符被发送、数据将被立即传输到 SPIDAT

如果数据要由从器件同时发送、并且之前没有载入 SPITXBUF、那么数据必须在 SPICLK 信号开始之前写入 SPITXBUF 或 SPIDAT

我有两个 SPI 从器件通信问题、如下所示、

SPI 模块如何确定 SPIDAT 为空、然后将 SPITXBUF 传输到 SPIDAT?

如果从器件同时发送数据、并且用户在 SPICLK 信号开始后将数据写入 SPITXBUF、会发生什么情况? SPI 会立即将 SPITXBUF 传输到 SPIDAT 还是保持该 SPITXBUF 以进行下一个字通信?

请提出您的想法、感谢您的帮助。

Luke

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

    您好、Luke、

    [引用用户="Luke Chen ]1. SPI 模块如何确定 SPIDAT 为空、然后将 SPITXBUF 传输到 SPIDAT?

    [引用用户="Luke Chen ]2. 如果从器件同时发送数据、并且用户在 SPICLK 信号开始后将数据写入 SPITXBUF、将发生什么情况? SPI 是否会立即将 SPITXBUF 传输到 SPIDAT 或保持该 SPITXBUF 以进行下一个字通信?[/QUERT]

    TRM 中没有对此进行专门解释、但我怀疑它必须对 SPITXBUF 的状态和 BUFFUL_FLAG 位进行更多操作。 当你向 SPITXBUF 写入新数据时、1。 如果当前没有字符被发送、新数据被复制到 SPIDAT 并且 BUFFUL_FLAG = 0、2。 如果有数据被发送、新数据保持 SPITXBUF 并且 BUFFUL_FLAG = 1。

    这些是我的猜测、我需要编写一些代码来进行验证、但您基本上是在问、因为您正在尝试了解如何在从模式下为 SPI 编写代码?

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

    您好、Gus、

    我的客户使用 SPI 从模式、在他的用例中、他必须接收第一个 SPI 字(命令)、然后确定应同时将哪些数据传输到 SPI 主器件、因此他需要在 Rx ISR 中将新数据写入 SPITXBUF。

    当 SPI 字的间隔较长时、通信效果良好。 但是、当他缩短字之间的间隔时、例如1us、SPI 将接收到错误的 SPI 数据。 我想 C28x 可能会在数据被发送时向 SPITXBUF 写入新数据、如果 SPITXBUF 立即被传输到 SPIDAT、则接收数据位会被覆盖、因此 SPI 接收到错误的数据字。 有可能吗?

    我需要了解 SPI 模块的详细行为以找出根本原因、请在这种情况下提供帮助、谢谢。

    此致、

    Luke

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

    您好、Luke、

    当主器件向从器件发送命令时、存在竞争条件、即在主器件生成下一个时钟之前、CPU 必须将数据加载到 SPITXBUF 中。 如果 CPU 未及时加载数据、SPI 将在该时间移出 SPIDAT 寄存器中的任何内容。 请记住、SPI 会随每个时钟移出 SPIDAT 的 MSB 位、同时将数据移入 SPIDAT 的 LSB。 因此、如果使用16位字符大小、则 SPI 会将16位命令移回主器件。 通过更详细地了解客户实际看到的内容、我们可能能够更好地诊断问题。

    在为从器件生成时钟以发送正确数据之前、主器件需要等待多长时间、这取决于 ISR 的 CPU 负载和效率。 因此、很难给出一个确定的数字。 一种解决方案是、如果在客户的电路板中完全有可能、则使用侧信号来指示 SPI 从站何时准备好传输数据(这可以是主从站和从站之间的 GPIO)。 另一种选择是利用 SPI TX FIFO 并在每个数据中附加一个关键字、以便主器件能够告知何时接收到有效数据、如果没有、则重试。 在本例中、CPU 会写入类似的内容 + 接收到来自主机的命令时发送到 FIFO。 这两种解决方案假定主器件当然是可编程的。

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

    您好、Gus、

    我的客户使用8位数据长度作为 SPI 字。 正如我提到过的、F28034接收第一个字(命令)并且想要在 RxISR 中将新数据写入 SPITXBUF、如果我的客户缩短了 SPI 字之间的时间间隔、这会导致 F28034 (从器件)接收错误的 SPI 数据(第二个字、第三个字)。

    是的、我知道如何解决这个问题、测量 SPI 字之间所需的延迟时间是有道理的、感谢您的建议。 由于这个问题、我们想知道 SPI 模块的详细行为。 如果我们在主器件已经开始下一个 SPI 字传输时将新数据写入 SPITXBUF、会发生什么情况? 例如、SPIDAT 已经从主器件接收到2位第二字、现在我们将数据写入 SPITXBUF、SPI 模块是否会立即将 SPITXBUF 加载到 SPIDAT 中并导致错误的数据接收?

    一个测试软件应该不足以理解细节、也许我们需要芯片/SPI 设计人员的评论、您怎么看?

    此致、

    Luke

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

    Luke、

    我相信您在非 FIFO 模式下使用 SPI。

    当 SPI 完成 SPIDAT 寄存器内容的传输时、它会将 SPISTS.INT_FLAG 位设置为1。 因此、在 ISR 例程内、写入 SPITXBUF 寄存器后、需要等待该位设置。 下面的代码片段显示了如何实现这一点。

    此致、

    曼诺伊

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

    Gus 和 Manoj、

    我的客户使用 FIFO 模式并将 FIFO 电平设置为1。

    我知道如何解决这个问题、我的客户想知道 SPI 模块的详细行为、当 SPI 从器件将新数据写入 SPITXBUF 时、什么是 SPI 从器件接收到错误数据字的根本原因?

    简而言之、我们想知道我们是否在 RxISR 中向 SPITXBUF 写入新数据、SPI 模块何时将该数据从 SPITXBUF 移动到 SPIDAT? 如果 SPI 事务正在处理中、SPI 模块是否会立即将 SPITXBUF 传输到 SPIDAT 或等待下一个事务?

    我们无法从 TRM 获得足够的信息、请就此为我提供帮助、谢谢。

    此致、

    Luke

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

    您好、Luke、

    我在内部进行跟踪。 我将尽最大努力在本周再次与您取得合作。

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

    Luke、

    很抱歉耽误你的时间。 我正在等待我们设计团队的回复。

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

    您好、Luke、

    [引用 USER="Luke Chen ]简而言之、我们想知道我们是否在 RxISR 中向 SPITXBUF 写入新数据、SPI 模块何时将这些数据从 SPITXBUF 移动到 SPIDAT? 如果 SPI 事务正在处理中、SPI 模块是否会立即将 SPITXBUF 传输到 SPIDAT 或等待下一次事务?[/QUERT]

    我们的设计团队运行了仿真以验证以下内容:

    有一个内部信号 SPIDAT_RDY 在复位时为高电平、当新数据被写入 SPITXBUF (并立即将其传输到 SPIDAT)时变为低电平。 然后、SPIDAT_RDY 保持低电平、直到发送整个字符、这完全由主 SPICLK 周期数决定。 当 SPIDAT_RDY 为低电平时(在进行中的传输期间)、新的 SPITXBUF 到 SPIDAT 的传输被阻止、并在 SPIDAT_RDY 变为高电平后立即发生。

    在客户的情况下、如果从器件 SPITXBUF 中没有加载新数据、则内部信号 SPIDAT_RDY 将为高电平。 然后、如果在主器件开始一个事务处理后、新数据被写入从器件 SPITXBUF、那么该数据将被立即复制到从器件 SPIDAT 寄存器中、并且 SPIDAT_RDY 将被设置为低电平。  由于 SPIDAT 用于 RX 和 TX、因此此时从器件 SPIDAT 中的任何数据都将被新数据覆盖。

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

    您好、Gus、

    设计团队的回答符合我们从客户那里获得的评估结果、感谢您的大力支持。

    此致、

    Luke