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

STM32 硬件I2C bug解决方案

[复制链接]
ajane 发布时间:2015-1-5 16:49
古人说的一句,方法总比问题多,真的一点儿也不假5 t' u! D: D5 Q/ n9 C! L

  _2 E; K- i, E4 F硬件有问题,怕啥,大神来支招,就算是先天性bug,一样搞定
' x! Y. c) U2 n3 {  T( C4 ^6 u最近看到一个硬件I2C bug解决的方案,特来与大家分享
% O, p' x+ ], |  J5 A; [4 V) d大神从芯片底层分析了为啥会有这样的bug,真大神也: X1 q! E, U+ L& W9 P+ _! k2 p
http://racede.me/talk_about_stm32_i2c_peripheral.html
3 M1 M8 d& Y0 \, d# X后面给出的解决方案如下:
6 t' B/ i) B7 Y  N) p( y2 b8 m
发送时:
. a5 ^( G! |" [# x2 `" b4 `0 e' S% A5 A3 m' L9 O
开始,发送写地址,器件应答,清ADDR,一字节数据到写DR,硬件把DR数据写入到DSR,当DSR传输完毕时,DR也为空,BTF置位,这时我们再写一字节数据到DR,如此循环,最后一次BTF置位的时候发送P或者重起始(R)。这样操作,“硬件把DR数据写入到DSR”执行的时间是我们可以预料的,不存在上面提及的冲突问题。
8 {8 T/ |! s' v4 j! c$ z: i4 A0 l' [* o3 I0 w5 Z9 _0 e6 D
接收时:
0 b5 {  D5 W% x. `9 [! A% [% L( J1 v; ]4 |$ k4 x
1、接收一个字节:按照ST给的方法。开始,发送读地址,器件应答,清ADDR前软件下拉SCL,写完NACK、STOP和DR后软件再释放SCL。RxNE时读DR。
' m% b- g- H$ O1 r7 Q
) I2 ?2 M5 Z9 T+ ]' a8 [4 J2 R; E+ k9 r2、接收两个字节:也是按照ST的方法。开始,发送读地址,器件应答,设置POS和ACK,下拉SCL,清ADDR,设置NACK,释放SCL。BTF时,软件拉低SCL,发送STOP,读DR,释放SCL,再读DR。# c  a4 J2 `) D& f

& C5 x3 T; ^- Z2 t3、接收两个以上字节:开始,发送读地址,器件应答,直接清ADDR。BTF时,读DR一次。再BTF,再读DR一次,如此循环。倒数第二次BTF时设置NACK(注意DR和DSR各有一字节的数据),读DR一次。再等到最后一次BTF时,软件拉低SCL,发送STOP,读DR,释放SCL,再读DR。
具体的,还是靠大家自己去参悟啦* M2 U+ Q% X0 M& H& d
赞 收藏 2 评论14 发布时间:2015-1-5 16:49

举报

14个回答
巅峰残狼 回答时间:2015-1-5 16:56:27
这种帖子含金量蛮高的,支持多发这种帖子
ajane 回答时间:2015-1-5 17:04:42
巅峰残狼 发表于 2015-1-5 16:56
4 K  ^: A# [1 K7 m) X这种帖子含金量蛮高的,支持多发这种帖子

! }* z2 ]& k4 j. T7 D斑斑见笑了
qianfan 回答时间:2015-1-5 18:59:43
之前调试的时候,就是多个字节发送的时候太麻烦了,用他的硬件发送的时候,看见勘误手册上写着,当发送一个字节的时候应该怎么办,两个字节的时候应该怎么办,实在是太麻烦了,后来直接使用模拟算了。
! P. D  @% F( G1 d0 K* d不考虑多主机的时候,模拟也是不错的选择。
ajane 回答时间:2015-1-5 19:02:27
QianFan 发表于 2015-1-5 18:59
, M& P5 p0 Z- _& C: ?# [& D之前调试的时候,就是多个字节发送的时候太麻烦了,用他的硬件发送的时候,看见勘误手册上写着,当发送一个 ...
; z0 z0 q8 ]- a7 t& }; B8 m. ?) r& h
确实啊,模拟的,可移植性很强。硬件I2C,想规避bug的话,确实很蛋疼,不知道ST怎么想的,哈哈
qianfan 回答时间:2015-1-5 19:04:45
ajane 发表于 2015-1-5 19:02
; c3 K3 a' X! P$ @8 o( H: i确实啊,模拟的,可移植性很强。硬件I2C,想规避bug的话,确实很蛋疼,不知道ST怎么想的,哈哈 ...

" R) r0 R8 U1 \2 Q8 j0 u& t之前看过一个帖子,不知道是不是真的,说的是ST不愿意花钱买NXP的专利,于是自己做了这么一套。不知道是不是真的。  i8 r! @0 M3 a/ C, n9 `  l
如果不想买专利的话,像ATMEL那样换一个名字不就好了
ajane 回答时间:2015-1-5 19:06:03
QianFan 发表于 2015-1-5 19:04
8 f2 {! Z( [% O# N% t5 V  u; J之前看过一个帖子,不知道是不是真的,说的是ST不愿意花钱买NXP的专利,于是自己做了这么一套。不知道是 ...

. @( _. A: ^  H; k, i# L坑。。。还好有大神支招,哈哈
qianfan 回答时间:2015-1-5 19:07:54
ajane 发表于 2015-1-5 19:06
4 }7 Y9 F" U5 t0 o' c6 e! W坑。。。还好有大神支招,哈哈
( W* U' a8 L" g/ Q4 q! y
另起一个名字,就叫什么ST-LINK,哈哈哈
ajane 回答时间:2015-1-5 19:18:08
QianFan 发表于 2015-1-5 19:078 {/ k1 O% ?& B7 r/ u: K. U
另起一个名字,就叫什么ST-LINK,哈哈哈

0 V$ `8 ~2 f( C; }0 j全都是Link,也凌乱了,哈哈
stary666 回答时间:2015-7-17 10:08:22
顶一下,,,,,,,,,,
JackieLaura 回答时间:2015-7-17 10:49:21
不错的资料,去试试看了。。
stary666 回答时间:2015-7-17 14:01:05
st的i2c是很烂的,我就遇到问题了,用中断发送数据时,会多发1个0
zhlking2001 回答时间:2017-2-5 10:38:24
感谢分析分享!!!
zbber 回答时间:2017-2-5 22:22:22
之前调试的时候,就是多个字节发送的时候太麻烦了,用他的硬件发送的时候,看见勘误手册上写着,当发送一个
joelai 回答时间:2018-9-10 22:16:11
感謝分享

所属标签

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