蓝牙mesh通讯异常

蓝牙 BLE设备、蓝牙 MESH设备、蓝牙 Beacon设备、Sub-G设备等


kangxi
Posts: 40

1、网关和mesh设备没有连接,都是通过广播传输数据,蓝牙网关下最多可以有128个蓝牙设备。

2、设备可以订阅群组地址,一个群组地址可以被很多设备订阅,没有限制。

3、都是加密传输的。


Tags:
liuwf
Posts: 16

Re: 蓝牙mesh通讯异常

kangxi 2023年 Jul 12日 14:01

1、网关和mesh设备没有连接,都是通过广播传输数据,蓝牙网关下最多可以有128个蓝牙设备。

2、设备可以订阅群组地址,一个群组地址可以被很多设备订阅,没有限制。

3、都是加密传输的。

还有一个问题,调用ADC接口,采集电压,发现电压跳动很大,如下所示。
1、ADC配置如下,

f41808d6f8848749133ba5c732f8539.png

2、调用函数采集ADC

879d4353c12f37f74d96cc0a71c3ade.png

3、采集1V的电压,数据打印如下,

9d4b10c47201672b189071448a8a7f5.png

这电压误差太大了,有20mv左右的误差,要把误差减小,应该怎么解决,谢谢

kangxi
Posts: 40

Re: 蓝牙mesh通讯异常

泰凌原厂给出的是50mV以内

liuwf
Posts: 16

Re: 蓝牙mesh通讯异常

kangxi 2023年 Jul 14日 10:23

泰凌原厂给出的是50mV以内

还有一个问题,
1、目前是打算用一个管脚对红外接收头进行解码,要用到IO口的电平中断(红外接收解码是微秒级的),按照你之前说的,频繁的硬件中断会导致蓝牙断连,那么现在是打算连续开关3次进入设置参数模式,这个模式下,不进行蓝牙通信,只处理红外接收解码工作并保存参数,那“要实现不进行蓝牙通信”,应该调用哪些函数进行处理?

2、对于IO口电平中断,这里有几个库函数可以调用初始化IO口电平中断

e9ee11d89f54cb542c4932b1e0af075.png

但是,进入中断后的处理函数在哪里处理?

以上,谢谢

kangxi
Posts: 40

Re: 蓝牙mesh通讯异常

如果不是很频繁处理红外的话,可以参考以下代码:

Code: Select all

#define INFRA_RED_TIMEOUT 30000                     //30MS
#define CALCULATE_MANY_TICKS_IS_1US(time) time*16

#pragma pack(1)
typedef struct {
    UINT8_T data[4];
}APP_INFRA_RED_T;
#pragma pack()

STATIC UINT8_T infra_red_pin;
STATIC UINT8_T app_infra_data_get_flag = FALSE;

STATIC APP_INFRA_RED_T infra_red_data;



STATIC OPERATE_RET infra_red_read_bit(UINT32_T tick)
{
    OPERATE_RET bit_data = OPRT_COM_ERROR; //二进制位计数标志
    if((tick >= CALCULATE_MANY_TICKS_IS_1US(1000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(1500))){ // bit0 :1.12ms
            bit_data = 0;

    }else if((tick >= CALCULATE_MANY_TICKS_IS_1US(2000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(2650))){ //bit1 : 2.25ms
            bit_data = 1;
    }
    return bit_data;
}

STATIC OPERATE_RET infra_red_read_byte(UINT8_T *read_data, UINT32_T tick)
{
    STATIC UINT8_T bit_cnt = 0; //二进制位计数标志
    STATIC UINT8_T result_byte = 0;

    if(read_data == NULL){ //clear
        bit_cnt = 0;
        result_byte = 0;
        return OPRT_COM_ERROR;
    }

    OPERATE_RET bit_data = infra_red_read_bit(tick);
    if(bit_data == OPRT_COM_ERROR){
        bit_cnt = 0;
        result_byte = 0;
        return OPRT_COM_ERROR;
    }

    result_byte = result_byte | (bit_data << (7-bit_cnt));
    bit_cnt++;
    if(bit_cnt > 7){
        bit_cnt = 0;
        *read_data = result_byte;
        result_byte = 0;
        return OPRT_OK;
    }else{
        return OPRT_RECV_DA_NOT_ENOUGH;
    }
}

STATIC OPERATE_RET infra_red_read_bytes(UINT8_T read_num, UINT8_T *read_data, UINT32_T tick)
{
    OPERATE_RET ret;
    STATIC UINT8_T byte_cnt = 0;

    if(read_data == NULL){ //clear
        byte_cnt = 0;
        infra_red_read_byte(NULL, NULL);
        return OPRT_COM_ERROR;
    }

    ret = infra_red_read_byte(read_data+byte_cnt, tick);
    if(OPRT_COM_ERROR == ret){
        byte_cnt = 0;
        return OPRT_COM_ERROR;

    }else if(OPRT_OK == ret){
        if(++byte_cnt >= read_num){
            byte_cnt = 0;
            return OPRT_OK;
        }
    }
    return OPRT_RECV_DA_NOT_ENOUGH;
}

STATIC OPERATE_RET infra_red_read_preamble_code(UINT32_T tick)
{
    if((tick >= CALCULATE_MANY_TICKS_IS_1US(13000)) && (tick <= CALCULATE_MANY_TICKS_IS_1US(14000))){//Detection start mark13500+-500
        return OPRT_OK;
    }
    return OPRT_COM_ERROR;
}





STATIC VOID falling_edge_trigger_event(VOID_T)
{
    OPERATE_RET ret;
    STATIC UINT32_T old_tick = 0;
    STATIC UINT32_T new_tick = 0;
    STATIC UINT32_T red_tick = 0;
    STATIC UINT8_T start_collect_flag = FALSE;
    STATIC APP_INFRA_RED_T infra_red_temp;

    new_tick = tal_system_get_tick_count();//16MHz
    red_tick = (UINT32_T)(new_tick - old_tick);
    old_tick = new_tick;

    if(red_tick > (CALCULATE_MANY_TICKS_IS_1US(INFRA_RED_TIMEOUT))){
        start_collect_flag = FALSE;
        return;
    }

    if(start_collect_flag == TRUE){
        ret = infra_red_read_bytes(SIZEOF(APP_INFRA_RED_T), (UINT8_T *)&infra_red_temp, red_tick);
        if(ret == OPRT_OK){
            if(app_infra_data_get_flag != TRUE){
                memcpy((UINT8_T *)&infra_red_data, (UINT8_T *)&infra_red_temp, SIZEOF(APP_INFRA_RED_T));
                app_infra_data_get_flag = TRUE;
            }

        }else if(ret == OPRT_COM_ERROR){
            start_collect_flag = FALSE; //error
            return;
        }
    }else{
        if(infra_red_read_preamble_code(red_tick) == OPRT_OK){
            start_collect_flag = TRUE; //start mark
            memset((UINT8_T *)&infra_red_temp, 0, SIZEOF(APP_INFRA_RED_T));
            infra_red_read_bytes(NULL, NULL, NULL);
        }
    }
}

VOID app_infra_red_run(VOID_T)//run in loop 
{
    if(app_infra_data_get_flag == TRUE){



        app_infra_data_get_flag = FALSE;
    }
}

VOID app_infra_red_init(VOID_T)
{
    infra_red_pin = TUYA_GPIO_NUM_31;//pd7
    TUYA_GPIO_IRQ_T infra_gpio_cfg;
    infra_gpio_cfg.mode = TUYA_GPIO_IRQ_FALL;
    infra_gpio_cfg.cb = &falling_edge_trigger_event;
    infra_gpio_cfg.arg = NULL;

    tal_gpio_irq_init(infra_red_pin, &infra_gpio_cfg);
}
liuwf
Posts: 16

Re: 蓝牙mesh通讯异常

kangxi 2023年 Jul 18日 20:29

如果不是很频繁处理红外的话,可以参考以下代码:

Code: Select all

#define INFRA_RED_TIMEOUT 30000                     //30MS
#define CALCULATE_MANY_TICKS_IS_1US(time) time*16

#pragma pack(1)
typedef struct {
    UINT8_T data[4];
}APP_INFRA_RED_T;
#pragma pack()

STATIC UINT8_T infra_red_pin;
STATIC UINT8_T app_infra_data_get_flag = FALSE;

STATIC APP_INFRA_RED_T infra_red_data;



STATIC OPERATE_RET infra_red_read_bit(UINT32_T tick)
{
    OPERATE_RET bit_data = OPRT_COM_ERROR; //二进制位计数标志
    if((tick >= CALCULATE_MANY_TICKS_IS_1US(1000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(1500))){ // bit0 :1.12ms
            bit_data = 0;

    }else if((tick >= CALCULATE_MANY_TICKS_IS_1US(2000))&&(tick <= CALCULATE_MANY_TICKS_IS_1US(2650))){ //bit1 : 2.25ms
            bit_data = 1;
    }
    return bit_data;
}

STATIC OPERATE_RET infra_red_read_byte(UINT8_T *read_data, UINT32_T tick)
{
    STATIC UINT8_T bit_cnt = 0; //二进制位计数标志
    STATIC UINT8_T result_byte = 0;

    if(read_data == NULL){ //clear
        bit_cnt = 0;
        result_byte = 0;
        return OPRT_COM_ERROR;
    }

    OPERATE_RET bit_data = infra_red_read_bit(tick);
    if(bit_data == OPRT_COM_ERROR){
        bit_cnt = 0;
        result_byte = 0;
        return OPRT_COM_ERROR;
    }

    result_byte = result_byte | (bit_data << (7-bit_cnt));
    bit_cnt++;
    if(bit_cnt > 7){
        bit_cnt = 0;
        *read_data = result_byte;
        result_byte = 0;
        return OPRT_OK;
    }else{
        return OPRT_RECV_DA_NOT_ENOUGH;
    }
}

STATIC OPERATE_RET infra_red_read_bytes(UINT8_T read_num, UINT8_T *read_data, UINT32_T tick)
{
    OPERATE_RET ret;
    STATIC UINT8_T byte_cnt = 0;

    if(read_data == NULL){ //clear
        byte_cnt = 0;
        infra_red_read_byte(NULL, NULL);
        return OPRT_COM_ERROR;
    }

    ret = infra_red_read_byte(read_data+byte_cnt, tick);
    if(OPRT_COM_ERROR == ret){
        byte_cnt = 0;
        return OPRT_COM_ERROR;

    }else if(OPRT_OK == ret){
        if(++byte_cnt >= read_num){
            byte_cnt = 0;
            return OPRT_OK;
        }
    }
    return OPRT_RECV_DA_NOT_ENOUGH;
}

STATIC OPERATE_RET infra_red_read_preamble_code(UINT32_T tick)
{
    if((tick >= CALCULATE_MANY_TICKS_IS_1US(13000)) && (tick <= CALCULATE_MANY_TICKS_IS_1US(14000))){//Detection start mark13500+-500
        return OPRT_OK;
    }
    return OPRT_COM_ERROR;
}





STATIC VOID falling_edge_trigger_event(VOID_T)
{
    OPERATE_RET ret;
    STATIC UINT32_T old_tick = 0;
    STATIC UINT32_T new_tick = 0;
    STATIC UINT32_T red_tick = 0;
    STATIC UINT8_T start_collect_flag = FALSE;
    STATIC APP_INFRA_RED_T infra_red_temp;

    new_tick = tal_system_get_tick_count();//16MHz
    red_tick = (UINT32_T)(new_tick - old_tick);
    old_tick = new_tick;

    if(red_tick > (CALCULATE_MANY_TICKS_IS_1US(INFRA_RED_TIMEOUT))){
        start_collect_flag = FALSE;
        return;
    }

    if(start_collect_flag == TRUE){
        ret = infra_red_read_bytes(SIZEOF(APP_INFRA_RED_T), (UINT8_T *)&infra_red_temp, red_tick);
        if(ret == OPRT_OK){
            if(app_infra_data_get_flag != TRUE){
                memcpy((UINT8_T *)&infra_red_data, (UINT8_T *)&infra_red_temp, SIZEOF(APP_INFRA_RED_T));
                app_infra_data_get_flag = TRUE;
            }

        }else if(ret == OPRT_COM_ERROR){
            start_collect_flag = FALSE; //error
            return;
        }
    }else{
        if(infra_red_read_preamble_code(red_tick) == OPRT_OK){
            start_collect_flag = TRUE; //start mark
            memset((UINT8_T *)&infra_red_temp, 0, SIZEOF(APP_INFRA_RED_T));
            infra_red_read_bytes(NULL, NULL, NULL);
        }
    }
}

VOID app_infra_red_run(VOID_T)//run in loop 
{
    if(app_infra_data_get_flag == TRUE){



        app_infra_data_get_flag = FALSE;
    }
}

VOID app_infra_red_init(VOID_T)
{
    infra_red_pin = TUYA_GPIO_NUM_31;//pd7
    TUYA_GPIO_IRQ_T infra_gpio_cfg;
    infra_gpio_cfg.mode = TUYA_GPIO_IRQ_FALL;
    infra_gpio_cfg.cb = &falling_edge_trigger_event;
    infra_gpio_cfg.arg = NULL;

    tal_gpio_irq_init(infra_red_pin, &infra_gpio_cfg);
}

红外遥控没问题了,还有一个问题,现在是想蓝牙模块不连接手机APP,然后通过红外遥控器发送指令实现本地mesh组网,应该调用哪些函数实现?整个流程是怎么样的?

kangxi
Posts: 40

Re: 蓝牙mesh通讯异常

必须配网才能组网,配网必须用app或者网关。

liuwf
Posts: 16

Re: 蓝牙mesh通讯异常

liuwf 2023年 Jul 4日 20:52

1、用的产品开发包
64d20b56d070e4bed5c95ebc65d6fb4.png

2、进行mesh通讯时,log打印信息如下
1688475092225.png

麻烦帮忙看看

在线升级,网页平台推送升级固件,设备正常升级后重启,但是APP上显示升级失败,我测试设备功能,实际上是升级完成的。APP显示失败的原因是什么?程序用到的功能主要是,1ms软件定时到了,采集ADC数据并处理,麻烦帮忙看看,谢谢。

kangxi
Posts: 40

Re: 蓝牙mesh通讯异常

设备升级成功但APP显示失败,一般是版本校验错导致,可以看下升级固件的版本。

liuwf
Posts: 16

Re: 蓝牙mesh通讯异常

kangxi 2023年 Aug 16日 17:28

设备升级成功但APP显示失败,一般是版本校验错导致,可以看下升级固件的版本。

你说的版本校验是校验版本号吗?升级固件的版本号是最新的,比如说原来的版本号是1.0.3,更改了程序,生成了新的固件1.0.4,上传到平台推送升级,然后设备升级显示失败,这中间有哪些步骤错了或者遗漏?谢谢。

Post Reply