DA14531-蓝牙传感器-广播传输数据

本文详细介绍了DA14531蓝牙5.1SOC的开发,包括其特性、功耗优势,以及在传感器应用中的开发路径、数据结构、配置广播间隔、低功耗模式和广播数据底层配置。重点展示了主要用户应用代码和传感器数据刷新功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.蓝牙传感器需求

1)蓝牙BLE工作在低功耗模式
2)BLE可以通过I2C、SPI或者UART串口获取传感器中的输出,通过广播的信息发送出来
3)在SDK设定广播参数,包括广播间隔、设备名称和广播数据内容等
4)随着传感数据的变化,广播内容也要相应的变化
5)广播的开启与关闭

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(); // 停止广播后,会重新开启广播 请看
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小武编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值