中国自动化学会专家咨询工作委员会指定宣传媒体
免费注册 登录 广告服务 | 客服中心
您现在所在的是:

嵌入式系统

抖音 德嘉 泓格论坛 FLIR红外热像论坛
工控论坛首页 嵌入式系统 → 浏览主题: STM32 I2C 难点hint
发表新帖 回复该主题
回帖:0个,阅读:1898 [上一页] [1] [下一页]
* 帖子主题:

STM32 I2C 难点hint

分享到
1137
xingsharp
文章数:119
年度积分:48
历史总积分:1137
注册时间:2005/3/2
发站内信
08年优秀博客奖
发表于:2010/4/8 1:51:41
#0楼
  i2c 总线在所有嵌入式系统中用得极广, 是一个工业级别的总线, 但由于stm32 是一个32位的mcu, 注定了他的i2c硬件接口将会功能强大, 但同时也会较难于控制,不象8位机,如avr8位机的twi(实际完全符合 i2c标准) 那么易用. 以下是我的stm32 i2c硬件接口编程的一些心得体会.
   如果你选择了stm32, 说明了你的项目的需求是比较复杂的,使用embedded os 和大量地运用中断+dma的编程模型是必然的选择, 如果你的项目中用stm32,而你用模拟的i2c的话, 说明了两点: 一是浪费了stm32; 二, 如果你的项目很复杂的话,你会发现在项目的开发后期,好象stm32也比8位机快不了多少, why!! ,但这不是stm32的问题,而是你没有最有效地利用上stm32.
   很多朋友在搞stm32的i2c接口编程时总是时不时“当在某处”(google时你会发现这个问题很普遍), 一些朋友这时就会用软件来模拟i2c,然后,很快发现和i2c设备能很好地通信了(但当机还是可能随机出现), 这些朋友于是大骂stm32的i2c硬件接口是个”杯具”(呵呵,我有时也会突然想骂骂,但我知道,99.999%的原因还是自已对于stm32硬件接口的熟悉程度不够,或者说,是我没有扬stm32 i2c的长,而总是捉住他的短不发。)。
   固然,stm32 i2c硬件接口有设计不完善的地方,例如下面就是我从stm32最新的errata sheet中总结出的,关于stm32 i2c接口设计上的一些缺陷和如何避开这些缺陷的推荐程序模型:
(1)把i2c的中断优先级提升到最高
(2)把发送多于2个字节的发送与接收封装成利用dma收发的函数,而把对某i2c设备接收和发送一个字节的函数单独封装为一个polling (轮询)函数。
(3)在寻址某一i2c device时要先check i2c bus 是否busy,如果忙,则等待指定时间,如果还是忙就说明i2c bus 挂了(原因99.9%是由于我们的i2c通信时序并不十分尊守i2c规约,或者我们所封装的i2c通信模块没有加上防守代码(出错恢复代码)),这时要调用一个专门的用于通知 i2c bus上的所有device,让他们结束当前内部的工作,重新准备好(下雨了,收衣服啦)。如下面的我的i2c模块的fun 切片:
[URL=https://32qjdg.blu.livefilestore.com/y1m1wdzvm1ebljnttmkhtoual3w-vzgol1uy9vqz_lrfqbit-jnieyprj2bftbxdynorpkmufzy-uoz0t4llabsfa6pvlwaex8dj7cpvqwn6tj6jcencma-5zaekvvi0lf4gmctjid1evpu1chs2pqceq/image[3]%206d341a3d.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1mk34dk2nrp60gcg0fbaazutfzn45qyuna2zjx1hzy1cyjzpah7nqtryanf-jadbryhlubtfo42tmw89no9tlskrippklcqdbvus1k8v5vblagc2hoztb7ifiroqm34qaal33dktbicdzyzgm5deyzzq/image_thumb[1]%2034242da7.png[/img]
[/URL]
该函数一定要用在主mcu的启动模块上,因为i2c总线在充当master的mcu启动时,sda和scl有可能组合出刚好符合i2c规约的时序组合,比如一个开始位(start condition),使得i2c bus 立即当在那里(因为当主mcu真正需要发出一个start condition时,发现i2c bus 正处于bus状态,而根据stm32 手册的start condition说明可知,一个起始条件将会使得i2c bus处于busy 状态, 下面的i2c2_free_buf fun 的基本用法:
[URL=https://32qjdg.blu.livefilestore.com/y1m_ssrq2aepqalayr6iqykq3qxtmoqigkl-9wmu_gt8s_g2o6iw60rhnrbwpdy16qmlnlvaq9fp90ufbl1qunypnfisgmropc7izazkwxaook3mturcxdzoigs-r2nevnpbnrqaw-rcgeii93lgwmdpa/image[7]%20147c444b.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1mq9cci7liqzentfteekltcm8kxssuwc7wkw1z2jbm-vsitfw-srq6djryyo051n_hj4gvznsaxokbz23rcwthab2vatlmzyyw-1hazblvbh61hjxojeik9xxqleuznufzccqrzxhw-vch-425rsbvaa/image_thumb[3]%20628b942c.png[/img]
[/URL]
提示:摘自stm32 手册:
   i2c.sr1.bit 0 位(sb)- start bit(master mode)
   - set when a start condition generated.
   - cleared by software by reading the sr1 register followed by writing the dr register, or by hardware when pe=0.
(4) 不要让i2c工作在88khz的频率上,低于或者使用fast-mode(400khz)频率,这是stm32 i2c真正的一个硬件bug(99.999%机率),但是也是可以编程避免的。
(5)programming the bit nostretch=0  in the i2c_cr1 register. 这样也可避免一个stm32 i2c硬件设计的一个小bug(2。9。5节)
(6)大部分的mcu的硬件i2c接口的工作模式是中断(高端的会用dma)+状态机;因此状态机的编程概念要熟悉
(7)stm32 i2c的硬件接口负责实现满足i2c总线的的规约,而我们(嵌入式编程开发者)则是通过i2c 控制寄存器和i2c的事件标志组合来启动状态机,然后让状态机按照由i2c sr1 和sr2所组合志来的事件自动工作,并在发送或接收完成后通过flag的方式或信号量的方式通知我们所写的读写函数,操作已经完成,或者在操作中出现了错误,如最常见的af错误(device 在第9位上没有拉低sda应答master。)
(8)i2c sr1 和sr2的功能分配(
这是一个极易忽视的思考死角

   从stm32 手册的i2c register map 中可以看到, i2c的sr1,主要是反映i2c通信的最基本的标志,要清除sr1的某个标志可以直接清除,而i2c的sr2即是辅助sr1的,他一般反映了i2c总一当前的工作状态,如busy,是主机模式还是从机模式,等等。关于sr2的很重要的一个编程模型是:要清除sr1的某些指定的标志位时,比如addr,先读sr1然后再读sr2将会清除掉已置位的addr。
(9)master在操作slave device时要先和他握一下手是很好的防守编程模型:
[URL=https://32qjdg.blu.livefilestore.com/y1mfgyffcshevgx_vaa35lhol-vpb56oe4lo3nw-9ywyou_baitofywjwos2i1mz6hbyqr7j9_zhzujx5n8es2asbsfjrecjgihotd9-abysxshqanbu3eeols_-u3vkqqhd62qxps-swy5dudpopvv-w/image[11]%202814f413.png]
[img]http://blog.gkong.com/https://32qjdg.blu.livefilestore.com/y1mqteyjcwwoflhhcxoqgl9cid5l80hcqutzrlrzqsfrx7rdtmd3d1y_t5-1ts74nmtioadslfjiggcmgasdkomdzqerhvivsip5unmr1-fwy7g658orjhvm6vxykk3rjgfinxk3pttehl3sb8qar5dpq/image_thumb[5]%202168dafc.png[/img]
[/URL]
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=113287&Name=zjcsharp
工控学堂推荐视频:

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002