最近项目需要使用BLE通讯,因为没有使用USB,于是选定使用CC2541,价格能便宜些,性能还好(功耗小)。按照TI的例程很辛苦地写完程序,反复调试通过,于是准备小批量。没想到,有句话果然不假,最容易发生问题的时候一定会发生问题。程序放进去连BLE设备都扫描不到。
按照经验,这应该可以确定就是硬件问题。可是,硬件都是买的市场成品模块,怎么可能是硬件问题呢。于是陷入了一个死循环。经过反复烧写程序进行新旧的对比,终于发现是采购把一部分模块买错了,上面焊的是CC2540!于是只好修改程序。
下面进入重点,TI提供了CC2541和CC2540两个工程目录,源码使用的是相同的文件。因为既要用CC2541又要用CC2540,不希望每次重新打开工程,所以要对两个工程进行合并。IAR非常好的提供了这个功能。
首先新建一个工程配置,如下图:
然后New一个配置,这里起名为CC2540:
注意新工程选择的是基于CC2541的,相当于把CC2541的配置先复制过来。
之后在Workspace中就可以切换到CC2540的工程了:
这个工程是复制的CC2541,现在没有任何区别。因此需要接下来进行修改,概括如下:
1. 修改调用的库文件;
2. 修改工程配置参数;
3. 修改工程配置文件。
这三缺一不可。程序有可能也要修改,例如用到了IIC或者USB之类的,这个要具体分析了。
第1项:修改调用的库文件
首先,修改调用的库文件,在LIB目录上点击右键,添加Files,添加CC2540_BLE_peri.lib文件。这个目录要仿照下面那个CC2541_BLE_peri.lib(可以事先右键看一下该文件的目录):
添加完成后,在CC2541_BLE_peri.lib文件上点击右键,勾上排除编译选项,将该文件变灰色:
完成后如下图:
接下来还要到Workspace中选择CC2541工程,将CC2540_BLE_peri.lib文件排除编译,步骤同上,以将各自的工程源文件区分开:
第2项:修改工程配置参数
在Workspace中选择CC2540工程,然后右键选择option:
修改以下地方:
参数就这些,修改好就可以了。
第3项:修改工程配置文件
这个非常重要,TI使用了两个工程配置文件,但是我们只需要修改buildConfig.cfg就可以:
到源目录复制一下,要重命名做个区分:
用记事本打开,将所有CC2541修改成CC2540即可:
然后要回到上一步的参数配置中,要修改以下参数:
同样的,CC2541的工程文件也要这样修改,因为源文件已经被复制了。并且在工程文件中也要分别排除编译,这个跟第一步是一样的,效果如下,不再详说。
至此,必需修改的地方都完成了。
但是实际程序中可能还需要修改一些地方,我遇到一个看门狗问题也被困扰了一天。经过反复排查才发现,因为我启动了看门狗,换用CC2540的库以后,它的执行时间比CC2541的长,所以偶尔来不及喂狗,就被重启了,导致在扫描设备时总是连接不上。后来把喂狗程序放在osal_start_system函数里就可以了,这个函数在OSAL.C文件中:
所以看起来CC2540果然要被TI淘汰掉的,它的库都不如CC2541精简,可能很久没维护了吧。