原创 使用可靠的I2C代码

2014-5-6 00:04 1031 5 11 分类: 消费电子

现有的STM32的I2C代码,由于没有使用STM32官方推荐的DMA+I2C中断优先级最高的方式,总感觉用着不放心。想要修改,却又不知道如何改是更好地。于是想查找I2C驱动部分处理的好的代码,参照将现有I2C部分程序重构下。在查找了一些代码库文件后,比对了现有的I2C程序,发现EFM32的I2C库代码部分处理的很完备。使用的是硬件I2C+超时处理机制。而且超时处理也有适当的处理。有可能是EFM32的库代码出的时间较晚是2012.11月份的,写的比较完善。但是STM32却没有更新固件库,提高代码的安全性。
虽然现有的STM32固件库有超时处理,但是调用的函数是一个while(1)也即,如果出现了超时处理,就要进入死循环了。而EFM32的处理则要明显好得多。EFM32在进行超时处理,重新初始化了I2C,并且返回错误。从这一点看,STM32的参考代码只适合功能性实现,如果用于产品中,产品则会陷入不知觉的死机中,而且很难查找到。而EFM32的库代码用于产品代码中,则会更安全一些。
最后,对于在产品中出现的硬件操作代码,对于从设备的操作,一定要有超时处理。虽然一般情况下,很难出现什么问题,但是如果存在这样的概率,当批量后就会有一个死机的概率,虽然出现的概率很低,但是如果一个产品出现了,对于这个产品本身而言就是100%的不良品。而且,由于外界的影响,所有的产品都会有可能出现死机,这个问题很严重。虽然,可以通过外部看门狗来解决,使CPU自动重启。但是在多任务应用中,这样的处理并非简单。甚至有可能十分复杂。
最后,在底层中一定不要存在

 

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <span style="font-size:18px;">while(condition)  
  2. {  
  3.     ;  
  4. }</span>  

 

如果要用,也要加上超时处理:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <span style="font-size:18px;">while(condition)  
  2. {  
  3.     if(timeout)   
  4.     {  
  5.          handle;  
  6.          break;  
  7.     }  
  8. }</span>  

(当然,也有不得不用的时候,这样的机会很少)。

文章评论6条评论)

登录后参与讨论

1989tie_959541171 2014-5-8 09:19

对于技术处于不断学习中,自己的经历决定了存在没有遇到的事情,存在思维的局限,存在思维的边框。技术的发展,就是不断看到局限的存在,并打破局限。

1989tie_959541171 2014-5-8 09:15

写一个能用的I2C程序不难,难的是写一个运行不会出错的I2C程序。当系统运行负载加重,频繁的中断会干扰当前硬件I2C的一些状态。从机的一些意外,也会造成I2C操作出现异常,如何在I2C异常的时候,恢复正常(不是依靠看门狗复位)。这里边,要注意的地方就多了。这也就是,为什么ST后来I2C历程改为DMA+I2C中断高优先级的原因。/*-----*/如果说写出能用的代码能是80分,写出可靠、安全的代码就要是95分。虽然,只有十几分的差别,但是要考虑的东西,就很多了。

chen.yf_216513558 2014-5-8 08:30

刚才没注意 竟然两天评论你的这个i2c 感觉你们的技术人员能力有限 st提供的例程只是供参考,你们当然要根据自己的需求来做,还找别的厂家的例程。这不是更浪费时间。 一个i2c的问题通过降频只是临时避开了 真正根源还没找到 这样做产品,产品质量没保障,技术水平始终就是徘徊

chen.yf_216513558 2014-5-8 08:24

i2c接口很简单啊 自己写一个又不麻烦 何况这还是硬件i2c,设置几个寄存器就完了

312819595_633478710 2014-5-7 09:27

谢谢分享

emmalu_951035627 2014-5-6 15:33

感谢分享!

jameszhang00_936339388 2013-11-5 10:08

等他们都死光了,我们和美国的差距终于缩小了

cdmone_738948464 2013-2-22 11:36

首先自己要坚持.我三十五岁时,想到要离开这个行业,与一位比我大十岁的台湾资深工程师交流.他说看看你身边的硬件工程师,还剩下几个做了十几年还在做模拟电路的人,关键是有几个能做到你这个水平的人,超过你的人会更少.模拟技术需要时间积累,而且要有耐心,兴趣,善于总结才行. 其次要学习新的技术知识,抓住技术发展点.嵌入式技术是必须要掌握的.

zxj 2013-2-21 18:01

模拟技术是一种沉淀,没有经过相当的产品和岁月难以达到一定的高度!

shaoqi97_188673783 2013-2-19 11:14

坚守自己的那份执着。 技术本来就是份享受寂寞的活,成功的路上没有鲜花和掌声,靠得是你对其的一份热情和执着。
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
广告
我要评论
6
5
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /5 下一条