MM32W无线MCU接口函数调用
0 2023-03-22

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

蓝牙相关资料下载链接:


上表是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 两种。 

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • GaN初创公司如何做出与众不同的创新?


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 怎样才能快速学习8051单片机

    [导读]单片机是微机的一种,现时有8051、AVR、ARM7、ARM9等系列,其中 “8051”是源自于Intel公司的MCS-51系列芯片,但目前不同生产厂商

    前天
  • 什么是DDR?DDR的分类有哪些?

    存储器可分为易失性存储器和非易失性存储器两类,前者在掉电后会失去记忆的数据,后者即使在切断电源也可以保持数据

    05-31
  • 51单片机RAM 数据存储区、位寻址区、数据缓冲区

    [导读]1.RAM keil C语言编程RAM是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过12

    05-30
  • STM32使用库函数驱动LED灯编写程序步骤

    [导读] 一、熟悉GPIO结构体以下这个结构体是我从官方手册中获取的:[cpp] view plain copy print?typedef struct{u1

    05-30
  • 你知道Linux下的ds18b20驱动吗?

    [导读]今天在各位前辈已有成就的基础上花了两天时间终于把这个驱动给搞定了,从开始编译成模块看效果,进行调试,再到编译进内核,最后又编译了一个界面出来,虽说大多数

    05-29
  • 一文区分AT89C51和AT89C52

    [导读]AT89C51和AT89C52是单片机的两种型号。主要区别是容量不同。at89c51最多支持4KB的程序,at89c52则最多支持8KB的程序。

    05-29
  • 功能强大的时钟中断应用分析

    [导读]在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的

    05-29
  • 一文告诉你MCS-51单片机有几个工作寄存器?

    [导读]工作寄存器有4组,每组都是8个工作寄存器R0~R7,通过PSW中的RS1、RS0两位来选择使用哪一组,如果不选,默认是选择第0组。

    05-29
  • 一文详解STC89C52单片机

    [导读]STC89C52单片机简介

    05-29
  • AVR单片机时熔丝位配置出现的一些问题分析

    [导读]AVR单片机的熔丝位配置是AVR单片机初学者很容易出错的地方,其实只要注意一些事项,还是能够尽量避免单片机被锁死,即使单片机被锁死,也可以使用一些方法解

    05-29
  • 一文详解STC89C52处理芯片

    [导读]主要性能: 与MCS-51单片机产品兼容 、8K字节在系统可编程Flash存储器、 1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储

    05-29
  • 一文详细分析51单片机中断问题

    [导读]该寄存器用于设置定时/计数器的工作方式,低四位用于定时器0,高四位用于定时器1。 GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或

    05-29
下载排行榜
更多
广告