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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy
6 j2 D& h9 x/ v我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。9 i: \( o" |% |5 @( w
  1. //停在这里
    # R, X" E  g" e  k: X
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
    ) X4 E: O/ D0 ^0 ~. V. _) V0 d
复制代码
" v. j3 M, i& O( |' N7 _) L  @# P
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。  N2 K/ w- C7 ~

1 z; e1 {# ~: s  c重新查看手册发现我之前漏掉EV6_1的细节:+ ?" |/ h5 H; V# Y" q; W
( x2 f% i4 ]- o6 b: c
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
1 d5 p& f8 T0 x
0 Q: _9 q: U5 @图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:- w) A8 W8 W5 x. n1 a" g

  N4 f( [0 V* B/ X
  1. //事件6' }7 l& m+ v- D8 v
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));. c" i$ u; b! J1 r, {. Q
复制代码
  1. //事件6( T+ k3 g/ y: A
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));0 [, P3 E! B. B6 l, t
复制代码
6 z6 n; B; p( u
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。/ g% p* I9 k6 S+ S
! G3 [% q2 R: f# H
67f078b7e07640b5bf3bb83fcf5945fa.png # N" h2 S: a+ V4 [1 X

3 ^' |+ @4 ?2 }3 c$ O. f& ^- }GPIO口初始化错了也有可能造成busy的情况。
; l3 d& G. M" c; a, I- c————————————————
2 z: Y$ b6 `$ R4 M- J* {0 i版权声明:外星人请走开2 M7 T; Q! }4 J  m: M
如有侵权请联系删除
+ H& D% [) w. s1 ^: n* f5 s% O4 k) `! t2 t' c1 E, }% P" c

9 j7 j" ~8 K5 H+ N: k9 ?
* r/ ^# u6 `# V
赞 收藏 评论0 发布时间:2023-5-23 17:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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