请选择 进入手机版 | 继续访问电脑版

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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy* S7 Q% A0 E' Z) e
我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。  M$ |* x# S3 Y. N- _, x# w4 j& k
  1. //停在这里
    - b0 Z- o& z! V# A6 S
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));8 u; n* O$ v1 M" H) w
复制代码
* `8 K  a3 L/ D% r
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。8 b0 j" Z$ d6 |' ~

' t! P) ^& ?7 V( \! f% N重新查看手册发现我之前漏掉EV6_1的细节:1 \7 c" X, d# u+ }) _" m
: U) P% z+ D0 h+ Q8 f
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
0 Q! `6 D4 {) G# j2 K6 p1 b" O. P/ _
图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:( W3 y( _" X7 g( S8 ~- G# z2 i& e/ [) E
. _# B6 {# c9 d, ~: B2 q5 g7 ?
  1. //事件6
    , x7 p6 T; M0 \' }
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    * @1 P- ~* i6 l/ I5 M
复制代码
  1. //事件6
    & [2 S0 h4 a, P$ W! x8 N
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));- `2 L3 ~* j5 u/ d( W5 [8 ]6 W
复制代码

3 y* w8 z7 X$ k: ?+ L3 E我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。; m$ b: K2 [2 s- e7 L. y
6 }; n; W7 u" g' P, L
67f078b7e07640b5bf3bb83fcf5945fa.png
' n" L2 v/ w' Q# y) W3 l$ i+ y: _0 x, ~9 C! g$ J3 I
GPIO口初始化错了也有可能造成busy的情况。5 V: i* n( |$ P& }2 [
————————————————! b  Z( Q- s# Q7 n: `4 M4 \
版权声明:外星人请走开# s. l( G/ H5 [- K9 B
如有侵权请联系删除8 }5 ~: ^9 K0 O' l9 n
, q: w; q# x# o: B# c
- B; [- l4 r( ~, u
/ n- W1 }' \1 ?7 A
收藏 评论0 发布时间:2023-5-23 17:16

举报

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