搞过嵌入式开发的程序员一定知道有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我恨你。
仔细看手册说明!我什么时候学的坏毛病:喜欢跳读,大致明白什么意思就行了。可是,那些问题就藏在原本跳过去的地方(不过对我这个问题,单片机手册上还真没说明,否则我真能看出来,但电源芯片配置不正确烧板子的事情,却绝对有关联)。
这个世界是有逻辑的,如果它出错,那么肯定是有内在问题,上帝非常公平。
认真严谨的工作态度,详细分析问题的能力——这两句是我写实验报告时经常写的,但我实际按照要求做了么?没有!别人给你传授经验为什么很多情况没用?来自真正努力地实践,而这却是好多人挂在嘴上而又特别缺乏的,包括我。多数问题真的都是个态度问题。
这个问题让我险些放弃了整个项目,因为越来越大的实验室压力和考试压力,让我不知道该怎么走下去。实际上再过几天调不出来,我就很可能放弃它了,它往后的故事也不会再有了,也更不会有这篇**了。**虽长,可我写它的时间不超过调试上面那个问题的五十分之一。
这个问题虽然不大,但确实是自我出生以来让我最无语的问题,仿佛死死的卡着脖子不能说话,痛却说不出来。
我很感激陪伴我度过这五个月的队友,我妹妹,还有好多关心我的人。我还相信一件事情,我虽然是党员,但我也是“二元论”者,这个世界有物理规律支撑,同时,天在看,地也在看,努力工作,好好待人待己,这个世界都不会亏待你的。