你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32的SPI2操作Flash

[复制链接]
STMCU小助手 发布时间:2022-2-6 22:17
用STM32 SPI1驱动DAC7611,在发送数据的时候用了while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);等待发送缓冲区为空后再拉高CS。结果发现在数据(16位)没有发送完时,就执行了CS拉高。然后我换了这个语句while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);就正确了。我想知道,STM32如何判断发送缓冲区为空的?这两个标识位的判断有什么区别?
' b* D+ D& x; Z
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET); //等待发送完成
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)==SET);
只发送过程(BIDIMODE=0并且RXONLY=0)0 Z7 F2 ?& x* l& s
在此模式下,传输过程可以简要说明如下,使用BSY位等待传输的结束(见图215
* }; p' m% ?2 L' K466/754
+ m, E* `9 p2 ?& x0 v和图216):
2 t3 g4 q1 q6 `1. 设置SPE位为’1’,使能SPI模块;0 u2 U6 X) E# o! T  G
2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志;  E* c1 T: Z$ L# u# Y3 u
3. 等待TXE=1,然后写入第二个要发送的数据。重复这个操作,发送后续的数据;) K/ z% N# o' Z9 U' [2 d/ z
4. 写入最后一个数据到SPI_DR寄存器之后,等待TXE=1;然后等待BSY=0,这表示最后一个数据的传输已经完成。! O! |9 m* e; O. `, K
也可以在响应TXE标志的上升沿产生的中断的处理程序中实现这个过程。' ~+ `  E7 w3 f3 q4 T
注: 1. 对于不连续的传输,在写入SPI_DR寄存器的操作与设置BSY位之间有2个APB时钟周期的延迟,因此在只发送模式下,写入最后一个数据后,最好先等待TXE=1,然后再等待BSY=0。
9 Z6 N6 x( G) m, d( |, T2. 只发送模式下,在传输2个数据之后,由于不会读出接收到的数据,SPI_SR寄存器中的OVR位会变为’1’。(译注:软件不必理会这个OVR标志位)
是配置的时候有点问题,. D0 ]9 p0 i4 E  A6 R, j: y7 m8 }
    SPI_InitTypeDef  SPI_InitStructure;" {. _( L$ R: c" {6 i/ c, t
      SPI_Init(SPI2, &SPI_InitStructure);# A9 I. P7 l1 `5 L
和
; V# f( P  ?; k' r0 g! J     SPI_InitTypeDef  *SPI_InitStructure;
6 q' @9 M6 t9 e& ?, P4 k      SPI_Init(SPI2, SPI_InitStructure);
2 P' L- S9 N* t! m6 Z* |7 W两种方式的不同,大家有兴趣的可以试一下,其中一种方式是不行的(至少针对某些固态库是不行

! I- }/ z# T( J  n% ]; m* r
赞 收藏 评论0 发布时间:2022-2-6 22:17

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版