1、软件著作权申报材料模板软件设计说明书XXXX智能耳机底层驱动软件设计说明书 1、引言1.1、编写目的 本设计说明书针对XXXX智能耳机(以下简称智能耳机)的底层驱动软件而编写。目的介绍系统的各个模块,为进行后面的实现作准备。1.2、定义 MCU:MicroController Unit BLE:Bluetooth Low Energy SDK:Software Development Kit1.3、参考资料 设备接入接口协议V2.3 微信蓝牙外设协议1.0.4 微信硬件平台技术方案 微信硬件平台介绍 微信硬件平台框架说明及接入流程微信硬件平台蓝牙demo需求XXXX智能耳机MCU软件需求说明书
2、UM-B-003_DA14580_Software_development_guideUM-B-014_DA14580_Development_KitUM-B-015_DA14580_Software_architecture2、设计概述2.1、设计任务智能耳机首先是一款耳机,然后才是通过蓝牙与微信客户端连接实现更多的扩展功能。所以MCU软件需要实现两方面的功能,向下驱动底层硬件并实现逻辑控制,向上通过蓝牙跟微信客户端通信并实现扩展功能,如图2-1。图2-1 设计任务2.2、设计约束和限制MCU:dialog DA14580蓝牙:4.0 BLE编程语言:C语言3、总体设计为了节省开发时间,使用
3、dialog官方SDK(以下简称“SDK”)开发。SDK是一个小型操作系统,实现基本任务调度和消息传递,并实现蓝牙4.0 BLE协议栈,如图3-1。图3-1 BLE协议栈根据设计任务,本项目开发只需要编写硬件驱动和微信服务相关的代码,并且也只对这两方面进行描述。总体结构如图3-2。图3-2 总体结构4、模块描述4.1、陀螺仪模块该模块实现陀螺仪的电源管理和数据采样功能。4.1.1、电源管理电源管理功能实现陀螺仪电源打开和关闭,由输入控制。(1)输入陀螺仪使能标识:uint8_t power3DEnable绑定状态:uint8_t bindSta(2)输出打开或关闭陀螺仪。(3)代码实现if(0
4、3=power3DEnable)|(1=bindSta) /如果app主动打开陀螺仪或在 /绑定期间if(lsm6ds0_init_flag = false) /如果陀螺仪状态在关闭状态 open /打开陀螺仪elseif(lsm6ds0_init_flag = true) /如果陀螺仪状态在打开状态close /关闭陀螺仪4.1.2、数据采样数据采样功能采样陀螺仪实时加速度和角速度。(1)输入无(2)输出加速度:float XFloatValue3角速度:float GFloatValue3(3)代码实现/加速度采样代码void LSM6DS0_X_GetAxesRaw(int16_t *p
5、Data) uint8_t tempReg2 = 0,0; tempReg0 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_XL); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_XL+1);pData0 = (int16_t)tempReg1) 8)+(int16_t)tempReg0);tempReg0 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_XL); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_
6、XL+1);pData1 = (int16_t)tempReg1) 8)+(int16_t)tempReg0);tempReg0 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_XL); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_XL+1);pData2 = (int16_t)tempReg1) 8)+(int16_t)tempReg0);void LSM6DS0_X_GetAxes_Float(float *pData) uint8_t tempReg = 0x00; int16_t pDataR
7、aw3; float sensitivity = 0;float roll = 0; float pitch = 0; float yaw = 0; /I2C初始化 i2c_eeprom_init(LSM6DS0_I2C_SLAVE_ADDRESS,LSM6DS0_I2C_SPEED_MODE,LSM6DS0_I2C_ADDRESS_MODE, LSM6DS0_I2C_ADDRESS_SIZE); LSM6DS0_X_GetAxesRaw(pDataRaw); tempReg = i2c_eeprom_read_byte(LSM6DS0_XG_CTRL_REG6_XL); tempReg &=
8、 LSM6DS0_XL_FS_MASK; switch(tempReg) case LSM6DS0_XL_FS_2G: sensitivity = 0.061; break; case LSM6DS0_XL_FS_4G: sensitivity = 0.122; break; case LSM6DS0_XL_FS_8G: sensitivity = 0.244; break; int32_t temp = (int32_t)(pDataRaw0 * sensitivity); float f = (float)(temp*1.00); roll = f/1000.00; temp = (int
9、32_t)(pDataRaw1 * sensitivity); f = (float)(temp*1.00); pitch = f/1000.00; temp = (int32_t)(pDataRaw2 * sensitivity); f = (float)(temp*1.00); yaw = f/1000.00; pData0 = roll; pData1 = pitch; pData2 = yaw;/角速度采样代码void LSM6DS0_G_GetAxesRaw(int16_t *pData)uint8_t tempReg2 = 0,0; tempReg0 = i2c_eeprom_re
10、ad_byte(LSM6DS0_XG_OUT_X_L_G); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_X_L_G+1); pData0 = (int16_t)tempReg1) 8)+(int16_t)tempReg0); tempReg0 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_G); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Y_L_G+1); pData1 = (int16_t)tempReg1) 8)+(int16_t)tempReg0)
11、; tempReg0 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_G); tempReg1 = i2c_eeprom_read_byte(LSM6DS0_XG_OUT_Z_L_G+1); pData2 = (int16_t)tempReg1) =3minutes) close else if (true = ANCEnable) open else if (1 = buttonValue) /使用按键关闭降噪功能 close else /使用按键打开降噪功能 open 4.3、电量检测模块电量检测模块定时检测电池剩余电量。(1)输入无(2)输出剩余电量,
12、百分比表示。(3)实现代码uint8_t getBattery(void) curbattery = battery_get_lvl(BATT_CR2032); return curbattery;4.4、指示灯模块指示灯模块由一个红色和一个绿色指示灯组成,红色指示灯指示电池是否电量低,绿色指示灯作上电指示、绑定指示、蓝牙连接指示和降噪功能开关状态指示。指示灯状态由输入条件控制。4.4.1、红色指示灯(1)输入电池剩余电量:uint8_t curbattery(2)输出指示灯状态(3)实现代码if(0=curbattery)指示灯闪烁else指示灯灭4.4.2、绿色指示灯(1)输入系统刚上电标
13、识:static uint8_t GREEN_LED_Flag绑定状态:uint8_t bindSta蓝牙连接上指示灯延时:uint8_t BLELEDDelay降噪开关状态:bool powerRNFlag(2)输出指示灯状态(3)实现代码if (1=GREEN_LED_Flag)/如果刚上电闪烁2selse if(1=bindSta)/在请求绑定状态急闪else if(BLELEDDelay)/在蓝牙刚连接上常亮elseif(true=powerRNFlag)/如果打开降噪呼吸灯效果else/否则常灭4.5、微信服务模块4.5.1、模块概述微信服务模块底层依托蓝牙BLE协议栈,顶层通过微信
14、Protobuf协议对厂商自定义应用协议进行封装,这样外设(本项目中表现为智能耳机)和厂商服务器之间就可以通过微信平台以透传的方式实现通信,数据流图如图4-1。图4-1 数据流图微信服务模块时序如图4-2。通信使用请求应答模式,厂商服务器使用SendDataPushReq命令请求,智能耳机使用SendDataReq命令应答,应用层协议附带在Protobuf协议可变长度包体内,Protobuf协议数据包结构如图4-3。 | | | | | SendDataPushReq(seq=0) | | | | | | | | SendDataPushReq(seq=0) | | | | | | | | |
15、 SendDataReq(seq=n) | | | | | | | | | | SendDataReq(seq=n) | | | | | | | | | SendDataResp(seq=n) | | | | | | | | SendDataResp(seq=n) | | | | | | | |图4-2 时序图图4-3 Protobuf协议数据包结构微信服务模块应用层协议数据格式如表4-1。表4-1 应用层协议数据格式字段名称CmdIdParamCRC16校验码字段长度(byte)1 byten bytes2 bytes字段说明命令参数,长度根据命令而定CmdId和Param的校验,高字节在前低字节在后应用层协议命令列表如表4-2,目前只用到部分命令,剩余没用到的用于后续扩展所需。表4-2 应用层协议命令列表数据方向命令ID分布手机 外设21-70外设 手机71-120根据不同CmdId可划分为多个小模块,如图4-4。图4-4 微信服务模块图4.5.2、软件流程微信服务软件流程图如图4-5。是图4-5 微信服务软件流程图是是是否否否