系统简单描述下就是传感器采样数据,通过UART与CC2541通信,CC2541将接收到的数据通过蓝牙发送到PC端。CC2541接收的数据是通过缓冲的方式,当接收满20个数据时,将这20个数据统一通过蓝牙发送到PC端。
要实现的功能很简单。蓝牙部分的设计、调试似乎也都挺顺利。但是当把传感器与蓝牙部分连上后,发现PC端的曲线含有大量的杂波,用串口调试工具去看,也会有相当多的乱码。
开始以为是干扰,换屏蔽线、关闭板上DCDC改用稳压电源供电等一系统措施之后,现象仍然存在。
换一个思路,拿掉传感器,将CC2541的串口接到PC端,通过串口调试工具发送固定的数,发现曲线还是存在杂波,杂波似乎还挺有规律。下面是用TI的软件DeviceMonitor抓取的文本数据。
图中我简单标了几个受干扰的数据。
后来也是通过TI的官方论坛和相关文档,查找到了原因:
原来CC2541在出厂默认情况下,当CC2541的射频工作时,即蓝牙发送或接收数据时,CPU会停机(halt),这是为了减小射频工作时的峰值电流。所以在固件设计时,要进行相应设置,把CC2541在射频工作时CPU halt的功能去掉。可以在初始化的时候,调用下列函数:
HCI_EXT_HaltDuringRfCmd(HCI_EXT_HALT_DURING_RF_DISABLE);
关于这个函数,可以参考TI的文档《TI_BLE_Vendor_Specific_HCI_Guide》P45,下面的截图就是文档中对该函数的描述。
可以看出,TI为了减小CC2541的功耗真是无所不用其极,哈。按文档中的描述,Disable掉这个功能后,峰值电流会增加。因为手头没有精密工具,只是用万用表打到电流档串到电路中,对比测了下平均电流,从这个工具上看不出什么变化来。当然,因为这个项目就是要串口一直工作,所以不能让CPU休息,以免乱码,我们也不在意多出来的这点功耗。
希望我遇到的这个情况,能给一些朋友有帮助或启发。当然,文中提到的函数也要慎用,以免增加额外的功耗。
附件是TI的HCI文档:
http://www.eeskill.com/file/id/28121。