DA14531-蓝牙传感器固件开发

1.DA14531简介

DA14531是基于全球尺寸最小、功耗最低的蓝牙5.1系统级芯片(SOC),最小尺寸1.7X2.05x0.5mm,功耗23.75uA/MHz且TX发射电流3.5 mA,所属行业最低,它应用范围广泛,特别是在功耗和封装都要求比较高的场合。

2.蓝牙传感器开发

工程路径:\Source\DA14531\projects\target_apps\ble_examples\ble_app_peripheral
固件输出路径:Source\DA14531\projects\target_apps\ble_examples\ble_app_peripheral\Keil_5\out_DA14531\Output\ DA14531_Sensor.bin
传感器特性:

名称范围 默认参数
系统①低功耗系统 ②非低功耗系统
功耗不广播状态 1uA
广播状态200ms0.14mA
广播间隔时间:间隔广播(20ms-2000ms)
广播数据:设备名称 “Sensor”
制造商数据:FF
前两字节公司IDFFC1
A数据(uint16_t)1001
B数据(uint16_t)2001
C数据(uint16_t)3001
D数据(uint16_t)4001
E数据(uint16_t)5001
F数据(uint16_t)6001
G数据(uint16_t)7001

3.主要用户应用代码

3.1.传感器数据结构体

typedef struct
{
uint16_t SensorA;
uint16_t SensorB;
uint16_t SensorC;
uint16_t SensorD;
uint16_t SensorE;
uint16_t SensorF;
uint16_t SensorG;
}Sensor_Data_t;

3.2.配置广播间隔

1)#include “user_config.h” 中
/// Minimum interval for advertising
.intv_min = MS_TO_BLESLOTS(200), // 200ms

/// Maximum interval for advertising
.intv_max = MS_TO_BLESLOTS(200),                    // 200ms

2)配置设备名称:#define USER_DEVICE_NAME “Sensor”
配置公司ID #define USER_COMPANY_ID 0xFFC1

3.3.主要用户代码说明

3.3.1.主要函数接口

函数接口 说明
user_app_adv_undirect_complete() 广播完成回调函数
user_app_on_db_init_complete() BLE数据库初始化完成回调函数
user_app_adv_start() 开启广播函数
user_app_adv_stop() 关闭广播函数
app_easy_gap_undirected_advertise_start_create_msg 广播数据接口
user_RsfreshSensorData() 传感器数据刷新
user_app_before_sleep() 睡眠前回调函数
user_app_resume_from_sleep() 唤醒时回调函数

3.3.2.打印MAC地址

#if defined (DA14531)
extern struct bd_addr dev_bdaddr;
uint8_t bd_address[6] = CFG_NVDS_TAG_BD_ADDRESS;

arch_printf("OTP addr: %02x %02x %02x %02x %02x %02x\r\n",
    dev_bdaddr.addr[0],
	dev_bdaddr.addr[1],
	dev_bdaddr.addr[2],
	dev_bdaddr.addr[3],
	dev_bdaddr.addr[4],
	dev_bdaddr.addr[5]);

arch_printf("nvds addr: %02x %02x %02x %02x %02x %02x\r\n",
    bd_address[0],
	bd_address[1],
	bd_address[2],
	bd_address[3],
	bd_address[4],
	bd_address[5]);

#endif
arch_printf(“main_loop\r\n”);

3.3.3.低功耗模式

设置为低功耗模式:
arch_set_sleep_mode(ARCH_EXT_SLEEP_ON);
设置为正常模式:
arch_set_sleep_mode(ARCH_SLEEP_OFF);

3.3.4.广播数据底层配置

        uint8_t dev_name_len = 0;
        uint8_t dev_manu_len = 0;
        uint8_t adv_data_len = 0;
        uint8_t scan_rsp_data_len = 0;
        uint8_t adv_data[31];
        uint8_t scan_rsp_data[31];
        // Device Name

        dev_name_len = strlen(USER_DEVICE_NAME);
        dev_manu_len = sizeof(device_info.manu);
        arch_printf("adv_name:%s\r\n",USER_DEVICE_NAME);


        adv_data_len = 0;
        if(dev_name_len)
        {
            adv_data[adv_data_len + 0] = dev_name_len + 1;
            adv_data[adv_data_len + 1] = GAP_AD_TYPE_COMPLETE_NAME;
            memcpy(&adv_data[adv_data_len +2],USER_DEVICE_NAME,dev_name_len);
            adv_data_len += dev_name_len + 2;
        }

        if(dev_manu_len)
        {
            adv_data[adv_data_len + 0] = dev_manu_len + 1;
            adv_data[adv_data_len + 1] = GAP_AD_TYPE_MANU_SPECIFIC_DATA;
            memcpy(&adv_data[adv_data_len +2],device_info.manu,dev_manu_len);
            adv_data_len += dev_manu_len + 2;
        }

        adv_cmd->info.host.adv_data_len = adv_data_len;
        memcpy(&(cmd->info.host.adv_data[0]), adv_data, adv_data_len);
        arch_printf("adv_data_len:%d\r\n",adv_data_len);
        show_reg(adv_data,adv_data_len,1);

        adv_cmd->info.host.scan_rsp_data_len = scan_rsp_data_len;
        memcpy(&(cmd->info.host.scan_rsp_data[0]), scan_rsp_data, scan_rsp_data_len);
        //arch_printf("scan_rsp_data_len:%d\r\n",scan_rsp_data_len);
        //show_reg(scan_rsp_data,scan_rsp_data_len,1);

3.3.5.刷新传感器数据

static void user_RsfreshSensorData(void)
{
///arch_printf(“Rsf\r\n”);

// 获取传感器信息
Sensor.SensorA++;
Sensor.SensorB++;
Sensor.SensorC++;
Sensor.SensorD++;
Sensor.SensorE++;
Sensor.SensorF++;
Sensor.SensorG++;

// 更新数据
User_data.CycleTime++;
if(User_data.CycleTime>=5)
{
    User_data.CycleTime = 0;

    if(memcmp(&Sensor,&bacSensor,sizeof(Sensor)))
    {
        device_info.manu[0] =(uint8_t)USER_COMPANY_ID;
        device_info.manu[1] =(uint8_t)(USER_COMPANY_ID>>8);
        device_info.manu[2] =Sensor.SensorA;
        device_info.manu[3] =Sensor.SensorA;
        device_info.manu[4] =Sensor.SensorB;
        device_info.manu[5] =Sensor.SensorB;
        device_info.manu[6] =Sensor.SensorC;
        device_info.manu[7] =Sensor.SensorC;
        device_info.manu[8] =Sensor.SensorD;
        device_info.manu[9] =Sensor.SensorD;
        device_info.manu[10] =Sensor.SensorE;
        device_info.manu[11] =Sensor.SensorE;
        device_info.manu[12] =Sensor.SensorF;
        device_info.manu[13] =Sensor.SensorF;
        device_info.manu[14] =Sensor.SensorG;
        device_info.manu[15] =Sensor.SensorG;
        user_app_adv_stop(); // 停止广播后,会重新开启广播 请看
    }
}

}

  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小武编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值