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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy/ O0 H; @2 y+ {) y0 Y$ k5 G
我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。
7 T- Z9 u- g, `4 ~
  1. //停在这里
    - E9 _1 [8 a  K
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
    3 t! g  F9 W/ V* e. B
复制代码
2 A3 O6 x9 J+ ^6 q( W% z5 u2 K" f4 ~
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。
) g) k9 o9 }7 Y* i8 o( C& f
- ^, }) u% S2 z+ {; c8 w$ u重新查看手册发现我之前漏掉EV6_1的细节:, _  L& R& I& D: W8 p" J1 n# G
* L3 t4 r7 Z- J, |% X3 r
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
2 v$ c2 V; m- v; q$ Y! p
% C1 s) W$ L& G$ h6 T3 Q$ |图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:
) ?" D" e$ \& o$ l0 x' M: z1 _0 W
/ _( a8 G9 P! e0 O1 _( o
  1. //事件6
    8 B8 w! Y- ^, M7 j
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));( I. f( z" V& ?* d- ]  M; {
复制代码
  1. //事件6: \5 |) j1 X) U) b0 ?
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));4 X- b' r7 b/ ^1 i+ u' `" v2 ?
复制代码
1 q3 [$ j8 ^) u1 p
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。  Y6 G1 Q& z3 A+ u

$ q  F& F1 y9 W  V
67f078b7e07640b5bf3bb83fcf5945fa.png - N1 ^( F- t6 h4 c- W* a0 t6 L+ {

  y0 s* L2 a3 T3 O1 e& fGPIO口初始化错了也有可能造成busy的情况。3 I. e) m! v) h2 p7 }
————————————————& \3 Q$ i, T$ G0 O3 l7 r( k
版权声明:外星人请走开7 T' ~* X7 b0 O: O! v
如有侵权请联系删除
2 A6 H0 D- u  @8 L8 a* {( s, z- k9 I/ B' N2 c0 g' ?- h5 J  U3 z
2 l2 i+ m* \+ e/ p1 L0 b# m

/ E, t2 {/ x* A& `$ a* @
收藏 评论0 发布时间:2023-5-23 17:16

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版