STM322C硬件bug的认识.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32’s?I2C?硬件BUG引发的血案(qzm)  2010-4-8 1: 45 下面的函数中有一个BUG, 也就是SR2不能用WHILE来轮询,而应直接读出.如下面代码段, 因此,在这里说的这是STM32的BUG其实是我的代码的错误: ??? I2C2-DR = inerAddress[1]; ??? while( (I2C2-SR1Q_I2C_SR1_BIT_BTF)==0 ); ??? I2C2-SR2;?? // 正解 2010-4-1 1:44,一直都不相信STM32 的I2C接口会存在问题,因为工作经验无数次告诉我,嵌入式系统设计中的99.999%的问题不会是由于MCU本身的设计问题所引起,绝大部分都是硬件工程师或软件工程师的某个设计缺陷所造成的. 这次的设计经历也不例外. 由于终于可以抽多点时间用于设计STM32的I2C的软件接口, 因此, 决定重构之前用于主从STM32通讯所用的I2C模块(基于I2C中断+状态机收发)。I2C的中断发送模块很快就重构完毕并且强化了错误处理和I2C总线hang的自恢复功能代码模块(I2C BUS?Hang:也就是SDA 和SCL都被某Slave DEVICE拉低,大部分发生在主机接收从机传过来的数据包的最后一个字节的数据时,没有发送P(停止位)所造成的,这时Slave device (EEPROM)因为接收不到P,从而会DEAD LOOP地发送数据给主机,在主机方向看,I2C总线就相当于一直处于BUSY的状态,也就是网上问得最多的关于I2C的问题-I2C总线TMD的怎么会突然间死掉了、BUSY了、HANG的原因。)。 本以为I2C中断读模块也会很顺利地完成,但是却被卡住了一整天,只要加一个断点,在大部份代码处加无所谓,读FUN每次都正确执行,但只要全速运行,就只能运行一次,然后就过不去了,而且过不去的地方并不固定。由于DUBEG得有点集中不了精力,于是就做好问题的Brainstrom的笔记,放了下,晚上出差到深圳,到客户处做系统需求的讨论会,主要是上位机部分的。然后第二天晚上又赶回来,在车上的半梦半觉中让潜意思去思考。回到家后,选择在我的生物钟的最佳的时侯,晚上10点。开始重新在问题的Brainstorm处接着DUBGE。WORK PLAN如下: (1)把程序恢复到测试I2C写的测试用例状态,PASS。 (2)一小段代码就DEBUG一次的步步为营方法,按之前的思路把代码加入到读的模块(忽略防守代码,只加入必需的功能代码)。都OK后,全速运行,XXX,又卡住了。细过了一片读模块。PASS。于是进入计划中的(3) (3)全速运行,然后在可能卡住的地方加上断点,而不是之前的先加断点,然后运行的方式(这种方式,已确认PASS): 加了几处后,发现程序是在下面代码处卡住的: 但是奇怪了,每次我只要在箭头指向的语句后加上断点,每次都能PASS。于是知道要到 I2C_CheckEvent 函数中就能找到问题的原因了,于是做下面的几步,目的是把包含I2C_CheckEvent Fun的链接库中的stm32f10x_i2c.o排除掉,而把stm32f10x_i2c.c加入到项目中,使得DEBUG时能进入到 I2C_CheckEvent Fun 中去. 于是全速运行,然后在 stm32f10x_i2c.c中加上断点,终于捕捉到问题点了,分析如下图所示: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的长,而总

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档