打印
[STM32F4]

STM32F4xx SPI从机 NSS控制问题(IO主动控制)--求助

[复制链接]
2007|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lai832|  楼主 | 2016-12-8 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境:
1.主机为非编程芯片,CLK长期输出(10MHz),
2.MCU为从机,NSS(I/O模式)低时,CLK送到SPI_SCK(硬件实现);
3.从机时钟极性
3.1:闲时高,第一边沿有效(下降沿)
3.2:闲时低,第二边沿有效(下降沿)
4.16BIT长度
5.一次发送32BIT

6.主机NSS为输入,主机在NSS低时接收数据

SPI从机发送流程:
1.SPI->DR = 高16BIT
2.拉低NSS
3.等待TX空标志
4.SPI->DR = 低16BIT
5.等待TX空标志
6.等待BUSY闲标志
7.拉高NSS

结果:3.1模式时钟,   实测发送了33BIT数据
       3.2模式时钟,  实测发送了34BIT数据,

求是否有解决方案
沙发
feelhyq| | 2016-12-8 18:02 | 只看该作者
   从机发之前拉低NSS,发送一个字节,再拉高NSS,继续拉低NSS 发送第二个字节,再拉高NSS,简而言之就是每发送完一个字节就将NSS拉高一次,然后再拉低。
我遇到过你这种情况,上个月我们公司开发的一款基于cortex-M4系列的芯片也出现了这个问题。通常来讲使用模式三最好,即空闲时高,第二个边沿有效(PHA = 1, CLK = 1)

使用特权

评论回复
板凳
lai832|  楼主 | 2016-12-8 23:17 | 只看该作者
本帖最后由 lai832 于 2016-12-8 23:24 编辑
feelhyq 发表于 2016-12-8 18:02
从机发之前拉低NSS,发送一个字节,再拉高NSS,继续拉低NSS 发送第二个字节,再拉高NSS,简而言之就是每 ...

谢谢,
我的有些少区别
1.主机(其它芯片)的CLK是长期有的
2.所以硬件就设计成了:从机(F4)的NSS通过门控制是否能送到从机(F4)的SPI_CLK;

因为从机收到主机的CLK才开始发送的,
所以流程变为:
先将要发的第一个16BIT数放在DR,
再拉低NSS-----------同时SPI_CLK收到主机的CLK,开始发数据

因为这个NSS是从机控制的(主机的NSS是输入-------主机还有一人NSS_Out是用于主机输出的NSS控制)
所以出现了,
检测到BUSY不忙时,更新NSS出现了延时,  NSS无法准时关掉CLK送到SPI_CLK的时钟,
F4收到了33个时钟


明天我试一下用其它的时钟时序试一下,板子在公司
==================================================================================
BTW:检测TX空标志可以不用每次更新DR,都是拉一次NSS,

因为DR为空时,TX空标志有效,  但这时数据还是在发送中的
-------因为DR是并行送到移位寄存器,  并行送完就生成TX空 标志,   但移位发送还没完成,  所以检测到TX空标志时,可以马上更新后一个TX_BUFF到DR.这样发送是连续的
-------BUSY是移位寄存器忙时有效,  无数据要移位时为0,

使用特权

评论回复
地板
feelhyq| | 2016-12-9 09:04 | 只看该作者
从机的NSS(片选使能)是无法控制主机的时钟的,主机的时钟通常也不是一直存在的,只有当主机有数据向从机发送时,才会产生时钟,没有数据发送时(空闲状态)是不会产生时钟的。

使用特权

评论回复
5
lai832|  楼主 | 2016-12-9 14:33 | 只看该作者
feelhyq 发表于 2016-12-9 09:04
从机的NSS(片选使能)是无法控制主机的时钟的,主机的时钟通常也不是一直存在的,只有当主机有数据向从机发 ...

已经说了,我的芯片(SPI主机)它就是这样的

使用特权

评论回复
6
lai832|  楼主 | 2016-12-9 14:37 | 只看该作者
目前解决办法;
F4的SPI从机发送数据前,关所有中断

在最后16BIT,等待TXE(发送空)标志后,
延时N 个执行周期.
拉高NSS(同是关掉CLK------/     ----->SPI_SCK的路径,硬件实现)

使用特权

评论回复
7
lai832|  楼主 | 2016-12-9 14:58 | 只看该作者
feelhyq 发表于 2016-12-8 18:02
从机发之前拉低NSS,发送一个字节,再拉高NSS,继续拉低NSS 发送第二个字节,再拉高NSS,简而言之就是每 ...

其它不变,第种时序配置结果差距很大,
配置为:1/1,与0/0;0/1;1/0的相差很大(非常大)
谢谢提醒

使用特权

评论回复
8
feelhyq| | 2016-12-9 15:26 | 只看该作者
不用客气,问题解决了就好

使用特权

评论回复
9
huangcunxiake| | 2016-12-9 15:53 | 只看该作者
来学习楼主的经验。

使用特权

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

本版积分规则

19

主题

879

帖子

3

粉丝