本篇博文最后修改时间:2017年05月22日,19:53。
一、简介
本文集合了香瓜整理的CC2541的新手常见问题,不断更新。
二、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:[email protected]
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
三、新手问题集
1、新手入门,有什么好资料吗?
答:
1)开发板购买地址(阿莫开发板):https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-15079397444.5.rERmvK&id=38116104998
2)开发资源(必装软件+书籍):http://blog.csdn.net/feilusia/article/details/49031709
3)学习博客:
①甜甜的大香瓜(897503845):http://blog.csdn.net/feilusia
②Naner(317243293):http://blog.csdn.net/zhuangjitongxue
③阿莫(11940507):http://blog.csdn.net/mzy202
④ziye334:http://ziye334.lofter.com/view
⑤将来将来(804023718):http://blog.csdn.net/xiaoshideyuxiang
4)学习交流群:
①香瓜BLE之CC2541:127442605
②香瓜BLE之CC2640:557278427
③香瓜BLE之Android群:541462902
④香瓜单片机之STM8/STM32:164311667
⑤香瓜单片机之Linux群:512598061
⑥香瓜单片机之职场交流群:450154342
2、新手入门,如何学习较快?
答:所谓“磨刀不误砍柴工”,该看的书要看,书不在多,看完任何一本都可入门。
该跑的例程要跑,多自己想办法解决问题,仅靠问别人来学习,那是像驴一样被鞭策前进。
我提供我的学习方法:
1)看完整本《蓝牙4.0 BLE开发完全手册》。
2)把开发板的初级到高级的例程全部跑完,详细看例程对应的每个pdf文档。
3)技术群、论坛中多交流,不局限于提问,多帮助他人。
4)将技术知识写成博客,分享给大家,让大家一起阅读、测试你的博客,一起完善你的博客。
5)做项目。
3、为什么有些工程会异常(打开时软件崩溃退出、编译没错而仿真却出错、使用别人的工程出错)?
答:很可能是移动过了文件夹导致了IAR查找不到了文件路径。
要养成好的习惯,拿到别人的工程,要做以下两步:
1)将整个工程文件夹放到“无中文、简短”的路径下,如“E:\”。
2)打开工程后rebuild all。
4、为什么我的串口收发不正常、串口乱码?
答:http://blog.csdn.net/feilusia/article/details/47431659
5、为什么有些函数中有些变量前加void?
答:这是防止编译警告。去掉这一句,IAR会警告这个id没被使用。
6、为什么工程中有些是灰色的文件?
答:IAR中的文件都可以选择“编译”或“不编译”。打叉的文件是不编译的,如果工程中需要编译它,可以点击该文件右键——Options——把Exclude form build的勾去除。
7、工程中的“CC2541DK-MINI Keyfob”是什么?
答:iar允许在一个工程中自定义多个配置,用于同一套代码对不同板子的快速切换。
“CC2541DK-MINI Keyfob”就是TI公司的一块开发板对应的工程配置,我们通常会选择“CC2541”这个配置(推荐)。
8、CC2541的工程能下到CC2540中、CC2540的工程能下到CC2541中吗?
答:不能。
9、为什么我的packet sniffer抓不到通信数据包?
答:http://blog.csdn.net/mzy202/article/details/32408223
10、手机端有什么蓝牙app好用吗?
答:
安卓端APP: BLE Device Monitor、truthblue
IOS端APP:Lightblue
11、下载线需要几根?如何连接?
答:http://blog.csdn.net/feilusia/article/details/48680611
12、CC2540和CC2541有什么区别?
答:http://blog.csdn.net/feilusia/article/details/47068757
13、从机怎么给主机发送数据?
答:http://blog.csdn.net/feilusia/article/details/47020073
14、为什么我的按键按了没反应?
答:http://blog.csdn.net/feilusia/article/details/47336473
15、我用HalLedSet函数开led,为什么有时会闪烁?
答:如果开启了低功耗,在主轮询期间会间歇性进入低功耗,在HalSleep.c中的halSleep函数内会短暂关闭led。
(调用的是“HalLedEnterSleep();”)
解决闪烁问题的两种方法:
1)不使用低功耗。
2)在iar设置中先“HAL_LED=FALSE”,然后直接对寄存器操作。
16、IAR版本与协议栈版本该如何选择?
答:
建议使用如下对应关系:
1)iar8.10.4可以使用1.3.2的协议栈
2)iar8.20.2可以使用1.3.2和1.4.0的协议栈
3)iar9.10可以使用1.4.1的协议栈
注:当高版本的iar(如9.10版本)使用低版本协议栈(如1.4.0版本),可作如下图的修改来达到编译通过。
17、CC2541通信时一个数据包最多能传几个字节?
答:20个应用数据+几个底层数据。
18、怎么样的手机才支持蓝牙4.0?
答:软硬件方面同时达到以下要求:
1)软件上:安卓4.3版本以上。
2)硬件上:支持蓝牙4.0。
注:苹果手机iphone4S开始支持蓝牙4.0。
19、为什么手机自带的蓝牙软件扫描不到CC2541的广播?
答:
支持蓝牙4.0的手机的蓝牙大多数都是双模的,也就是支持CC2541这类的BLE蓝牙,还支持蓝牙耳机这种大数据类型的传统蓝牙。
而自带的蓝牙软件就是可搜索蓝牙耳机,而不能搜索到BLE,因为他们协议不一样。
如果想搜索到CC2541,需要下载一个支持BLE的APP来搜索。
20、为什么2541flash只有256K,却能下载大于256K的hex?
答:因为实际下载进2541的flash里的是bin文件。hex可以理解为“包头数据+bin+校验数据”(详情自行百度),总之hex比bin大,hex大小约为bin
的2倍多一些。
21、如何查看工程的bin大小?
答:
1)生成bin文件后查看:生成bin的方法请参考论坛上方的香瓜博客,《CC2541之OAD》。
2)在IAR的编译信息中查看:
点击iar上方的Tools——Options进行下图的设置,然后rebuild all。就可以看到代码中实际的flash使用情况。
22、CC2541是否能同时使用两个串口?
答:可以,一个使用dma方式,一个使用isr方式。
24、为什么阿莫开发板的smart rf的oled不亮?
答:阿莫开发板的lcd与ti的oled不一样,所以需要拿阿莫开发板的oled驱动替换掉协议栈的oled驱动。
详情:http://blog.csdn.net/feilusia/article/details/48878347
25、使用BTool软件时显示超时,是怎么回事?
答:http://blog.csdn.net/feilusia/article/details/50817128
26、为什么有时候IAR中设置不了断点?
答:IAR断点最多设置3个。可以点击view-breakpoint,将已有的断点全部删除后,重新设置不超过3个的断点。
27、仿真状态下,为什么查看的变量值看不到?
答:因为变量被优化了,只需关闭IAR优化后,再次仿真,即可通过watch窗口查看变量值。
28、IAR8.20、IAR9.20破解版在哪里下?
答:http://blog.csdn.net/feilusia/article/details/49031709
29、为什么看到别人代码中使用notify时,用到的特征值句柄为0x002E、0x0035,哪里来的?
答:数值为多少对我们程序员来说并不重要,我们只需要能获取到这个值就可以了。
详情:http://blog.csdn.net/feilusia/article/details/47020073
30、为什么看到别人代码中使用GATT_Notification(0, &pReport, FALSE)的连接句柄是0?
答:数值为多少对我们程序员来说并不重要,我们只需要能获取到这个值就可以了。
详情:http://blog.csdn.net/feilusia/article/details/47020073
31、进行修改了CC2541端的名称、修改了CC2541端的特征值等操作,为什么手机上显示的仍然是之前的显示数据?
答:
原因是app缓存了这些数据。在更新过CC2541的代码之后,都需要清除手机端的缓存!!!
常用几种清缓存的方法:
1)关闭app、关闭蓝牙总开关、打开蓝牙总开关、打开app。
2)手机重启。
32、win10下安装PL2303的驱动,出现感叹号,安装不成功怎么办?
答:http://jingyan.baidu.com/article/c85b7a646f1db5003bac95be.html
33、设备的蓝牙广播几秒后停止、蓝牙通信连接容易断开,是怎么回事?
答:
1)信号不好。
2)(最常见)设备中有耗费大量时间的事件在处理,导致广播周期被迫停止、导致连接通信超时。如:采集adc耗费了500ms,很容易造成广播停止、蓝牙断开。
解决方法:增大连接间隔(CC2541默认连接间隔为80ms,可增大为100ms+)、缩短事件处理时间(如将adc的500ms压缩至50ms,总之这个时间必须小于连接间隔)。
35、哪里有CC2541生产时使用的一拖多下载器?
答:
阿莫有售卖此套设备,链接:
https://amomcu.taobao.com/category-1134731048.htm?spm=a1z10.5-c-s.w4010-15079397457.9.h7LMfb&search=y&parentCatId=1134731046&parentCatName=%CD%D1%BB%FA%C9%D5%C2%BC+%2F+%C1%BF%B2%FA%B9%A4%BE%DF&catName=%A9%C7CC2541%CD%D1%BB%FA%C9%D5%C2%BC%C6%F7+1%CD%CF16#bd
36、如何添加特征值、如何修改特征值长度?
答:http://blog.csdn.net/feilusia/article/details/48235691
37、CC2541主机端如何实现自动连接、断线后自动重连?
答:可以参考《CC2640之主机端自动连接》:http://blog.csdn.net/feilusia/article/details/52687155
38、CC2540、CC2541都能作为packet sniffer的抓包工具,进行抓包吗?
答:CC2540可以,CC2541不可以。TI没提供2541的抓包hex。
39、CC2541被手机连接上以后,是否还能广播数据让其他设备搜到?
答:连接状态下可再广播,但需要IAR设置中修改宏成PLUS_BROADCASTER。
可以参考《CC2541之连接时广播》:http://blog.csdn.net/feilusia/article/details/49125777
40、32M、32K外部晶振能不能省略?
答:
1)需要用到蓝牙功能时,32M外部晶振不能省略。
2)需要用到低功耗时,32K外部晶振不能省略。
可以参考《CC2541之32.768kHZ外部晶振》:http://blog.csdn.net/feilusia/article/details/48543029
41、CC2541的OSAL中使用的定时器是哪个定时器?
答:timer2。
详情:http://www.deyisupport.com/quest ... y/f/45/t/23544.aspx
42、请问协议栈中的SimpleBLECentral例程,如何修改才能搜索周围的ble设备(如手环等)?
答:SimpleBLECentral例程在扫描时做了扫描过滤。
1)如果想把所有设备添加进来,把simpleBLEFindSvcUuid函数的使用注释掉即可。
2)如果想增加一个UUID的从机设备,添加:
else if(simpleBLEFindSvcUuid(……))//新的UUID
{
//增加设备
}
可以参考《CC2541之解析simpleBLECentralEventCB》加强理解:http://blog.csdn.net/feilusia/article/details/48678067
43、CC2541的RF工作频率是多少?
答:
CC2540:RF frequency range 2402~2480MHz
CC2541:RF frequency range 2379~2496MHz
44、CC2541的adc采样位有几位?
答:12bit,最高位为符号位,实际有效采样为11bit。
45、CC2541从机如何获取主机MAC地址?
答:
在simplebleperipheral.c中有:
uint8_t peerAddress[B_ADDR_LEN];
GAPRole_GetParameter(GAPROLE_CONN_BD_ADDR, peerAddress);
46、主机端接收灵敏度如何设置?
答:
47、BLE的认证是怎么回事?
答:
如果产品上有蓝牙logo,则要BQB认证。
如果要出货到美国,要FCC认证。
如果要出货到欧洲,要CE认证。
48、ANCS是什么?
答:
苹果通知中心(Apple Notification Center Service, ANCS)。
1)CC2541是从机,IOS是主机且不需要app。
2)CC2541是客户端、IOS是服务器。
3)ANCS必须要绑定(不一定要密码)。
4)基本步骤如下:
①CC2541广播。
②IOS连接。
③绑定过程。
④CC2541扫描IOS的服务和特征值。
⑤CC2541打开IOS的notify开关。
⑥IOS有来电时,发送notify消息提醒包给CC2541。
⑦CC2541发送读取电话的指令给IOS。
⑧IOS返回电话数据。
49、CC2541从机的广播间隔拉长为3S,导致CC2541主机连接很慢,怎么解决?
答:
可以在CC2541主机端开启高速扫描:
TI的GAPCentralRole_EstablishLink连接函数的第一个参数,false改为ture。
50、simpleBLEcentral工程连接simpleBLEperipheral后,发现服务很慢,如何解决?
答:
工程在连接之后默认为延时1S才去发现服务,可以缩短这个时间。
51、如何知道一块CR1632(120mAh)在自己的设备上能用多久?
答:
1)使用示波器测试设备电流以及电流持续时间。
2)通过测得的数据,算出电流平均值。
例如:1秒1次RF通信、RF通信持续1ms,其中RF通信时电流有18ma,其他时间段为10uA。
那么电流平均值=1秒内总电流/1秒=(18000uA*0.001S+10uA*0.999S)/1S=28uA。
3)计算有效电池电量
例如:CC2541有效电压是2V以上,CR1632是额定电压3V,因此CR1632的120mAh对于CC2541都是有效电池电量。
4)计算使用时长=有效电池电量/电流平均值=120mAh/28uA=120000uAh/28uA=4285.7h=178.6天。
52、如果从机申请更新参数失败了,会执行什么操作?
答:
GAPRole_SendUpdateParam函数中的最后一个形参,即是更新参数失败后的执行操作。
它一共有3个选项(无动作、重发、断开连接):
#define GAPROLE_NO_ACTION 0 // Take no action upon unsuccessful parameter updates
#define GAPROLE_RESEND_PARAM_UPDATE 1 // Continue to resend request until successful update
#define GAPROLE_TERMINATE_LINK 2 // Terminate link upon unsuccessful parameter updates
53、为什么我用GAPRole_GetParameter(GAPROLE_CONN_ADDR,peerAddress)获取主机(手机)的mac地址后,每次重启后mac地址就变了?
答:由于手机安全机制,不会以真实mac地址去连接蓝牙设备。但cc2541作为从机可从绑定信息中获取真实的mac地址,参考代码如下:
idx = gapBondMgrResolvePrivateAddr( pDevAddr );
if ( (idx < GAP_BONDINGS_MAX) && (pResolvedAddr) )
{
VOID gapBondMgrGetPublicAddr( idx, pResolvedAddr );
}
break;
54、如何将多个hex合成一个hex?
答:
1)写多个hex进芯片里。
2)从芯片里读出1个hex。
3)就可以拿这个hex下载带多个芯片中。
55、蓝牙从机设备生产时该如何测试?
答:
蓝牙从机设备内部增加测试指令,用于测试的手机使用测试app,不停地连接、发送测试指令、断开从机,收到测试指令的从机关闭广播一段时间。
56、packet sniffer如何过滤出某个设备的广播包信息?
答:
http://blog.csdn.net/zhuangjitongxue/article/details/51141688
57、假设特征值6的数据长度是20,如何能让app发送少于20字节数据给CC2541?
答:
默认是只允许发指定字节的,可通过如下方法修改: