Nuoeriris · 2020年07月08日

MM32W无线MCU系列产品应用笔记 —— 接口函数调用

MM32W0x2xxB的蓝牙协议栈目前以lib 形式提供用户使用,用户无需了解蓝牙底层协议,通过调用相关接口的方式即可实现蓝牙无线传输,其中BLE 协议栈lib 放置在SRC\_LIB目录下,接口定义头文件在inc 目录下。应用入口文件为main.c,应用实现代码在app.c。本章节介绍了部分对应各接口,详细完整的函数定义及使用注意事项参见官网的编程指导手册。

蓝牙相关资料下载链接:http://www.mindmotion.com.cn/download.aspx?cid=2567
1.jpg
2.jpg
上表是lib中的接口函数,在编程指导手册中都有详细的说明,大部分函数的调用很简单,其中与服务(service)及特征值定义相关的函数将在后续章节详细介绍。

1. radio\_initBle

函数原型: void radio\_initBle(unsigned char txpwr, unsigned char**addr/*Output*/);
函数功能:用于初始化蓝牙芯片及蓝牙协议栈。需要在协议一开始调用
输入参数:txpwr用于配置发射功率,可取的值有TXPWR\_0DBM,TXPWR\_3DBM 等。
输出参数: addr 该参数返回蓝牙 MAC 地址信息, 6 个字节长度。

2. ble\_run

函数原型:void ble\_run(unsigned short adv\_interval);
函数功能:运行蓝牙协议
输入参数:adv\_interval,参数的单位为0.625us,如果160 表示100ms 的广播间隔。
注:阻塞调用。中断方式运行时,在IRQ中断处理函数中调用,参数为0。

3. sconn\_notifydata

函数原型: unsigned char sconn\_notifydata(unsigned char* data, unsigned char len);
函数功能:通过蓝牙发送数据输入。
参数: data 需要发送的数据指针 len 数据长度。
注意事项:本接口函数会根据系统缓存情况自动拆包发送数据,但不得在原地阻塞等待反复调用本接口。

4. radio\_standby

函数原型:void radio\_standby(void);
函数功能:在通过该函数可以使射频模块进入standby模式。
注意事项:射频模块进入standby后不能定时唤醒(射频模块进入STOP 模式可以定时唤醒自身以及控制模块),此时需要外界给IRQ 提供上升沿电平信号才能唤醒射频模块,给PA0 提供下降沿电平才能唤醒控制模块。

5. att\_notFd

函数原型: void att\_notFd(unsigned char pdu\_type, unsigned char attOpcode, unsigned short attHd );
函数功能:对无效特征值(或没有定义的特征值)进行操作的应答函数
注意事项:凡是无效特征值的操作需要应答本函数,可将本函数作为缺省调用。

6. ser\_write\_rsp\_pkt

函数原型: void ser\_write\_rsp\_pkt(unsigned char pdu\_type);
函数功能:对具有 Write With Response 属性特征值写操作后的应答函数。
注意事项:对需要写应答的特征值,如果不应答会导致连接的断开。

7. att\_server\_rdByGrTypeRspDeviceInfo

函数原型: void att\_server\_rdByGrTypeRspDeviceInfo(unsigned char pdu\_type);
函数功能:对缺省 Device Info 内容的应答可调用本接口函数。
输入参数: pdu 类型参数,直接引用回调函数 att\_server\_rdByGrType 中对应参数。
注意事项:如果用户直接使用发布包代码,可直接调用本接口函数。

8. att\_server\_rdByGrTypeRspPrimaryService

函数原型: void att\_server\_rdByGrTypeRspPrimaryService(unsigned char pdu\_type,
unsigned short start\_hd,
unsigned short end\_hd,
unsigned char*uuid,
unsigned char uuidlen);
函数功能:应答 Primary Service 的查询,用户需按特征值实际定义的句柄及 UUID 填充对应数据。
输入参数: pdu\_type PDU 类型参数,直接引用回调函数 att\_server\_rdByGrType中对应参 start\_hd, 某个Service 对应的起始句柄值 end\_hd,某个 Service 对应的结束句柄值 uuid,某个 Service 对应的 UUID 字串(Hex 值),如 0x180A 表示为 0x0a, 0x18。 uuidlen,某个 Service 对应 UUID 字串的长度。
注意事项:需要严格按照特征值定义规划填充对应参数。

9. att\_server\_rd

函数原型: void att\_server\_rd(unsigned char pdu\_type,
unsigned char attOpcode
unsigned short att\_hd,
unsigned char* attValue,
unsigned char datalen );
函数功能:读取某特征值的值。
输入参数:pdu\_type PDU 类型参数,直接引用回调函数server\_rd\_rsp 中对应参数 attOpcode操作对应的值,直接引用回调函数server\_rd\_rsp 中对应参数att\_hd 特征值对应的句柄值,直接引用回调函数server\_rd\_rsp 中对应参数 attValue特征值对应的值字串指针 datalen特征值字串长度。
注意事项:需要按需将对应特征值内容作为应答内容,如果对应特征值内容无效可应答 att\_notFd()。

回调函数

为便于蓝牙差异化功能的灵活实现,蓝牙协议内设置了若干接口并以回调函数的方式由应用层porting实现,所有回调函数不得阻塞调用,具体函数的实现可参考SDK 发布包中对应代码的实现示例。

回调函数主要包括如下的一些:

1. void gatt\_user\_send\_notify\_data\_callback(void);
蓝牙连接成功后协议在空闲的时侯会调用本回调函数;

2. void UsrProcCallback(void);
蓝牙协议会周期性回调本函数;

3. void ser\_prepare\_write(unsigned short handle\,unsigned char* attValue\, unsigned short attValueLen\, unsigned short att\_offset);

4. void ser\_execute\_write(void);
以上两个函数为队列写数据回调函数。

5. unsigned char* getDeviceInfoData(unsigned char* len);
本函数GATT 中设备名称获取的回调函数;

6. void att\_server\_rdByGrType( unsigned char pdu\_type\, unsigned char attOpcode\,
unsigned short st\_hd, unsigned short end\_hd, unsigned short att\_type );
蓝牙GATT 查询服务的回调函数;

7. void ser\_write\_rsp(unsigned char pdu\_type/*reserved*/\, unsigned char attOpcode/*reserved*/\,unsigned short att\_hd\, unsigned char* attValue/*app data pointer*/\,
unsigned char valueLen\_w/*app data size*/);
蓝牙GATT 写操作回调函数;

8. void server\_rd\_rsp(unsigned char attOpcode\, unsigned short attHandle\, unsigned char pdu\_type);
蓝牙GATT 读操作回调函数;

9. void ConnectStausUpdate(unsigned char IsConnectedFlag);
蓝牙连接状态更新回调函数;

在使用接口函数时需要注意事项:

1. 所有接口函数不得阻塞调用。

2. 函数att\_server\_rd(...)每次调用发送的数据长度不得超过20 字节。

3. 函数sconn\_notifydata(...)只能在协议主循环体内调用,函数不可重入,可以发送多于20 字节的数据,协议会自动分包发送,且每个分包长度最大为20 字节。推荐一次发送的数据尽量不超过3 个分包。

4. 在参考例程提供了支持配对/加密的AES加密方式:unsigned char aes\_encrypt\_HW(unsigned char *painText128bitBE\,unsigned char *key128bitBE); //是否支持硬件AES。如果不支持请返回0,蓝牙库支持软件AES。

5. UUID 支持16bit 和128bit 两种。

推荐阅读
关注数
6152
内容数
276
灵动MM32 MCU相关技术知识,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息