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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy' g* g, u* ?/ z6 ]9 [
我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。
  D+ J) J" \* y4 A/ m
  1. //停在这里1 N* u! i2 G% w. H! u) V
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));' n: D" C7 T. o' G- ?9 [- d7 J: K9 f# |
复制代码
7 H( P/ Q$ W& P( O
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。
2 ~! _' z) A! }! D3 B/ x+ T) K! D6 S, v: G
重新查看手册发现我之前漏掉EV6_1的细节:* N( |1 f3 u2 \6 a( C4 W$ n7 D/ @
" y4 p7 Q' I) D1 Q9 ?4 e  g' \
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
2 m- z/ t: X$ k. d: B' f$ `/ n9 I1 E( k4 f) V* M2 }
图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:! c  H- _7 ~8 V$ D0 ?

- ~" L3 T3 B: B. Y
  1. //事件6  O! k' o; p, S- }) e' F" A
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    $ w1 H& H) g4 w/ L# i) f( a
复制代码
  1. //事件6$ s: Q4 j5 \7 E1 \' a8 H
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    ; a5 w* G  w$ v# X* L) E( o! z9 g
复制代码
+ ^$ L! @9 `" V! t2 I6 G" `
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。
, U4 S# s9 y3 F& r% R) ^1 K$ z1 }+ F! B
67f078b7e07640b5bf3bb83fcf5945fa.png ' G1 y6 j& |& v
. @/ v6 E) ]; h$ T: ~
GPIO口初始化错了也有可能造成busy的情况。
4 `5 J. Y. @4 X. i# l9 T) e% i————————————————% w3 K  P6 K; l" k; R5 z2 d4 f
版权声明:外星人请走开
; D5 ^4 ?  d( z. K# N0 f: }如有侵权请联系删除
8 _. h8 y- s8 w4 Q2 k' a% v8 b! N3 m( e( n

8 a5 U" d, H0 }" M: W
( T. a3 K2 y) |3 t/ u
赞 收藏 评论0 发布时间:2023-5-23 17:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

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