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

STM32 硬件I2C bug解决方案

[复制链接]
ajane 发布时间:2015-1-5 16:49
古人说的一句,方法总比问题多,真的一点儿也不假
" F- a4 B  {. j- V4 \2 x
, p/ Y, w; m' |, r. {/ O) f硬件有问题,怕啥,大神来支招,就算是先天性bug,一样搞定
  p* C6 V7 J) `9 x3 |5 N最近看到一个硬件I2C bug解决的方案,特来与大家分享
0 ~# q0 s' e. X/ c9 Q1 E大神从芯片底层分析了为啥会有这样的bug,真大神也
( I, ]# Z% }1 P# ]0 i& C( Phttp://racede.me/talk_about_stm32_i2c_peripheral.html6 |/ V& C0 B) T2 o8 I! j6 a
后面给出的解决方案如下:
$ O) i, D/ V$ D) K
发送时:
$ S$ a0 m! h+ P" u
- K, v/ c4 T% T/ d- e开始,发送写地址,器件应答,清ADDR,一字节数据到写DR,硬件把DR数据写入到DSR,当DSR传输完毕时,DR也为空,BTF置位,这时我们再写一字节数据到DR,如此循环,最后一次BTF置位的时候发送P或者重起始(R)。这样操作,“硬件把DR数据写入到DSR”执行的时间是我们可以预料的,不存在上面提及的冲突问题。
' R; j1 P# F: g! H1 j" N! W" H. w! C2 r9 b1 C# c
接收时:
/ b7 [, M6 A* O. I: ?5 K% h' M1 c4 M  b  \9 F% Y, q
1、接收一个字节:按照ST给的方法。开始,发送读地址,器件应答,清ADDR前软件下拉SCL,写完NACK、STOP和DR后软件再释放SCL。RxNE时读DR。! s6 g5 _4 p! B/ f: b0 P9 Q- M1 H

7 t- Q+ e( z. H5 U& K: ~2、接收两个字节:也是按照ST的方法。开始,发送读地址,器件应答,设置POS和ACK,下拉SCL,清ADDR,设置NACK,释放SCL。BTF时,软件拉低SCL,发送STOP,读DR,释放SCL,再读DR。) S# k0 b3 W" k4 {, U6 p! E

# c. N8 i0 O1 V4 S- K+ o6 `$ E( Y3、接收两个以上字节:开始,发送读地址,器件应答,直接清ADDR。BTF时,读DR一次。再BTF,再读DR一次,如此循环。倒数第二次BTF时设置NACK(注意DR和DSR各有一字节的数据),读DR一次。再等到最后一次BTF时,软件拉低SCL,发送STOP,读DR,释放SCL,再读DR。
具体的,还是靠大家自己去参悟啦
0 {* y, T& q' X9 [+ d) M  \7 s: ]
收藏 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:561 r7 p. W; {' _
这种帖子含金量蛮高的,支持多发这种帖子
* g6 d* W- y, }! t. ^" w' L2 C) m/ m
斑斑见笑了
qianfan 回答时间:2015-1-5 18:59:43
之前调试的时候,就是多个字节发送的时候太麻烦了,用他的硬件发送的时候,看见勘误手册上写着,当发送一个字节的时候应该怎么办,两个字节的时候应该怎么办,实在是太麻烦了,后来直接使用模拟算了。
: K& q8 J7 e. h; w3 Z不考虑多主机的时候,模拟也是不错的选择。
ajane 回答时间:2015-1-5 19:02:27
QianFan 发表于 2015-1-5 18:59
* ], P( k* g* {2 [之前调试的时候,就是多个字节发送的时候太麻烦了,用他的硬件发送的时候,看见勘误手册上写着,当发送一个 ...

/ ]& O5 X4 V5 T1 k; R! h: J) U确实啊,模拟的,可移植性很强。硬件I2C,想规避bug的话,确实很蛋疼,不知道ST怎么想的,哈哈
qianfan 回答时间:2015-1-5 19:04:45
ajane 发表于 2015-1-5 19:02
% R& D* t6 r- u; c$ f. Y6 Y5 q确实啊,模拟的,可移植性很强。硬件I2C,想规避bug的话,确实很蛋疼,不知道ST怎么想的,哈哈 ...

3 O9 E$ f; t1 S! i; U2 i4 v$ g之前看过一个帖子,不知道是不是真的,说的是ST不愿意花钱买NXP的专利,于是自己做了这么一套。不知道是不是真的。
4 d/ \# W# ~+ w* z1 T$ [如果不想买专利的话,像ATMEL那样换一个名字不就好了
ajane 回答时间:2015-1-5 19:06:03
QianFan 发表于 2015-1-5 19:04
! Y9 y) d5 W4 @+ E之前看过一个帖子,不知道是不是真的,说的是ST不愿意花钱买NXP的专利,于是自己做了这么一套。不知道是 ...
) d, X+ `7 m$ \
坑。。。还好有大神支招,哈哈
qianfan 回答时间:2015-1-5 19:07:54
ajane 发表于 2015-1-5 19:061 A' ?0 N* I6 y$ Z% x! \+ i
坑。。。还好有大神支招,哈哈

# b; p, C, W( v) S' X) w另起一个名字,就叫什么ST-LINK,哈哈哈
ajane 回答时间:2015-1-5 19:18:08
QianFan 发表于 2015-1-5 19:07
, r, n5 g: \7 i5 n1 I5 g另起一个名字,就叫什么ST-LINK,哈哈哈

1 k2 H$ b& G6 ^  o( H: N全都是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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版