From f3710fbb4b00e819e65bff842927cc0b24970ecd Mon Sep 17 00:00:00 2001 From: lmx Date: Fri, 21 Nov 2025 18:50:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E7=89=99=E5=8D=8F=E8=AE=AE=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/earphone/xtell_Sensor/send_data.c | 66 ++++++++++++++++++++-- apps/earphone/xtell_Sensor/sensor/BMP280.c | 18 +++++- apps/earphone/xtell_Sensor/xtell_handler.c | 38 ++++++++----- 3 files changed, 102 insertions(+), 20 deletions(-) diff --git a/apps/earphone/xtell_Sensor/send_data.c b/apps/earphone/xtell_Sensor/send_data.c index 155bbf0..64bf335 100644 --- a/apps/earphone/xtell_Sensor/send_data.c +++ b/apps/earphone/xtell_Sensor/send_data.c @@ -62,7 +62,8 @@ typedef struct { // -- 速度 -- uint16_t speed_cms; // -- 气压计 -- - //... + int adc_P; + int adc_T; } BLE_send_data_t; static int count = 0; @@ -101,9 +102,10 @@ void SC7U22_static_calibration(void){ extern u16 SC7U22_calibration_id; extern u8 SC7U22_init; first_set_flag = 0; - SC7U22_init = 1; + SC7U22_init = 0x11; close_process(&SC7U22_calibration_id, "SC7U22_calibration"); - u8 send2_1[5] = {0xBB,0xBE,0x02,0x00,0x01}; + u8 send2_1[5] = {0xBB,0xBE,0x02,0x00,0x00}; + send2_1[4] = SC7U22_init; send_data_to_ble_client(&send2_1,5); } if(count > 100){ @@ -134,14 +136,19 @@ void start_collect_fuc(void){ signed short gyr_data_buf[3]; float angle[3]; float quaternion_output[3]; + + // -- 读数据 -- SL_SC7U22_RawData_Read(acc_data_buf,gyr_data_buf); mmc5603nj_read_origin_data(mmc5603nj_buffer); + bmp280_read_originanl_data(&BLE_send_data_tmp.adc_P, &BLE_send_data_tmp.adc_T); memcpy(&combined_raw_data[0], acc_data_buf, 3 * sizeof(signed short)); memcpy(&combined_raw_data[3], gyr_data_buf, 3 * sizeof(signed short)); + // -- 四元数 -- status = Q_SL_SC7U22_Angle_Output(0, combined_raw_data, angle,NULL, 0, quaternion_output); + // -- 速度计算 -- memcpy(acc_data_buf, &combined_raw_data[0], 3 * sizeof(signed short)); memcpy(gyr_data_buf, &combined_raw_data[3], 3 * sizeof(signed short)); uint16_t speed = sensor_processing_task(acc_data_buf,gyr_data_buf,angle, quaternion_output); @@ -211,10 +218,40 @@ void BLE_send_fuc(void){ // 拷贝磁力计数据 memcpy(&mag_packet[4], data_to_send.mmc5603nj_buffer, sizeof(data_to_send.mmc5603nj_buffer)); - // 调用实际的蓝牙发送函数 send_data_to_ble_client(&mag_packet, MAG_PACKET_LEN); } + // --- 封装并发送压力机计数据 --- + { + // 协议定义: 包头(2) + 长度(1) + 类型(1) + 数据(8) = 12字节 + const uint8_t PT_PACKET_LEN = 12; + const uint8_t PT_PAYLOAD_LEN = 9; // 类型(1) + 数据(8) + const uint8_t PT_TYPE = 0x03; + + uint8_t pt_packet[PT_PACKET_LEN]; + + // 填充包头 + pt_packet[0] = 0xBB; + pt_packet[1] = 0xBE; + pt_packet[2] = PT_PAYLOAD_LEN; + pt_packet[3] = PT_TYPE; + + // 打包压力数据 data_to_send.adc_P (占 pt_packet[4] 到 pt_packet[7]) + pt_packet[4] = (uint8_t)(data_to_send.adc_P & 0xFF); // 最低字节 (LSB) + pt_packet[5] = (uint8_t)((data_to_send.adc_P >> 8) & 0xFF); + pt_packet[6] = (uint8_t)((data_to_send.adc_P >> 16) & 0xFF); + pt_packet[7] = (uint8_t)((data_to_send.adc_P >> 24) & 0xFF); // 最高字节 (MSB) + + // 打包温度数据 data_to_send.adc_T (占 pt_packet[8] 到 pt_packet[11]) + pt_packet[8] = (uint8_t)(data_to_send.adc_T & 0xFF); // 最低字节 (LSB) + pt_packet[9] = (uint8_t)((data_to_send.adc_T >> 8) & 0xFF); + pt_packet[10] = (uint8_t)((data_to_send.adc_T >> 16) & 0xFF); + pt_packet[11] = (uint8_t)((data_to_send.adc_T >> 24) & 0xFF); // 最高字节 (MSB) + + send_data_to_ble_client(&pt_packet, PT_PACKET_LEN); + } + + // --- 封装并发送速度数据 --- { // 协议定义: 包头(2) + 长度(1) + 类型(1) + 数据(2) = 6字节 @@ -240,7 +277,7 @@ void BLE_send_fuc(void){ } } - +static u8 bmp280_test_id = 0; void xtell_task_create(void){ #if TCFG_GSENOR_USER_IIC_TYPE @@ -261,4 +298,23 @@ void xtell_task_create(void){ circle_buffer_init(&BLE_send_buff, BLE_send_data, SENSOR_DATA_BUFFER_SIZE, sizeof(BLE_send_data_t)); + bmp280_init(); + extern void bmp280_test(void); + xlog("barometer start measeure\n"); + // create_process(&bmp280_test_id,"bmp280_test",NULL, bmp280_test, 100); + float Temp = 0; + float Press = 0; + xlog("test_func\n"); + bmp280_read_data(&Temp, &Press); + xlog("Temp:%.2f, Press:%.2f\n",Temp,Press); } + + + +////////////////////////////////////////////////////////////////////////////// +//test +// + +void bmp280_test(void){ + +} \ No newline at end of file diff --git a/apps/earphone/xtell_Sensor/sensor/BMP280.c b/apps/earphone/xtell_Sensor/sensor/BMP280.c index e5e450f..e0ebca4 100644 --- a/apps/earphone/xtell_Sensor/sensor/BMP280.c +++ b/apps/earphone/xtell_Sensor/sensor/BMP280.c @@ -112,13 +112,14 @@ uint8_t bmp280_init(void) { printf("bmp280 check diff:%d\n",id ); return 1; // ID不匹配 } + printf("bmp280 get id:0%X\n",id ); // 2. 软复位 bmp280_write_reg(BMP280_REG_RESET, 0xB6); os_time_dly(10); // 等待复位完成 // 3. 一次性读取所有校准参数 - if (bmp280_read_regs(BMP280_REG_CALIB_START, calib_data, 24) != 0) { + if (bmp280_read_regs(BMP280_REG_CALIB_START, calib_data, 24) == 0) { return 2; // 读取校准数据失败 } @@ -147,18 +148,29 @@ uint8_t bmp280_init(void) { os_time_dly(10); // 等待配置生效 + printf("bmp280 init success\n"); return 0; // 初始化成功 } +/** + * @brief 获取转换后的温度和压力数据 + * + * @param temperature 传出,温度 + * @param pressure 传出,压力 + * @return uint8_t + */ uint8_t bmp280_read_data(float *temperature, float *pressure) { uint8_t data[6]; int32_t adc_P, adc_T; + // printf("==========debug1===========\n"); // 一次性读取6个字节的温度和气压原始数据 - if (bmp280_read_regs(BMP280_REG_PRESS_MSB, data, 6) != 0) { + if (bmp280_read_regs(BMP280_REG_PRESS_MSB, data, 6) == 0) { + printf("bmp280:read data error\n"); return 1; // 读取失败 } + // printf("==========debug2===========\n"); // 组合原始数据 (20位) adc_P = (int32_t)((((uint32_t)(data[0])) << 12) | (((uint32_t)(data[1])) << 4) | (((uint32_t)(data[2])) >> 4)); adc_T = (int32_t)((((uint32_t)(data[3])) << 12) | (((uint32_t)(data[4])) << 4) | (((uint32_t)(data[5])) >> 4)); @@ -167,9 +179,11 @@ uint8_t bmp280_read_data(float *temperature, float *pressure) { if (adc_T == 0x80000 || adc_P == 0x80000) { *temperature = 0.0f; *pressure = 0.0f; + printf("bmp280:no data\n"); return 1; } + // printf("==========debug3===========\n"); // 进行补偿计算 *temperature = compensate_temperature(adc_T); *pressure = compensate_pressure(adc_P); diff --git a/apps/earphone/xtell_Sensor/xtell_handler.c b/apps/earphone/xtell_Sensor/xtell_handler.c index 911bc02..726dd7a 100644 --- a/apps/earphone/xtell_Sensor/xtell_handler.c +++ b/apps/earphone/xtell_Sensor/xtell_handler.c @@ -87,9 +87,9 @@ unsigned char xt_ble_new_name[9] = "CM-22222"; static u16 play_poweron_ok_timer_id = 0; // -- 初始化标志位 -- -u8 SC7U22_init = 0; //六轴是否初始化 -u8 MMC5603nj_init = 0; //地磁是否初始化 - +u8 SC7U22_init = 0x10; //六轴是否初始化 +u8 MMC5603nj_init = 0x20; //地磁是否初始化 +u8 BMP280_init = 0x30; //气压计初始化 // -- 线程id -- u16 SC7U22_calibration_id; u16 start_collect_fuc_id; @@ -213,7 +213,8 @@ void le_user_app_event_handler(struct sys_event* event){ if (event->u.app.buffer[0] == 0xBE && event->u.app.buffer[1] == 0xBB) { if(event->u.app.buffer[2] == 0x01){ //后面的数据长度 1 switch (event->u.app.buffer[3]){ - case 0x01: + case 0xff: //测试 + break; default: break; @@ -225,20 +226,31 @@ void le_user_app_event_handler(struct sys_event* event){ if(event->u.app.buffer[4] == 0x01){ //六轴 if (SL_SC7U22_Config() == 0) { send2_0[4] = 0x00; //初始化失败 - SC7U22_init = 0; + SC7U22_init = 0x10; send_data_to_ble_client(&send2_0,5); return; } create_process(&SC7U22_calibration_id,"SC7U22_calibration",NULL,SC7U22_static_calibration,10); }else if(event->u.app.buffer[4] == 0x02){ //地磁 if(mmc5603nj_init() == 0){ - MMC5603nj_init = 0; - send2_0[4] = 0x02; //地磁初始化失败 + MMC5603nj_init = 0x20; + send2_0[4] = MMC5603nj_init; //地磁初始化失败 send_data_to_ble_client(&send2_0,5); return; } - MMC5603nj_init = 1; - send2_0[4] = 0x03; //地磁初始化成功 + MMC5603nj_init = 0x21; + send2_0[4] = MMC5603nj_init; //地磁初始化成功 + send_data_to_ble_client(&send2_0,5); + }else if(event->u.app.buffer[4] == 0x03){ //气压计初始化 + if(bmp280_init() != 0){ + //初始化失败 + BMP280_init = 0x30; + send2_0[4] = BMP280_init; + send_data_to_ble_client(&send2_0,5); + return; + } + BMP280_init = 0x31; + send2_0[4] = BMP280_init; //气压计初始化成功 send_data_to_ble_client(&send2_0,5); } break; @@ -247,17 +259,17 @@ void le_user_app_event_handler(struct sys_event* event){ if(event->u.app.buffer[4] == 0x01){ //六轴 send2_1[4] = SC7U22_init; }else if(event->u.app.buffer[4] == 0x02){ //地磁 - send2_1[4] = MMC5603nj_init + 2; + send2_1[4] = MMC5603nj_init; + }else if(event->u.app.buffer[4] == 0x03){ //气压计 + send2_1[4] = BMP280_init; } send_data_to_ble_client(&send2_1,5); break; case 0x02: //开始/停止滑雪计算 if(event->u.app.buffer[4] == 0x01){ //开始滑雪计算 - if(SC7U22_init == 0 || MMC5603nj_init == 0){ //传感器未进行初始化 + if(SC7U22_init == 0x10 || MMC5603nj_init == 0x20 || BMP280_init == 0x30){ //传感器未进行初始化 u8 send2_2[5] = {0xBB,0xBE,0x02,0x00,0x00}; send_data_to_ble_client(&send2_2,5); - send2_2[4] = 0x02; - send_data_to_ble_client(&send2_2,5); return; } create_process(&start_collect_fuc_id,"start_collect",NULL,start_collect_fuc,10);