硬件I2C一直停留在busy
8 _& y# Z, Z% {) f我尝试配置f1的硬件I2C,写好程序后读取一下mpu6050的I2C地址,只读取一个byte,调试代码时发现I2C写操作没问题,但是读取操作加入之后I2C一直停留在busy。. F ]$ g% i2 w& ]- b/ M- ~
- //停在这里
0 H" e* ]4 _) s1 s |8 i - while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));1 }$ K4 r7 m* w/ g! I( ~: a) `
复制代码
) Q/ m4 M; l6 w看了几篇博文,开关I2C->CR1的最高位SWRST并且重新初始化也不行,误打误撞遇到了博主lalalaxy的文章,文中提到需要在接收数据前把SDA拉高,还提到要注意数据手册中的清零细节。
, P( D) S" w _7 v2 e0 d2 i2 v: ]/ o6 D0 \+ t& _5 Z/ ` V7 U% [
重新查看手册发现我之前漏掉EV6_1的细节:' N D% a/ z; r' w9 [! t
. `/ B+ P7 r/ J; ?$ W0 y. \
9 l3 u9 G# l) F- S
3 ?- e& X$ ]' w$ y( } L图中提到EV6_1这个事件对应只读取一个byte时的操作,并且在标准库中没有相应的flag操作。所以这里的操作需要手动完成,即在事件6之后加:$ O q* q4 o" i+ }4 v) W6 ^
0 }' P& Z$ v- J% c: s3 Q
- //事件6 ]4 v; I5 t* A% q0 b
- while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
; X0 `- Z, Y% a$ X% B5 A2 N
复制代码- //事件66 T- L8 p) E9 r+ X; l$ B
- while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
1 G, c9 G9 {+ c0 x4 { n
复制代码 * f! C7 V, t5 W- O
我没有在读数据前将SDA拉高,I2C通讯也可以正常读取,目前尚不知原因。
* j- j7 x4 _0 a2 Y
( g) ?5 ~8 g- j# G) j
% @6 i5 i# h" x
# o) H" T5 X6 Q' `5 ?2 K1 ZGPIO口初始化错了也有可能造成busy的情况。
) t7 {9 U8 a8 H/ z————————————————+ l+ a' S' @* R) B4 g
版权声明:外星人请走开
6 F1 j% Q: b# H$ X" \) _2 z( I5 }如有侵权请联系删除+ z- m; Q+ q' N. T- o9 o
9 m0 K4 ~) z3 n2 j: R' B1 ?1 z% f _; J: R
- ^3 Q& i* z2 z9 G5 n$ ~, s6 }
|