首先说一下我跟安捷伦的缘分吧。大学毕业后,我进了一家电子企业做硬件研发工作。那还是我的菜鸟期,出学校之后最早接触的示波器是泰克品牌的。之后公司花20万买过2台新示波器也是泰克的。从那时起,我一直用的就是泰克的示波器。因此我也有了一个认知误区,一直以为泰克是示波器第一品牌(嘿嘿,没接触过其他品牌示波器)。直到进入现在这家公司,我才发现山外有山。进实验室发现,清一色的全是安捷伦的设备,示波器,频谱仪,信号发生器,电流表等。这些年来,这些设备帮我解决了各种各样的bug,协助我及时完成了一个又一个的开发任务。 本文是关于示波器的文章,所以其他设备先不说的,等以后有机会再写吧。我们实验室有2台KEYSIGHT示波器,一台是中端的DSO-X 3054A,500MHz 4GSa/s; 另一台是高端的MSOS254A,2.5GHz 20GSa/s. 先来一张图片吧:
再来一张高端型号的:
简单介绍一下这台中端型号DSO-X 3054A。500MHz,4GSa/s一般应用足够了,我也不做高频的,但现在都没用过那台高端的。4通道,带USB存储,操作简单易上手。
现在说一下解决问题的过程吧。
由于项目需要多个UART,而主控芯片只有1个,我需要用GPIO口模拟UART,软件+GPIO实现UART功能。由于不是什么复杂的功能,很快就完成了,无校验位,波特率9600,收发正常。我选了2个空闲的GPIO调试程序,调试完成之后需要切换到项目需要的GPIO上。这时出了问题了,每次reset之后,第一次发送数据,前面几个字节出错,后面就正常了。仔细翻看芯片的数据手册,2组GPIO没有太大区别,软件是一样的。唯一的区别是,出错的GPIO默认是SWD接口,程序初始化时,需要将这组IO设置为GPIO。刚开始我怀疑波特率太高,IO口反应不过来,将波特率降低之后,问题依然存在。反复分析,想不出所以然来,上示波器看一下IO的翻转情况,接着上图:
出错数据波形:
正确数据波形:
从上面的波形中可以看出,出错时,UART Tx信号线上第一字节的起始位没有。说明GPIO根本没有翻转下来。
这个就难搞了,可以确认软件没有问题,其他GPIO也没问题,偏偏是SWD复用的2个IO口出问题了。所以我怀疑是bootloader中将这2个IO口设置为SDW功能,进入用户main()程序之后,我们再将这2个IO口设置为GPIO时,出现问题了。
没办法了,寻求主控芯片的原厂技术支持。经过N多次电话+邮件沟通,问题确定了。这时我的DSO-X 3054A示波器立功了,上面2张图片发给原厂之后,立马定位到了问题。IO口由SWD功能转换为GPIO后,需要先将配置out_high寄存器,再配置in_out寄存器,否则就会出问题。这个细节就连芯片原厂都没注意到,所以手册上也未说明。
十分感谢KEYSIGHT示波器这些年来的陪伴与帮助,同时恭祝是德科技继续前进,锐意突破,给我们带来越来越好的测量设备。
此内容由EEWORLD论坛网友zzwan原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 zzwan 于 2017-3-2 17:31 编辑