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.

[参考译文] TM4C1237H6PGE:用于简单命令响应协议的 SSI 从器件

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/739019/tm4c1237h6pge-ssi-slave-for-simple-command-response-protocols

器件型号:TM4C1237H6PGE

我尝试将 TM4C 用作 SPI 从器件、它将生成对单独主微控制器发出的查询/命令的响应。 我正在 SPI 模式1下运行、因此 我不需要在每个字节后将 CS 置为有效。

例如、主器件将发送一个帧:[cmd1、dumme]并同时接收[dummy, cmd1_RESPONSE]。 我认为这是一项非常常见的任务、但 TM4C 中的 SSI 在从模式下似乎使这一任务变得非常困难。

问题是8字节 FIFO 不能被旁路或禁用、事实上对于从机来说、只有三个有用的中断、但我看不到它们的任何组合、由于 FIFO 的原因、它们在这里非常有用:

  • RX FIFO 半满或更多:仅在 FIFO 中至少有4个字节时触发。 在这里不起作用、因为这只会在主机完全发送第二个命令帧时触发。 与此同时、从器件一直忙于发送 FIFO 中的任何内容、这显然与命令没有任何关系。  
  • TX FIFO 半满或少于半满: 它将立即触发4次,直到您有机会接收第一个命令?????
  • RX 超时:也是无用的、因为在它触发时、您没有机会实际读取命令;最多您已经接收到这两个字节并发回两个(随机)响应字节。  
  • 也是最有用的中断、EOT 中断、只在主机模式下可用!!

我在这里缺少什么吗? 我想,如果强制命令为四个字节,并且总是让从机在帧开始时发送4个浪费/垃圾字节,可能会发生这种情况,但是当您无法控制主站的协议时,这些限制似乎是灾难性的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    请在命令和响应交换中检查您的外部 SPI 器件。 当主器件发送一个[cmd1、dummy]时、我认为它也很可能希望接收虚拟数据。 如果主器件希望接收一个有效数据、例如一个应答帧、那么在主器件发送 SPICLK 之前、您需要在从器件的 TX FIFO 中预先准备要由从器件返回的数据。 这就是它在从器件 SPI 中的工作方式。 从器件 SPI 仅在看到主器件时钟时才会发送。 在主器件启动主器件时钟之前、从器件必须事先准备数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我知道、在主器件发送第一个时钟之前、从器件必须至少提前准备一个响应字节。 它可以是任意填充字节或一些通用状态字节、所有命令都会将其作为第一个字节返回。 但最终从代码需要实际读取命令并对其做出响应。

    我正在努力解决的是、中断方案能够实现这一点。 例如、如果主机发送  [cmd1、dum] 且 RXFF 和 RXTO 中断处于活动状态、则中断将在主机已发送两个字节后发生。 从机"发送"的任何响应实际上都将排队、并在下一条命令期间发出。 因此、由于 FIFO 和粗粒度中断(最多每4个字节)、响应始终由命令延迟。 如何避免这种情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Aaron、
    我想解决 SSI 限制问题(因为无法禁用 FIFO)、您需要在主设备和从设备之间建立一个数据交换协议、该协议将命令定义为4字节序列。 例如、主器件可能首先发送一个命令字节、后跟3个虚拟字节。 在接收到这四个字节后、从器件被中断、在 ISR 中、从器件将解码命令、以确定要返回的字节数并使用这些数据预加载 TX FIFO。 由于主器件知道先前发送了什么命令、因此它知道它将从从器件接收多少字节的数据。 假设您发送一条命令(命令是一个命令字节+ 3个虚拟字节)、从从器件读取8个字节的存储器位置。 从器件将对 ISR 中的命令进行解码、并知道它需要读取8个字节的存储器。 它将从存储器中读取8个字节并将其写入 TX FIFO。 由于主器件预期从从器件读取8个字节、因此主器件将生成8个字节的 SPICLK。 在这8个字节期间、主器件可以发送虚拟数据或某种意义上的命令/数据。 即使在这8个字节的传输期间、从器件将被中断两次、但是从器件可能会将接收到的数据解码为无效或虚拟命令、并选择在 ISR 中不执行任何操作。 您可以为主设备和从设备之间的数据交换总协议添加更多智能。

    另一种选择是通过轮询接收 FIFO 而不是空来使用轮询模式。 这与禁用 FIFO 类似、但您需要始终保持 CPU 轮询。