打印
[其他ST产品]

STM32 SPI TX FIFO处理

[复制链接]
300|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
有没有遇到这种情况,在MCU 的SPI作为slave时,为了提高传输效率,提升速率,会提前将数据写入TX FIFO中,一般情况下不会出问题,但有些SPI Host 的波形不规范,例如下面:

在传输数据时会多发几个CLK,这会导致TX FIFO的数据传至移位寄存器中,会让MCU 的SPI 误以为数据已经发送;


使用特权

评论回复
评论
雨果喝水 2023-1-31 23:57 回复TA
———————————————— 版权声明:本文为CSDN博主「野人施巴拉古」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/sojojoso/article/details/124194832 
沙发
雨果喝水|  楼主 | 2023-1-31 23:57 | 只看该作者
这里几点需要注意:

1. STM32 的SPI Slave 在NSS 为unselected时,并不会处理TX FIFO的数据(清除);

2. STM32 的TX FIFO 没找到对应的Flush操作,意思是,FIFO里的数据不能被手动清掉;

3. STM32 SPI TX FIFO是单次16bit 写入的,不支持8bit写入;

4. 上图中,MCU 会认为在最后几个CLK,FIFO中的8bit数据已被发送;剩余的8bit会在下个SPI CLK到来时发送到总线上,这会导致数据错位,而且由于无法Flush FIFO,所以这个错位会一直错下去,无法修复,除非在填充FIFO的时候就使用错位的数据,这样操作太过于麻烦;

使用特权

评论回复
板凳
雨果喝水|  楼主 | 2023-1-31 23:58 | 只看该作者
针对这个问题,有下面几点思路:

1. 若已知HOST SPI的访问格式,比如第一次读取固定长度的数据,就可以在FIFO填入对应长度的数据后,停止填充FIFO,当然这样会导致TXE的中断不停产生;

使用特权

评论回复
地板
雨果喝水|  楼主 | 2023-1-31 23:58 | 只看该作者
2. 在TXE中断中判断NSS 是否为unselected,若是,可以填充一次16bit 的dummy数据到FIFO,这样TXE中断就不会持续产生,待到下一次有效的CLK到来时候,dummy数据被发送到总线上,数据并不会产生错位。一般SPI 头4个字节对应的一些操作命令,所有dummy数据发到总线上不会有什么问题;

使用特权

评论回复
5
雨果喝水|  楼主 | 2023-1-31 23:58 | 只看该作者
看看对比:
修改之前:

数据错位;

使用特权

评论回复
6
雨果喝水|  楼主 | 2023-1-31 23:58 | 只看该作者
修改之后
  
这样数据就okay了;

使用特权

评论回复
7
雨果喝水|  楼主 | 2023-1-31 23:59 | 只看该作者
说穿了,还是host spi 的CLK不规范,但STM32也没有合理的清FIFO的操作,才考虑这样剑走偏锋的办法..

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1153

帖子

0

粉丝