主页 > 硬件 > CC2541蓝牙开发

CC2541蓝牙开发

2017年7月28日 CC2541蓝牙开发无评论 阅读: 18,387 次

1、如何查看程序大小
在project项目的编译目录list下有一个map文件:

在此map文件最后有占用程序空间和RAM空间的信息:

CC2541的FLASH有128K和256K两种,RAM大小为8K

2、CC2541的低功耗模式

空闲模式:sleepcmd.mode=0,PCON=1进入此模式,停止CPU 内核活动,此模式将被任何使能的中断唤醒

PM1:sleepcmd.mode=1,PCON=1进入此模式,32M变为32K晶振,数字核心正常,CPU停止执行,复位、外部中断或睡眠定时器过期将转为正常模式

PM2:sleepcmd.mode=2,PCON=1进入此模式,数字核心模块关闭,复位、外部中断或睡眠定时器过期将转为正常模式

PM3:sleepcmd.mode=3,PCON=1进入此模式,晶振关闭,数字核心模块关闭,复位、外部中断过期将转为正常模式

进入低功耗模式后,I/O 引脚保留进入之前设置的I/O 模式和输出值。

所有低功耗模式的CPU内核执行都是停止的

3、ADC

p0口管脚可以作为ADC,ADC参考电压为1.25v,参考电压对应采样的最大值,比如10位采样,最大值为511,511时就为1.25v

可以对供电电压进行采样,缺省是对供电电压的1/3进行采样,因此最大支持1.25*3=3.75v电压采样

片内的温度传感器也可以用adc采样输出
//显示VDD电压
{
HalAdcSetReference( HAL_ADC_REF_125V );
adc = HalAdcRead( HAL_ADC_CHANNEL_VDD, HAL_ADC_RESOLUTION_10 );
vdd=adc*1.25*3/511;
sprintf(str, "vdd=%.3f", vdd);
HalLcdWriteString( str, HAL_LCD_LINE_5 );
}

//显示温度
{
#define TEMP_CONST 0.61065 // (1250 / 2047)
#define TEMP_OFFSET_DATASHEET 750
#define TEMP_OFFSET_MEASURED_AT_25_DEGREES_CELCIUS 29.75
#define TEMP_OFFSET (TEMP_OFFSET_DATASHEET + TEMP_OFFSET_MEASURED_AT_25_DEGREES_CELCIUS) // 779.75
#define TEMP_COEFF 4.5
float AvgTemp;
float AvgTemp_sum = 0;
TR0 = 0x01; //设置为1来连接温度传感器到SOC_ADC
ATEST = 0x01; //使能温度传感
// 求64个平均值,以便稳定
for(int i = 0; i<64; i++) { HalAdcSetReference( HAL_ADC_REF_125V ); adc = HalAdcRead( HAL_ADC_CHN_TEMP, HAL_ADC_RESOLUTION_12 ); AvgTemp = adc * TEMP_CONST; AvgTemp = ((AvgTemp - TEMP_OFFSET) / TEMP_COEFF); AvgTemp_sum += AvgTemp; } // 得到实际温度 AvgTemp = AvgTemp_sum/64; TR0 &= ~0x01; ATEST &= ~0x01; sprintf(str, "temp=%.3f", AvgTemp); HalLcdWriteString( str, HAL_LCD_LINE_6 ); }

 

4、开关蓝牙广播
uint8 current_adv_enabled_status;
uint8 new_adv_enabled_status;
//获取当前GAP广播状态
GAPRole_GetParameter( GAPROLE_ADVERT_ENABLED, ¤t_adv_enabled_status );
//切换广播开关状态
if( current_adv_enabled_status == FALSE )
{
new_adv_enabled_status = TRUE;
}
else
{
new_adv_enabled_status = FALSE;
}
//设置蓝牙广播开关
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &new_adv_enabled_status );

5、BLE连接过程

启动后,蓝牙设备开始处于广播状态,如果DEFAULT_DISCOVERABLE_MODE设置为GAP_ADTYPE_FLAGS_LIMITED状态,则广播180秒后停止(可用GAP_SetParamValue(TGAP_LIM_ADV_TIMEOUT, 60)重新设置时超时间),如果设置为GAP_ADTYPE_FLAGS_GENERAL则一直广播。
连接成功后,从设备广播停止。
BLE主设备每次必须通过从设备广播才能连接,这表示一个从设备只能同时和一个主设备建立连接。

广播包中包含:发现模式(是否为受限广播,是否支持BR/EDR)、服务UUID等
扫描响应包含:从机名称、连接时间参数、发射功率(CC2541支持3种发射功率:0dB(default)、-6dB、-23dB,此发射功率只是发给主机看看而已的,并不起配置作用,实际设置用HCI_EXT_SetTxPowerCmd函数)

主设备扫描,从设备回复扫描响应数据scanRspData,主设备发起连接请求,建立连接。

BLE建立连接后,才进行配对和绑定过程。
连接后,如果要进行配对,必须将主机或从机某一方的配对模式GAPBOND_PAIRING_MODE设置为GAPBOND_PAIRING_MODE_INITIATE

6、程序加载
程序加载是要保证调试器指示灯为绿色,如果是红色,需按一下复位键重新连接

7、关于蓝牙信号
蓝牙芯片上电后,缺省使用内部晶振,如果能够运行程序,控制指示灯,但是无蓝牙信号,请检查外部晶振是否正常

8、关于自定义按键
主要修改hal_key.c,按键处理流程
先设置IO口的管脚,设置为IO输入、边沿触发、中断使能,按键触发中断后,中断会调用halProcessKeyInterrupt,然后发送消息给HAL层,HAL层调用HalKeyPoll函数查询按键,确定键值后调用回调函数pHalKeyProcessFunction,回调函数在HalKeyConfig配置为OnBoard_KeyCallback,OnBoard_KeyCallback通过OnBoard_SendKeys发消息给应用层。

9、关于蓝牙特征值
蓝牙特征值主要修改simpleGATTprofile.c文件,各个特征值的读写特性、描述等都在simpleProfileAttrTbl属性表中定义,特征值读写函数为SimpleProfile_GetParameter、SimpleProfile_SetParameter,读写回调函数simpleProfile_ReadAttrCB、simpleProfile_WriteAttrCB,应用层的回调函数simpleProfileChangeCB

10、关于配对与绑定
BLE的配对发生在连接之后,并且配对和绑定是可选的
传统蓝牙的配对发生在连接之前,配对和绑定是必须的
要触发BLE配对,必须设置主从设备一方的配对模式为GAPBOND_PAIRING_MODE_INITIATE
BLE的配对与绑定主要用于安全加密,特征值的value属性可以设置为“GATT_PERMIT_AUTHEN_READ”或“GATT_PERMIT_AUTHEN_WRITE”,这样连接未配对情况下无法读取或写入

配对后会进行绑定,设备和手机双方会记录对方的信息,下次连接无需配对
如果要清除,IOS实测如下:
单独设备侧清除,手机连接后无需配对过程,但是无法读取加密的特征值,必须手机侧清除配对后(IOS在蓝牙界面忽略设备),才能重新触发配对过程
单独手机侧清除,可以触发重新配对过程
设备和手机都清除,也可以触发重新配对过程

状态迁移:
未绑定时:GAPBOND_PAIRING_STATE_STARTED->ProcessPasscodeCB->GAPBOND_PAIRING_STATE_COMPLETE
绑定后:GAPBOND_PAIRING_STATE_BONDED
设备删除绑定信息,手机未删除绑定信息则会跳过配对过程

CC2541可以最大记录10个配对设备(GAP_BONDINGS_MAX)
当绑定记录超过10个时,TI源程序gapbondmgr.c中的处理是无法记录绑定信息

可以修改gapBondMgrFindEmpty函数,在存满时将第一个记录作为最新绑定记录,避免新设备出现无法绑定的现象:

调用如下语句可以清除绑定信息:
GAPBondMgr_SetParameter( GAPBOND_ERASE_ALLBONDS,0, NULL );

发表评论

新用户的评论需审核后才会显示;

电子邮件地址不会被公开;
必填项已用*标注