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

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

基于stm32f1硬件I2C busy问题

[复制链接]
攻城狮Melo 发布时间:2023-5-23 17:16
硬件I2C一直停留在busy
$ Q- M/ [5 q5 D. D1 W, o7 z5 n我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。4 x+ p9 w+ W( r) d$ p( k
  1. //停在这里8 A5 U) Y- _8 }8 G# w) w
  2. while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));& q! R7 J9 c! I6 B
复制代码
3 l5 Y' U. P. _$ C( p* j! g. x
看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。
+ t0 k) Q& f+ Y; Q5 _
  n  v  x) g7 g重新查看手册发现我之前漏掉EV6_1的细节:& f% R/ K0 U/ v! \1 j/ \

. t5 {+ X8 a' k: p4 v# T
9d959a5bce9d4bcdbb77e0fbf4150e8f.png
. l' j4 S/ I7 A0 s6 I" w* K( E, y
: `9 D! u  d1 {' J5 s9 I' G图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:- ]8 m( n5 v( U' ]8 l% G$ F

. W# `5 B( \" Q$ D# y5 e) p
  1. //事件6
    ; r0 h' s1 |, N
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));& u' h+ H9 ?% |+ U
复制代码
  1. //事件62 Y: {% `7 h" l, I" c' `
  2. while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    & b. P9 r5 {: F1 J8 k- _- ?" q# Q1 }
复制代码

8 h2 l, M+ P$ M; c$ I- d7 o我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。
, x" _* U4 d- Y) c" J: f! D$ q# g" s- n! @% I) ]1 I. \
67f078b7e07640b5bf3bb83fcf5945fa.png . K6 T0 |% L) `! X( S

3 \% k. K7 ?* L  AGPIO口初始化错了也有可能造成busy的情况。4 B6 ?0 P' U) F# u
————————————————
, m% U+ a# g. N1 [1 O2 k! t版权声明:外星人请走开
- ~# H: u7 L' Z% s如有侵权请联系删除
0 \9 M' t1 @; X
7 e" T/ v) g+ E% B
0 f: N1 g1 p/ P6 l
" ]2 d: @: a, \3 q4 t9 ^' A1 h. M, F
收藏 评论0 发布时间:2023-5-23 17:16

举报

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