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.

[参考译文] TM4C123GH6PGE:为什么每次传输都需要刷新 SSI Rx FIFO?

Guru**** 2468610 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/672502/tm4c123gh6pge-why-does-the-ssi-rx-fifo-need-to-be-flushed-for-every-transaction

器件型号:TM4C123GH6PGE

您好!

希望有一个简单的问题和道歉、如果在论坛的其他地方得到了解答、但我找不到。

SSI1配置为主机,以下函数从 txdata 缓冲区发送 txlen 字节,并将接收到的字节存储在 rxdata 缓冲区中。

该函数工作得非常完美! 但是、如果我错过了清空 Rx FIFO 的行、那么下次函数被称为接收到的数据包含来自之前的交换的一些字节时、我想了解原因。 有人知道吗?

void SSI1exchange (uint8_t txlen、uint32_t *txdata)
{
uint32_t flush;
static uint32_t rxdata[256];

while (rom_SSIDataGetNonBlocking (SSI1_base、&trl));//flush SSI1 Rx fifo

for (i=0;i flush 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    可能发生的情况是,当总线上仍然存在未完成的传输时,调用 SSI1eal交换()。 如何调用 SSI1? 中断 ISR 是否调用它? 哪个中断源? 是否可以尝试等待传输结束中断? 传输结束表示数据已完全传输。 由于发送的数据和接收的数据同时完成、因此传输结束中断还可以指示读取数据已立即就绪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、感谢您的回复。
    SSIDataGet ()是一个阻塞函数,它将等待直到它有一个字从 Rx FIFO 中拾取。 这可确保 DataPut 必须在我们继续之前完成。 我通过输入 a 来检查这个 while (ROM_SSIBusy (SSI1_base)); 数据 Put 之后、它不会产生任何影响。
    SSI1exchange()在我的代码中很少调用,并且在调用之间始终存在很长的间隔。 我在初始化期间执行 FIFO 清空、这是有道理的、但我不明白为什么在每次事务之前都需要它。 它推断出某个东西正在更改 DataGet()使用的 FIFO 指针或计数器。 或者我可能会误解这个机制?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    我同意,如果您首先真正清空 TX FIFO,则 SSIDataGet ()之后的阻止 SSIDataGet ()应清除 RX FIFO。 您知道 RX FIFO 中还剩下什么吗? 出于调试目的、我建议您不要刷新 FIFO、而是将数据存储在缓冲区中、看看您是否可以将该数据与您之前未完全被 CPU 读出的数据相关联。

    在调用 SSI1交换()之前,RIS 寄存器指示什么? 正如我在上一个帖子中所问的、还有一件事是处于中断模式还是轮询?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Richard aland">这可确保 DataPut 必须在我们继续之前完成。   我通过   DataPut 之后放置一个 while (ROM_SSIBusy (SSI1_base))来检查此项、它没有任何区别。

    我对这个问题以及您(逻辑)尝试解决方案感到好奇。    目前、我无法使用我们的任何 TM4C 板、但确实有一两块板可供选择...

    特别是,我有一个“冲” ,你用一个标准(&足够)“时间延迟”(夹在 DataPut 和 DataGet 之间-正如你所说的那样)来替换“ROM_SSIBusy()”可能会解决这个问题。   我要求一个"扩展的防护带"-超过 仅"ROM_SSIBusy()"提供的保护带。   (我的假释官建议我(应该)被"谦卑"。)

    您进一步说:"下次调用函数 [但减去清除函数]时、接收到的数据包含来自前一次交换 的一些字节-我[相当]-想了解原因。"   

    我也是!   让审讯开始:

    • 使用"flush"函数-不存在/删除-这些"先前的字节"是否 始终显示?    (即每次/每次?)   如果不是-请详细说明。
    •  "接收到的字节"的数量(偶数百分比)是多少(不需要/非法的"以前的字节?")
    • 您的数据传输的典型长度(以字节为单位)是多少?   (即"txlen")   如果您将"txlen"限制为8个字节或更少、会得到什么结果?   (因此它完全适合"FIFO")
    • 是否可以保证您没有报告(可怕)... "单板异常?"   (诊断的祸根 crüe -始终!)
    • 您是否降低了 SPI 时钟的速度(即减半)并观察了问题是否仍然存在-或以(任何)方式发生了变化?
    • 您的电路板是否"由供应商提供?"   它是否具有足够的供电能力和"丰富"的电源引脚旁路电容器?
    • 是否存在"代码的各个方面"(例如密集(几乎)不可避免的程序循环)和/或: 非常接近射频、高电流或噪声源-这可能会导致/促成此问题?

    如果那些"宏伟的七 "(上面)不能解析(如果不能证明它具有启发性)、通过"DataPUT()"提供一个"递增字节序列"、以便 您可以"更容易地识别"任何"位置偏置" (这些"先前字节"的位置显示)-包含在您的数据流中。    (到目前为止、我们有极少的"线索"-我的尝试是"总结"更多信息!)

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

    您好、Charles、

    您可以... 阅读我的帖子!   让记录表明,最后一段是从先前出现的群体"兴奋"的,以便过去的"电影标题"可以(几乎)无缝地"工作"。  (即"宏伟的八国"。 没有那么多-甚至假释官/饮酒伙伴也注意到了!)

    并认为"类似"在这里被禁止。  真遗憾!    (大哥证明"并非特别"受启发...)