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

【经验分享】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如何判断发送缓冲区为空的?这两个标识位的判断有什么区别?

' Y; B- n1 q) Z9 A
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET); //等待发送完成
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)==SET);
只发送过程(BIDIMODE=0并且RXONLY=0)" |" e* ^7 t# {  L% @2 y
在此模式下,传输过程可以简要说明如下,使用BSY位等待传输的结束(见图2152 k0 H' h4 ]( x/ Y5 o
466/754! _% A; T7 ^' D0 ~  ]- Q
和图216):
1 x3 s. ]9 M9 _1. 设置SPE位为’1’,使能SPI模块;
* ?: w" ~* G' s( P. {* ?3 A2. 在SPI_DR寄存器中写入第一个要发送的数据,这个操作会清除TXE标志;
6 t* ^! n+ D- p: y9 h+ [% u3. 等待TXE=1,然后写入第二个要发送的数据。重复这个操作,发送后续的数据;) b) z: E/ d+ t1 Q+ v+ h1 a5 c/ v7 P
4. 写入最后一个数据到SPI_DR寄存器之后,等待TXE=1;然后等待BSY=0,这表示最后一个数据的传输已经完成。
9 V7 R& z7 y6 J0 v% r: u1 u也可以在响应TXE标志的上升沿产生的中断的处理程序中实现这个过程。
6 k0 q( u8 m9 U% }6 G注: 1. 对于不连续的传输,在写入SPI_DR寄存器的操作与设置BSY位之间有2个APB时钟周期的延迟,因此在只发送模式下,写入最后一个数据后,最好先等待TXE=1,然后再等待BSY=0。7 l" g1 S( c4 g% X4 P, ~
2. 只发送模式下,在传输2个数据之后,由于不会读出接收到的数据,SPI_SR寄存器中的OVR位会变为’1’。(译注:软件不必理会这个OVR标志位)
是配置的时候有点问题,  N' _0 t# i5 m4 {+ N6 n
    SPI_InitTypeDef  SPI_InitStructure;0 n0 e! o# Q) x  y4 \* \# V' O
      SPI_Init(SPI2, &SPI_InitStructure);6 U' F  n- v/ V+ L/ z

; q, B1 i5 q* l" }$ q     SPI_InitTypeDef  *SPI_InitStructure;
  B8 C' E  z5 Z, j: Y      SPI_Init(SPI2, SPI_InitStructure);6 ^, T" j) v& X" ^/ }( s
两种方式的不同,大家有兴趣的可以试一下,其中一种方式是不行的(至少针对某些固态库是不行
! e& g. c) a. s8 [4 C7 o( Q8 x7 I
收藏 评论0 发布时间:2022-2-6 22:17

举报

0个回答

所属标签

相似技术帖

官网相关资源

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