搞过嵌入式开发的程序员一定知道有I2C总线,手机和电视中的主要串行技术,通过两条线SDA,SCL解决总线传输,地址区分和热插拔问题的技术。

  可是就是这么一个简单的东西,让我这个自认为有些经验的单片机开发者浪费了整整五个月!这还是我有比较充分的经验,在一年半前就已经非常了解I2C协议的情况下!这段时间我花了无数的时间在调试,思考,解决问题而没有一丝进展。反复的检查问题,想要的结果死活不出来!昨晚的反思让我今天早上我一大早起来第一件事就是调代码,结果正确出来的时候,眼泪都快出来了。这篇文章,总结下这五个月来的问题,这五个月给我好好的上了一课。

  五个月前,初步规划方案阶段:

我做的体感项目发展到了第四代,为了尽可能的减少尺寸和功耗,将原来的64脚IPM封装的MSP430F149换成了更小,功耗更低的MSP430F2132。选择该型号有显然的好处:32QFN封装,硬件I2C,自带上拉电阻,16MHz的功耗更低。我们使用了原来所用的ADXL345加速计,MPU3050陀螺仪和HMC5883L的磁场计解决方案。在前一版的MSP430F149上是采用模拟I2C总线,而上述传感器挂在这条总线上跑起来都毫无问题,只要焊接无问题,就一定能保证正确结果。而事实证明,这种自信确实是最后的罪魁祸首。

  四个月前,第一版制作失败:

换方案后,板子确实做得非常小,只有硬币那么厚,小拇指那样的细条。我们在设计上花费了很多精力,保证尽可能小的体积和封装。PCB制版,焊接,上电,加速度计工作非常正常,而其他传感器返回都为错误。我们一看这个情况,I2C出来啦!单片机没问题!推断只能是传感器焊接问题。重新焊接,不行?那可能是布线和焊接问题。之所以考虑是焊接,是因为那种芯片非常难焊,所有管脚都在芯片屁股下面。如果技巧不够,很容易出现焊接不良的情况,以前的多数问题都是焊接问题。

  解决了一些小的布局问题以后,准备做第二次板。

两个月前:第二版制作失败:

  第二版做出来之后,出现了更严重的问题,每次上电调试,第一次程序还能写进去,第二次就不行了。再用万用表测,电源短路。上面的所有传感器都烧掉了!后来才知道,用的助焊剂非常好用,但导电!如果不洗干净,就会出现短路的问题! 后来我们都把板子直接泡到酒精里。

新的问题又出现了,单片机工作很不稳定。经常出现调试写入不正常,程序跑飞的情况,板子也会变得特别烫。用示波器一看,电源纹波相当大,在电源芯片旁边的电容烫的不能用手碰。仔细分析,原来是我们使用的电容值没有达到正常标准。这句话就在电源芯片PDF中的某一个非常不起眼的地方...更换以后,这部分没问题了。

可是,I2C还是出不来!加速度计的0X00寄存器返回0XEF值,原本以为是对的,但实际上应该是0xE5;加上驱动程序一跑,发现加速度计根本没正常工作!其他寄存器有的值读出来是错误的,比如写入0x3E,读出来却是0X5F.有些根本就不能读!但磁场计却能出来~陀螺仪永远出不来! 这是为什么呢?既然磁场计能正确读值,说明单片机和I2C总线软硬件都没问题,难道加速度计和陀螺仪芯片是假的??    

  我们骂了一遍那些“万恶的”淘宝卖家,重新买了一批传感器回来。因为硬件制作确实严格按照要求做了。我们高兴的以为,这不是我们的问题,开心的等待着顺丰把芯片送回来。同时,继续改进电路,完成了第三版。

  一个半月前:第三版的I2C依旧有问题:

     芯片买回来了,新PCB到货了,兴冲冲的上电,发现问题依旧,磁场计能出来,加速度计问题依旧,万恶的0xEF。陀螺仪还和往日一样,完全没反应。这下尴尬了!

焊接问题?!我们找了手机维修的大牛,仔细的给我们焊了一遍。同组的同学也认真的焊接好多板子,出现的还是一样的问题。

  软件I2C问题?但为什么磁场计能出来?所以没问题

  电路问题?仔细查过,没问题。所有的布线都OK,测试都联通。

  单片机?工作的挺正常啊,JTAG调试都没问题啊,让它输出高电平就是高,输出低就是低,上拉电阻乖乖的焊上了。我不认为它有什么问题。

  所有的选项都排除了,我只能把它归结到自身:你平时太堕落了,老天看不下去,故意让你遇到这种最恶心的问题。那段时候,我极度迷信。事实上,这套系统我在PC端上开发了足够强大的服务器端,采用了最新的技术和设计方法,几乎硬件一调好,系统就能工作啊!各种应用接口,通信流量监测,识别算法,插件系统,自然交互界面,无所不用其极。这个项目不属于我正常的工作范畴,算是“周末项目”,做着玩玩赚点小钱花,但并不表示我对它不重视。它让我很有动力的学了很多的东西。有点意思的是,如果不是这套体感系统,我也不会这么钻研.NET程序开发,也不会在博客园开博客。哈哈。

  半个月前:绝望

  就像前一段,按照我的逻辑把所有的问题都考虑了一遍(后来想,真的是这样吗?)依旧无果。我已经不知道怎么做了,我变的迷信癫狂不知所措。可能是这个项目本身给我带来了太多的好处,老天已经觉得它应该退出我的人生舞台了。

  可是我真的能放弃么?花了那么多钱,当然钱是次要的,那么多时间和精力才是关键。如果现在放弃,原有的那些东西都没有了任何价值,最多证明我学过某门技术。我的无数思考和结论都没有了意义。    最主要的是,我困扰在了我原本认为最简单的问题上,它不可能解决不了呀?!怎么回事!

好多次我11点多从实验室回来,一晚上的时间继续白费,还是出不来.....

  我翻了好多技术资料,发了好多询问帖,有人会帮我回答,但那些问题我都挨个排查过了,没有问题啊、

  我甚至不相信逻辑,觉得数学书上的证明都是扯淡,谁也没告诉你1+1一定等于2。我生活在一个不可知的世界。

  我会经常做梦,梦到传感器都出来了,然后兴奋的一塌糊涂,早上起来插上板子,发现问题依旧,还是"0XEF",还是错误的I2C!

最近:契机

我逐渐的将注意力集中在了单片机上面,是它的问题么?我虽然了解I2C协议,看过了各种可能的问题,并严格按照I2C协议写了代码。但我开始怀疑它在通信的时候到底做了什么。我为什么不用示波器看看波形呢?它输出高低电平无误就证明你该相信它么?

波形捕获证明:它出现了中间电平。 数字电路只有0和1,不可能有中间电平这种东西!如果出现,只能是电阻分压!  在与ADXL345通信时,这个问题表现得尤为明显,MHC5883L通信时,中间电平变低了,正好落在了单片机能正确检测的范围之内。

那么,出现了不该出现的电阻,它在不合时宜的地方出现,分解了本该正确的电平值导致了单片机端口电压检测错误!电阻从哪来呢?我明明已经关掉了单片机的上拉电阻使能,按照PDF的说明,这应该也是没有问题的。但肯定就是单片机问题!

昨天:心血来潮

     正好是圣诞节,疯玩了一天,晚上回来,还是决定去实验室看看。将板子的I2C总线引出来,去掉CPU,接到了原来的MSP430F149软件I2C引脚,上电,三个传感器都毫无压力的出来了。非常流畅和清晰!就是单片机问题!

  换单片机?代价太大,如果换掉,那么所有的板子都要重做。而且原来的尺寸太大,所以原来的外观设计都要推倒重来。如果这一步迈出去,我们五个月来的辛苦基本上都白费了。真的要这样么?原来的程序没问题啊!或许只能这样了。

我不信,MSP430提供了硬件I2C,为什么不用硬件I2C试试看呢?原来尝试过,但很奇怪所以没有继续深入。那我就要和你死磕。从晚上9点钟开始到12点宿舍熄灯。找到了一份完整的关于硬件I2C的代码模板,不过有些问题,明天继续。

今天:成功!

6点钟睡不着了,想着那些事情,我赶紧坐起来,趁着自己有些精神,赶紧看那些代码。昨天晚上太累,好些地方写错了。修修改改,哦?有点意思啊。再改掉了中断的代码和其他的一些问题之后,加上驱动函数,加速度计正常工作!陀螺仪正常工作!磁场计正常工作!

究其原因,是MSP430F2132和MSP430F149的端口结构不一致导致的,2系列的单片机存在上拉电阻和一些额外的配置,导致一般的模拟I2C代码移植到该单片机时,检测高低电平的时候无法正确判断。但硬件I2C不存在这个问题,只要外部加上拉电阻,就能正常工作,具体细节我还没有仔细论证分析,等待几天之后的分析结果。

  那一刻,我有点晕,有点不想说话。反倒是很平静。这种事情,从来都不会有那种“放着不动就能成功”的情形。但还是赶紧跑出去给队友打了电话。兴奋之情完全不用形容~原本这一刻,是准备在做好板子焊接完成后的五分钟搞定的,我花了五个月时间。经历了各种痛苦和无语,它今天总算出来了。项目因为这个问题卡的死死的没有半点进展,如果早出来的话,现在几乎已经做完了.....%>_<%

  对这个成功,我真的无颜大肆渲染,这可能是一个本科生的简单小实验而已,把我足足干掉了五个月的时光。它不是什么历史性时刻,它仅仅是一个普普通通项目的简单开始而已,仅仅如此。

总结: 

     这部分可能是最本文关键的部分。我的盲目自信和粗心让我在如此简单的问题上困扰了整整五个月。这些问题让我快崩溃。写在下面的:

任何事情首先建立反馈,能让我们真实的知道内部发生了什么,串口,调试JTAG,液晶屏,或者是示波器,逻辑分析仪,这些都是非常得力的助手。

不怕一个问题出错,怕就怕在它是半对半错性质的,对的那方面很容易让你排除本身应该存在的问题,掩饰错误的真正原因,HMC5883L我恨你。

仔细看手册说明!我什么时候学的坏毛病:喜欢跳读,大致明白什么意思就行了。可是,那些问题就藏在原本跳过去的地方(不过对我这个问题,单片机手册上还真没说明,否则我真能看出来,但电源芯片配置不正确烧板子的事情,却绝对有关联)。

这个世界是有逻辑的,如果它出错,那么肯定是有内在问题,上帝非常公平。

  认真严谨的工作态度,详细分析问题的能力——这两句是我写实验报告时经常写的,但我实际按照要求做了么?没有!别人给你传授经验为什么很多情况没用?来自真正努力地实践,而这却是好多人挂在嘴上而又特别缺乏的,包括我。多数问题真的都是个态度问题。

这个问题让我险些放弃了整个项目,因为越来越大的实验室压力和考试压力,让我不知道该怎么走下去。实际上再过几天调不出来,我就很可能放弃它了,它往后的故事也不会再有了,也更不会有这篇文章了。文章虽长,可我写它的时间不超过调试上面那个问题的五十分之一。

这个问题虽然不大,但确实是自我出生以来让我最无语的问题,仿佛死死的卡着脖子不能说话,痛却说不出来。

我很感激陪伴我度过这五个月的队友,我妹妹,还有好多关心我的人。我还相信一件事情,我虽然是党员,但我也是“二元论”者,这个世界有物理规律支撑,同时,天在看,地也在看,努力工作,好好待人待己,这个世界都不会亏待你的。

作者:热情的沙漠
出处:http://www.cnblogs.com/buptzym/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

标签: 嵌入式开发, 经验
本文转自FerventDesert博客园博客,原文链接:http://www.cnblogs.com/buptzym/archive/2011/12/26/2302475.html,如需转载请自行联系原作者

半年之殇:困扰半年的MSP430的I2C总线问题在今天解决,发文总结相关推荐

  1. 计算当前周、月、季、半年、一年和上周、上月、上季、当前半年的上一个半年、上年的开始和结束时间

    下面的例子是一个完整的工具类,记录了各种获取开始时间和结束时间的方法,其中本人用过的个别方法为开始时间和结束时间格式为 2019-10-10 00:00:00 ,2019-10-10 23:59:59 ...

  2. 菜鸟程序员的成长之路(三)——2014,逝去的半年,奋斗的半年

    从3月份到现在,仅仅半年的时间让我扮演了两个完全不同的角色,从在校生一下变成了毕业生,作为毕业生不能再像在校生一样自由自在,无所顾忌,想怎样就怎样,肆无忌惮的生活,浪费时间.如果你想从容的面临未来的生 ...

  3. oracle近半年统计,oracle 按半年统计解决办法

    oracle 按半年统计 现在遇到一个oracle统计语句,按半年统计  有id,time字段, time为yyyy-mm-dd的varchar2类型.还有一个是按季度统计,求大神指教... orac ...

  4. 一个困扰数学家30多年的分类问题,终于被解决了!

    来源:AI科技评论 作者:Steve Nadis 编译:陈彩娴 编辑:青暮 一般情况下,当你要对某个特定地区的植物进行调查时,你可能会按植物的种类来划分. 就这种方法来看,如果是沿着托斯卡纳海岸的某些 ...

  5. 雷军:年轻人入职半年内不要对战略和业务提意见,很多想法都不靠谱

    整理 | 王晓曼 出品 | 程序人生 (ID:coder _life) 5月24日,在2021年小米校招生培训会上,雷军建议新员工在入职公司的前半年,不要对公司战略和业务提出任何意见,要多听.多看.多 ...

  6. 湖北职称计算机考试报名时间2016,湖北2016年下半年职称计算机考试报名时间延长通知...

    [摘要]环球网校编辑为考生整理"湖北2016年下半年职称计算机考试报名时间延长通知"的新闻,我中心通过调查了解,下半年全国专业技术人员计算机应用能力考试所有场次虽已报满,但仍有考生 ...

  7. ltsc系统升级为服务器,微软宣布Windows Server 2022开始转向LTSC 不再发布半年频道更新...

    前段时间蓝点网提到微软对旗下操作系统生命周期进行调整,其中Windows 10长期服务版生命周期缩短至五年. 而即将推出的Microsoft Office LTSC支持周期也将为五年 , 但Windo ...

  8. 【半年总结】——2015.08

    时间总是匆匆而逝,从不会因为我们的不舍,而停止前行的脚步.这半年对自己来说,还是收获颇多,这半年的充实,成为学生时代不能抹去的回忆! [技能篇] 关于学习篇的内容,我觉得今目标是对我们学习历程留下最好 ...

  9. 半年收入50万,揭秘知识付费操作方法

    什么叫知识付费? 知识付费的本质,是把知识变成产品或服务,以实现商业价值. 用我的话来讲,就是:想学啥玩意儿?来,给钱,我教你. 知乎,喜马拉雅,企鹅FM,千聊荔枝APP这些平台都开通了知识付费项目, ...

最新文章

  1. 树莓派3b+目标检测: tflite 运行 mobilenet ssd
  2. Mysql的建表规范与注意事项
  3. 数据库无法保存中文的解决
  4. 4G发牌或提早 电信联通面临艰难抉择
  5. struts2上传文件
  6. 设置日志不记录指定类型的文件,日志文件的切割,配置静态元素过期时间
  7. javascript基础知识总结
  8. plsql创建、测试存储过程
  9. 【滤波器】基于matlab脉冲响应不变法+双线性变换法数字滤波器设计【含Matlab源码 884期】
  10. 【算法原理+洛谷P6114+HDU6761】Lyndon分解
  11. 基于Flink CDC实现实时数据采集(一)-接口设计
  12. 基于C++的教师信息管理系统
  13. atto软件测试速度,基于ATTO的传输速度VS文件大小测试
  14. 以下mysql说法正确的是_下面关于 MySQL 的说法中,正确的是_商务统计学答案_学小易找答案...
  15. 努比亚android P的功能,努比亚Z17Android P 正式版已开启小批量FOTA推送
  16. Python3 语音识别谷歌验证码
  17. python如何设置清华镜像源
  18. Ps简单的墨笔画制作
  19. 批量替换ppt内容_在office宏中运行即可
  20. 【正点原子MP157连载】第二十八章 A7和M4联合调试-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

热门文章

  1. oracle 删序列,oracle创建和删除序列
  2. shell脚本面试题
  3. 威客php,phpapp威客系统下载
  4. 华为抓取错误日志在哪里_抓取网址进行分析爬虫工具Screaming Frog SEO Spider for Mac...
  5. python3 pygame load图片不显示_Python——mac下pygame踩坑,绘制图像不加载
  6. CLion + OpenCV 开发
  7. Flex布局演示01
  8. 【BZOJ1923】外星千足虫,高斯消元解xor方程组
  9. 1.极限——例子_3
  10. 限制ul显示高度_led显示屏钢结构吊装方案原则及适用条件