打印
[应用相关]

STM32Fxxx 清除SPI残留在移位寄存器的数据

[复制链接]
3648|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lai832|  楼主 | 2016-12-14 09:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lai832 于 2016-12-14 10:00 编辑

因为需要   (一外部芯片的时序有些奇怪,NSS先于MISO一个时钟周期,利用这超前周期唤醒这个芯片)
时序如下图

说明:
1.上面是主机芯片的接收时序(只有SCO的相性可以改:选择上升沿或下降沿触发)
2.SCO是长期存在的(10MHz).   通过外接门开关,当FSI低时选通送到SPI_SCK      (没办法因为SCO是长期存在,只能选用FSI的虚线波形,要不是可以考虑TI模式---但也是有问题的)
3.请注意FSI比SDI超前一个时钟周期
4.FSI是主机的输入---------------------这个很重要,即MCU的SPI从机是用I/O模拟NSS输出的,不是输入
5.因为SCO是长期连续的,两个16BIT间只能连续,   STM32F4只支持最大一次发16BIT

情况:
1.MCU的SPI作为从机
2.因为STM32F的SPI_NSS问题,   只能选用I/O连接到FSI ------模拟NSS
------这就造成了只有在发后16BIT时,等待N个系统周期拉高FSI,  试过等待BUSY标志,不可行.程序:whit(busy);   FSI = 1;  //F4跑168M,  SPI会多收到1个/2个SCO,导致多压入一个16BIT到移位寄存器.
3.发送方式:
3.1直接将32BIT分两次压入SPI->DR,这样没有超前一个时钟周期(发送流程与3.2差不多,只发32BIT)
3.2
a.发送BUFF[3];    将实际的32BIT移位为1BIT(0) + 32BIT +15BIT(0),(前高位,后低位)
b.关总中断,
c.清标志
d.SPI->DR = BUFF[2] ----------发送1BIT(0) + 高15BIT,1BIT(0)作为超前FSI用
e.拉低FSI                    ----------打开门选通开关,SCO送到SPI_SCK脚,开始传输
f.等TXE标志
g.SPI->DR = BUFF[1] ----------发送BIT[16:1]
h.等TXE标志
i. SPI->DR = BUFF[0] -----------发送BIT[0];   这里会将15BIT(0)也压入移位寄存器
j.while(N--);                -----------计N个系统周期,使FSI对齐BIT[0],即SPI_SCK刚好收到33个时钟,
k.拉高FSI                   -----------发送完成,     


以上发送完成.
问题:
1.   3.1方式缺少超前的FSI; 如果是拉低FSI,再更新SPI-DR,会出现超前16BIT的情况

2.   3.2方式;  到3.2.K处,因为最后16BIT只发送了最高的1BIT,还有15BIT(0),存在发送移位寄存器中,
下次收到SPI_SCK时,将发发送这15BIT(0),但这是无用的数据

这就有了一个问题,如何清除这残留的移位寄存器数据,
没找到方法,
失能SPI,再使能, 不行
只能复位SPI,再初始化


下面是别的论坛之前有人也在找清移位寄存器数据的方法
http://www.openedv.com/thread-22859-1-1.html
沙发
lai832|  楼主 | 2016-12-14 10:11 | 只看该作者
因为MCU除了发送数据,主要的是作为从机接收这个芯片的数据,使用复位,再重新初始化,会丢数据.

如果没有更好的方法,
只有改外拉硬件电路,
1.使用SPI的NSS功能脚,
2.辅助I/O

硬件电路功能:
1.I/O接FSI
2.当I/O拉低时,延时/计数1个时钟周期,输出低电平,送到SPI_NSS
3.当I/O拉高时,不延时直接拉高SPI_NSS.
4.(请忽略).芯片还有一个FSO脚,  与FSI类似,是芯片输出数据时拉低的,与常规的NSS一样,没有超前, 这个脚或拉到SPI_NSS

-----这时终于明白为什么网上看到用这个芯片的人都是用FPGA驱动的了,
从没发现有人提到用MCU驱动.

使用特权

评论回复
板凳
643757107| | 2016-12-14 10:41 | 只看该作者
每次接收完,读取后,应该会被自动清除吧

使用特权

评论回复
地板
lai832|  楼主 | 2016-12-14 23:05 | 只看该作者
本帖最后由 lai832 于 2016-12-14 23:12 编辑
643757107 发表于 2016-12-14 10:41
每次接收完,读取后,应该会被自动清除吧

MCU作为从机,发送时,
一个完整的16BIT数据压入移位寄存器(发送)  后,收到  1个CLK后,
软件关掉SPI_CLK,    还有15BIT在移位寄存器中,  这15BIT是不需要的,要清掉

-----求除了复位外的清除办法,     当然如果有其它实现办法也行


注意:是移位寄存器,不是SPI->DR(数据寄存器)
发送:将SPI->DR压入移位寄存器,从MISO发出(从机时),              --------并转串
接收:MOSI(从机时,收到数据移压16或8个SCK时,更新SPI->DR    --------串转并

使用特权

评论回复
5
643757107| | 2016-12-18 13:30 | 只看该作者
lai832 发表于 2016-12-14 23:05
MCU作为从机,发送时,
一个完整的16BIT数据压入移位寄存器(发送)  后,收到  1个CLK后,
软件关掉SPI_CLK,    ...

如果不需要但是你也是可以接收的啊,你接收后丢弃就行了。

使用特权

评论回复
6
lai832|  楼主 | 2016-12-18 15:27 | 只看该作者
643757107 发表于 2016-12-18 13:30
如果不需要但是你也是可以接收的啊,你接收后丢弃就行了。

是发送,不是接收
MCU作为从机 ,   从机发送时
时序图是主机要求的接收图

现在问题在:发送端(MCU端)

使用特权

评论回复
7
643757107| | 2016-12-21 22:13 | 只看该作者
lai832 发表于 2016-12-18 15:27
是发送,不是接收
MCU作为从机 ,   从机发送时
时序图是主机要求的接收图

如果发送,你补齐就行了。到那边再丢弃。

使用特权

评论回复
8
lai832|  楼主 | 2016-12-25 13:47 | 只看该作者
643757107 发表于 2016-12-21 22:13
如果发送,你补齐就行了。到那边再丢弃。

谢谢,因为对方只是一个功能芯片,
发多了,对方就会误接收,误处理.

使用特权

评论回复
9
迪卡| | 2016-12-27 19:55 | 只看该作者
SCO是长期连续的,两个16BIT间只能连续

使用特权

评论回复
10
seupenn| | 2019-10-12 12:17 | 只看该作者
楼主,怎么复位SPI??SPI_Cmd(SPI1, DISABLE);吗??
我的芯片上有一个IAP程序和一个主程序 ,两个程序里都有SPI初始化,IAP程序里的SPI发送寄存器里面的值,在跳转到主程序的时候,会清零吗??

使用特权

评论回复
11
lai832|  楼主 | 2019-11-3 18:43 | 只看该作者
seupenn 发表于 2019-10-12 12:17
楼主,怎么复位SPI??SPI_Cmd(SPI1, DISABLE);吗??
我的芯片上有一个IAP程序和一个主程序 ,两个程序里 ...

16年弄的,忘了怎复位了,应该是直接禁掉SPI时钟,而不是单清SPI的EN,   
你从IAP跳主程序,只要过程中没对SPI操作,是不会复位的

使用特权

评论回复
12
seupenn| | 2019-12-4 11:14 | 只看该作者
lai832 发表于 2019-11-3 18:43
16年弄的,忘了怎复位了,应该是直接禁掉SPI时钟,而不是单清SPI的EN,   
你从IAP跳主程序,只要过程中 ...

谢谢!!我试一下!
现在又有新的问题,在主程序里,我是SPI从机,用的硬件SPI接收中断,但是长时间测试以后会出现卡死在SPI中断里的情况,看位置应该是SPI发送部分。不知道为什么这样的。。。

使用特权

评论回复
13
lai832|  楼主 | 2020-1-13 16:13 | 只看该作者
seupenn 发表于 2019-12-4 11:14
谢谢!!我试一下!
现在又有新的问题,在主程序里,我是SPI从机,用的硬件SPI接收中断,但是长时间测试 ...

可能是不断的进中断。。。。

使用特权

评论回复
评论
1156807738 2020-7-30 21:21 回复TA
前辈,我也遇到SPI这种需要清移位寄存器多余数据的问题,您是怎么解决的?我关了时钟,外设,但是发送的数据是不正常的,不起作用。。。bsy状态位检测,一直忙,很头大 
14
1156807738| | 2020-7-30 21:22 | 只看该作者
前辈,您好!
我也遇到SPI这种需要清移位寄存器多余数据的问题,您是怎么解决的?我关了时钟,外设,但是发送的数据是不正常的,不起作用。。。bsy状态位检测,一直忙,很头大

使用特权

评论回复
15
lai832|  楼主 | 2020-8-19 11:31 | 只看该作者
1156807738 发表于 2020-7-30 21:22
前辈,您好!
我也遇到SPI这种需要清移位寄存器多余数据的问题,您是怎么解决的?我关了时钟,外设,但是发 ...

我直接换掉了这个芯片(功能芯片,非MCU),  

使用特权

评论回复
16
lai832|  楼主 | 2020-8-19 11:34 | 只看该作者
1156807738 发表于 2020-7-30 21:22
前辈,您好!
我也遇到SPI这种需要清移位寄存器多余数据的问题,您是怎么解决的?我关了时钟,外设,但是发 ...

我直接换掉了这个芯片(功能芯片,非MCU),  

实在不行,   在中间(通信总线,  NSS,MOSI,ISO,CLK等)加个门电路   再加个选通开关,  有用的发送到外挂功能芯片,  没用的数据时,断开门电路(开关用);   空发,不让功能芯片收到.   所有线加门啊,  要不是因为门芯片延时,造成时序对不齐就有新的麻烦了

使用特权

评论回复
评论
1156807738 2020-8-21 15:18 回复TA
挖帖挺不好意思的,感谢前辈的指导,我最后还是用了最笨的办法,复位重新初始化了,虽然耗时,凑乎能满足。再次感谢! 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

879

帖子

3

粉丝