一、Altium Designer Winter 09
第一块板子做的是关于“USB收音机”,这块板子我画的很仓促,原理图是参照用户手册画的,基本上是抄板。但是我要修改的是样板上的一块收音芯片,把他换成更高级的模块,由SPI转到I2C。由于想学好布局和布线,光这个板子我就画了一个星期,花了不下9块PCB,都用手工布局布线。最后画出来的成品经过老总的经验修改,变的还像个样子了,但是经过实际焊接编程测试后,还是有诸多的问题。
焊接好后的板子需要测电源和地之间的电阻,如果小与300欧姆则有短路。
以下是我第一个PCB项目所总结出来的经验:
1.画图之前必须先了解好各个芯片的“极限参数”和“引脚定义”这些信息可以通过参考用户手册得到。
如:我就是因为没有详细的参考,导致整个供电系统都瘫痪了。c8051f321是3V的芯片我错误的弄成了5V;接USB的话VDD为导出3.3V,我直接给他接USB电源5V;这个芯片虽然各接口是可编程控制的,但是支持外部中断的只有P0口;而且此芯片是通过C2编程的,我画图的时候还错误的以为是通过串口下载,连用什么开发环境我都还没搞清楚;我也以为这个芯片不支持I2C,需要硬件模拟,才发现它支持SMBus,这个模式是兼容I2C的等等。
2.原理图复杂的分模块画,各IC最好按手册封装连线;由于原理图是导出PCB的关口,必须保证原理图正确无误才能导出PCB,各元器件最好把值标注在注释上。
如:我是分模块画的,先画完模块原理图,再由各模块导出总图,实话很方便很好管理;特别是我原理图有问题的时候,直接调出要修改的模块修改。我的IC原理图封装有几种,一种是按手册来的;另一种是图接线方便把引脚顺序都弄乱了;因为我在调试板子的时候要对比接口修改接线,查看PCB的话太乱了敷铜,过孔各种颜色眼花啊,直接参考原理图很给力。只要原理图正确了,导出的PCB电气接线就不会错,只管花心思在布局和走线了。AD09有个问题,一个新建的PCB文件只能由原理图更新一次,再次就会有问题,必须移出重建PCB才能再次生成PCB。
3.原理图如果要导出PCB,就必须有元器件封装,大部分封装都可以参考手册,但是必须结合实际情况做适当的修改,各元器件最好有边框,要考虑焊接等问题。
如:IC的封装我画了3次,第一次搞错了封装的类型,因为没有看懂手册就开始画了;第二次完全按照手册封装画,结果出来的PCB焊接成问题了;最后我听老总的把各个引脚接线都延长了1mm,这才算是完成了。有些自带的原理图要修改封装可以用shift+f查找同类批量修改,只要元器件库加载进来了,直接修改名字就行了。
4.布局先放IC再放周边元器件,必须得考虑数字,模拟,高频等信号不能互相干扰;各元器件发热情不能相互影响;尽量考虑到走线的简单。
如:我开始布局很乱,虽然都元器件都是围绕着芯片的,但是各方面的信号根本就没有考虑进去。滤波电容和晶振应尽量靠近IC,我同样没有考虑。画了9块板子逐渐在改进,但是问题还是很多,我觉得应该要和高手多讨论才有进步。这次多亏了“一个传说”,他帮我把第10个图修改了下,把所有考虑的问题都想到了,使我大开眼界。我认为布局是需要参考原理图的,这样就能知道元器件大概的摆放位置。
5.走线就是越简单越好,尽量走最短线特别是高频信号,推荐自动布线再调整或完全手工布线。
如:走线是建立在布局的基础上的,若布局没好就走线,肯定是乱无章法。走线不能垂直,且要尽量简单,能弄成直线就别让它弯曲;过孔得考虑大小(工厂工艺限制)。地线>电源线>信号线。
6.敷铜就是敷地,分区域敷铜能把不同的信号给间隔开,可以参考拓扑结构。敷铜上尽量排列整齐过孔,IC若有底座也需要放置过孔(需大些,考虑焊接过锡和不能虚焊)。
如:敷铜是最后步骤,必须把持好。先敷铜再放过孔,需要覆盖的地方应用填充,这样下来一个板子基本上完成。
PCB要求
贴片封装:0603,1206
过孔大小:30mil/15mil(IC底座过孔要更大)
信号线粗:10mil
电源线粗:15mil+(芯片周边不要求)
地线就是:敷铜
规则间距:8mil
二、Keil uVision4
接下来是下位机软件的设计了,还好这个项目有参考设计,我只需要在别人的基础上修改就行了。但是这修改却不亚于重新开发,我需要由原来的收音芯片si4701(spi接口)换成si4750(i2c接口),开发真正困难的地方是没有详细的参考手册,我连芯片的寄存器都没有。老总还算厚道,帮我弄来了,但是资料很老,很不详细。没办法也只能硬着头皮干了,谁让他是我boss呢。
我把所有通信协议都改了,利用一个全局数组替换掉原来的寄存器,初始化为0(可以判断上位机是否有数据过来,有则赋值就不为0了),然后通过循环检测此数组数值是否不为0,若不为0则执行相应数组元素的操作,执行完后赋值0。考虑到内存不够的问题,我这里只设置了几个重要的寄存器数组。
下位机经验:
1.必须得弄到详细的资料才开工。
如:这点我是做到了,因为我比较懒,没弄好资料我是不会动手的。我谷歌百度都没有芯片寄存器控制的,于是我直接到芯片官网上去查,结果也没找到,我当时别提有多郁闷了,硕大的一个公司怎么就连个资料都没有,找到的全是芯片的概要。走投无路下我就在官网技术区留言,当然外国网站也只能用英语了,大概意思是“给我一个si4750的寄存器控制资料”,邮箱也附上了。然后我再网络上面搜索si4750的控制例程,奶奶的还真有。大大缩短了工作进度。
2.裁剪不需要的功能模块,根据实际电路做适当修改(I2C等需要地址的通信要强烈注意)。
如:我找到的例程是si475x的控制,则是这一个系列的控制,我刚开始没有考虑到内存和si4750不支持的功能,于是我果断吃亏了,调试了很久芯片就是耐不活,而且我还没把I2C的地址换过来,害了我好几天啊。
3.一个模块一个模块的做,最后再整合。
如:这个项目有几个功能模块,因为有现成的参考设计,我就直接全部一起调试,直接用上位机去接收USB通信获取的收音信号,同样好几天无果。后面我听一个朋友说得先弄出声音来,我就开始单独调试si4750了,然后在输出音频信号的口上接了个3.5mm的通用接口,用音响来测,功夫不负有心人,我成功了,然后我就这样一个一个模块的弄,最后整合。
4.合理利用idata,xdata等内存。
如:由于加进来的模块都用idata和xdata,我这芯片c8051f321内存很有限,于是程序干脆就跑不起来,直接死机。idata和xdata一般是用于优化内存的,没用好结果你懂得。
5.各功能模块函数得注意存放地址(通过keil4预设)。
如:这款芯片是可以直接通过编程读写flash的,很方便,然而就是保存上位机配置的那个const unsigned char Host_data[512]数组就是保存不了配置;通过调试我发现这个数组的地址和函数编写地址有冲突。最后终于发现是编译器调整地址来实现的,在KEIL4的Options for Target->BL51 Locate->Code处填上?CO?F320_COMMAND_INTERPRETER(0x3600),?PR?RADIO_FLASHER?F320_COMMAND_INTERPRETER(0x3800), ?PR*F320_COMMAND_INTERPRETER就对了。用法可以参考keil4的手册。
开发套件(以下均来自官网)
C8051F 配置:ConfigAndConfig2Install
KEIL4 下载:SiC8051F_uVision
USB再开发包:USBXpress_Install
三、Microsoft Visual C++ 6.0
下位机弄好了,就可以进行上位机的开发了(这样好调试修改)。同样有参考设计,由于下位机通信协议全改了,则根据需要修改上位机协议即可。因为这个参考软件做的极其的丑陋,我差点就想用QT重新搭建了(这是MFC工程),考虑到我用掉的周期已不容小觑了,所以忍住了手痒。
上位机经验:
1.找到入口函数,然后分析看懂整个流程(修改下位机同)
如:开始看着这堆代码就发晕,因为文件多,代码量大,不过还好每个模块文件就一个类。我只能从入口开始分析流程,然后看懂整个框架。因为只能看懂了程序才能进行修改。
2.在关键函数处设置messagebox或其他能导出信息的函数,查看具体值变化。
如:如果我没有这样去做,我相信我会累死的。
3.掌握好数据后,就可以修改协议和功能了(这里需要和下位机共同修改开发)。
如:我开发c++项目不多,大多都是直接sdk开发。而这个软件是mfc做的,果断现学现卖啊。不过我没打算学mfc,毕竟很老了,我选择学习QT对于嵌入式来说更实在。
工具:
只要有vc编译器就成,我用的是vs2010,把vc6转换过来一样的,不过发布的时候需要有动态库,当然也可以静态编译。
四、总结
通过这次的方案设计,我确实成长了,学到了很多的东西和经验。我也挺佩服自己的,作为一个新手独立完成了这个项目,不过我想也是必然,因为高中的我就会做软件了,呵呵~我需要再接再厉,多做多学,为以后做嵌入式物联网打下坚实的基础。