沁恒蓝牙开发纪要(CH585)1、开发环境 与 蓝牙广播、扫描回复
基于沁恒CH585的蓝牙开发系列记录
开发环境 与 蓝牙广播、扫描回复
1、安装开发环境
每一个款芯片开后都是从安装开发环境开始的,沁恒的开发环境安装非常简单
SDK下载连接:
https://www.wch.cn/downloads/CH585EVT_ZIP.html
IDE下载连接:
http://www.mounriver.com/download
点击下图红框内的蓝色字体即可下载。
MounRiver Studio Ⅱ(MRS2)为MounRiver Studio的换代版本,从V2.1开始,框架更为VSCode,开发上就和VSCode一样丝滑。
下载解压后,无脑下一步就完成安装。
打开工程即可编译,不需要额外配置其他东西,十分简单!!
开发蓝牙的话一般都是从蓝牙从机开始的,这也不例外。
2、开发板
本次使用的开发板是CH585M的沁恒官方开发板,相关的资料在SDK中,路径是:EVT\PUB,内含开发板的PCB、原理图、布局布线的注意事项,非常全面!
观察上图可以发现,沁恒的蓝牙芯片的外围 与 天线外围非常简单,大大降低入门难度。
2.1、开发板获取途径
1、淘宝店购买,沁恒官方在淘宝有店,店面是“WCH沁恒微电子官方店”,注意名字,不要搞错了
2、由公司名义,去联系沁恒原厂申请(最好是企业用户)。
沁恒的板子也不贵,个人用户直接走淘宝,而且淘宝店还包邮!
3、BLE 从机
打开例程,路径是:EVT\EXAM\BLE\Peripheral
3.1、修改广播 与 扫描回复内容
可由main 函数中跳转到 Peripheral_Init 函数, Peripheral_Init 函数中看到以下的两行代码,其中代码的操作码分别代表:
GAPROLE_SCAN_RSP_DATA(扫描回复)
GAPROLE_ADVERT_DATA(广播)
API中传入的其他参数就是 实际的广播数组名 和 数据长度
void Peripheral_Init() {
.......
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); //使能开启广播
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData),scanRspData);
//传入扫描回复参数
GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
//传入广播参数
....
例程中的广播内容如下,
需要注意 广播是以LTV格式填写的,即1 Byte Length、1 Byte Type、N Byte data。
长度是指 1个Type + N个data的长度,Type 与 data 按需填写。
注释上写着:最大广播字节数31字节,而且尽可能减少广播字节数,减少功耗。
// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertising)
static uint8_t advertData[] = {
0x02, // length of this data
GAP_ADTYPE_FLAGS,
DEFAULT_DISCOVERABLE_MODE | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
0x03, // length of this data
GAP_ADTYPE_16BIT_MORE, // some of the UUID's, but not all
LO_UINT16(SIMPLEPROFILE_SERV_UUID),
HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};
扫描回复,大部分手机的APP显示名称就是的扫描回复内的名称
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8_t scanRspData[] = {
// complete name
0x12, // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'S','i','m','p','l','e',' ','P','e','r','i','p','h','e','r','a','l',
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms
HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),
LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s
HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),
// Tx power level
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
修改扫描回复的内容,修改广播名
// GAP - SCAN RSP data (max size = 31 bytes)
static uint8_t scanRspData[] = {
// complete name
5, // length of this data
GAP_ADTYPE_LOCAL_NAME_COMPLETE,
'T','e','s','t',
// connection interval range
0x05, // length of this data
GAP_ADTYPE_SLAVE_CONN_INTERVAL_RANGE,
LO_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL), // 100ms
HI_UINT16(DEFAULT_DESIRED_MIN_CONN_INTERVAL),
LO_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL), // 1s
HI_UINT16(DEFAULT_DESIRED_MAX_CONN_INTERVAL),
// Tx power level
0x02, // length of this data
GAP_ADTYPE_POWER_LEVEL,
0 // 0dBm
};
实际效果对比,红框内就是修改前后的广播名对比
3.2、修改广播间隔
1单位广播间隔,代表625微秒,80us 即 50ms,蓝牙规定实际的广播间隔要在设置的基础上随机家1-10ms,所以实际的广播间隔是51-60ms之间的随机数。
// What is the advertising interval when device is discoverable (units of 625us, 80=50ms)
#define DEFAULT_ADVERTISING_INTERVAL 80
void Peripheral_Init(){
...
{
uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;
// Set advertising interval
GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt);
GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt);
// Enable scan req notify
GAP_SetParamValue(TGAP_ADV_SCAN_REQ_NOTIFY, ENABLE);
}
...
}
修改以下宏为160,实际时间就是160*0.625=100ms
#define DEFAULT_ADVERTISING_INTERVAL 160
实际效果对比,红框内就是修改前后的广播间隔对比
以上就是沁恒
更多推荐



所有评论(0)