【已解决】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

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


sandia
Posts: 61

PHY6222配置多路ADC采集的时候,使用软件定时20ms采集一次导致配网失败,将采集频率降低到100ms一次的时候就没有问题,是不是我ADC多路配置有问题?

Code: Select all

    tal_adc_deinit(TUYA_ADC_NUM_0);

TUYA_ADC_BASE_CFG_T adc_cfg = {
    .ch_list.data = 1<<0,
    .width = 12,
    .type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,
};
tal_adc_init(TUYA_ADC_NUM_0, &adc_cfg);


OPERATE_RET tkl_adc_init(TUYA_ADC_NUM_E port_num, TUYA_ADC_BASE_CFG_T *cfg)
{
    if(port_num == TUYA_ADC_NUM_0) {
   
if(cfg == NULL) { return OPRT_INVALID_PARM; } memcpy(&tkl_adc_cfg[0], cfg, SIZEOF(TUYA_ADC_BASE_CFG_T)); if(cfg->ch_list.data == 0) { return OPRT_INVALID_PARM; } TY_PRINTF("cfg->ch_list.data: %d", cfg->ch_list.data); UINT8_T channel = get_channel_num(cfg->ch_list.data) + 2; TY_PRINTF("channel: %d", channel); if(channel >= ADC_CH_NUM || channel < 2) { return OPRT_NOT_SUPPORTED; } if(cfg->width != 12) { return OPRT_NOT_SUPPORTED; } hal_adc_init(); sg_adc_cfg[0].channel = 0xA4; sg_adc_cfg[0].is_continue_mode = 0; sg_adc_cfg[0].is_differential_mode = 0; sg_adc_cfg[0].is_high_resolution = 0; hal_adc_clock_config(HAL_ADC_CLOCK_320K); sg_adc_value[0] = 0; } return OPRT_OK; } OPERATE_RET tkl_adc_read_voltage(TUYA_ADC_NUM_E port_num, INT32_T *buff, UINT16_T len) { if(port_num == TUYA_ADC_NUM_0) { if(buff == NULL) { return OPRT_INVALID_PARM; } if(len == 0) { return OPRT_INVALID_PARM; } hal_adc_config_channel(sg_adc_cfg[0], tkl_adc_evt_handler); hal_adc_start(INTERRUPT_MODE); WaitUs(300); UINT32_T adc_mv = (UINT32_T)(sg_adc_value[0] * 1000); UINT32_T adc_mv1 = (UINT32_T)(sg_adc_value[1] * 1000); UINT32_T adc_mv2 = (UINT32_T)(sg_adc_value[2] * 1000); buff[0] = adc_mv; buff[1] = adc_mv1; buff[2] = adc_mv2; } return OPRT_OK; } VOID_T tkl_adc_evt_handler(adc_Evt_t* pev) { if(pev->ch==ADC_CH1N_P11) { sg_adc_value[0] = hal_adc_value_cal(pev->ch, pev->data, pev->size, sg_adc_cfg[0].is_high_resolution & BIT(pev->ch), sg_adc_cfg[0].is_differential_mode & BIT(pev->ch)); } if(pev->ch==ADC_CH2P_P14) { sg_adc_value[1] = hal_adc_value_cal(pev->ch, pev->data, pev->size, sg_adc_cfg[1].is_high_resolution & BIT(pev->ch), sg_adc_cfg[1].is_differential_mode & BIT(pev->ch)); } if(pev->ch==ADC_CH3P_P20) { sg_adc_value[2] = hal_adc_value_cal(pev->ch, pev->data, pev->size, sg_adc_cfg[2].is_high_resolution & BIT(pev->ch), sg_adc_cfg[2].is_differential_mode & BIT(pev->ch)); } }

如果配置有问题的话,需要怎么修改?
求助大佬🙌

Last edited by sandia on 2023年 Nov 7日 18:51, edited 2 times in total.

Tags:
sandia
Posts: 61

Re: 求助-PHY6222配置多路ADC采集导致配网失败

我尝试单路每20ms采集一次是能正常配网的

sandia
Posts: 61

Re: 求助-PHY6222配置多路ADC采集导致配网失败

其他功能没有任何影响,只有配网配不上,log报错报的是disconnect: 0x08

User avatar
逻辑的院子
Posts: 290
Contact:

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

您这边应用层的代码(定时器相关的)可以提供一下吗

sandia
Posts: 61

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

Code: Select all

static INT32_T  vcc_value = 0,vol_value[3]=0;

VOID_T motro_ctrl_serve_cb(TIMER_ID timer_id, VOID_T *arg)
{
    tal_adc_read_voltage(TUYA_ADC_NUM_0, vol_value, 1);
  
} OPERATE_RET tuya_init_second(VOID_T) { #if defined(ENABLE_LOG) && (ENABLE_LOG==1) tal_log_create_manage_and_init(TAL_LOG_LEVEL_DEBUG, 1024, tuya_log_output_cb); #endif
tal_adc_deinit(TUYA_ADC_NUM_0); //++1027 TUYA_ADC_BASE_CFG_T adc_cfg[3] = { [0]={ .ch_list.data = 1<<0, .width = 12, .type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,}, [1]={ .ch_list.data = 1<<3, .width = 12, .type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,}, [2]={ .ch_list.data = 1<<5, .width = 12, .type = TUYA_ADC_EXTERNAL_SAMPLE_VOL,} }; tal_adc_init(TUYA_ADC_NUM_0, &adc_cfg[0]); // tal_adc_read_voltage(TUYA_ADC_NUM_0, &vol_value[0], 1); // TAL_PR_DEBUG("data=%d",vol_value); // tal_sw_timer_init(); tal_sw_timer_create(motro_ctrl_serve_cb,NULL,&motro_ctrl_timer_id); tal_sw_timer_start(motro_ctrl_timer_id,20,TAL_TIMER_CYCLE); //++1027 tal_ble_bt_init(TAL_BLE_ROLE_PERIPERAL, tuya_ble_evt_callback); return OPRT_OK; }

这是我在SDK中的DEMO上测试的情况,只开了这个定时器跟ADC采集,也是配不上网

sandia
Posts: 61

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

初始化是读了P11,P14跟P20这三个地方的AD值

User avatar
逻辑的院子
Posts: 290
Contact:

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

您是不是开启了很多Log?可以尝试把Log关掉试一下呢

sandia
Posts: 61

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

没有,我尝试把LOG标志关掉,情况是一样的;
我把定时器设置为100ms就没问题,能正常配网,定时器设置为50ms的话平均配网6次会成功一次

sandia
Posts: 61

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

我还尝试过初始化的时候把配置填成这样:

Code: Select all

    
sg_adc_cfg[0].channel =0x04; sg_adc_cfg[0].is_continue_mode = 0; sg_adc_cfg[0].is_differential_mode = 0; sg_adc_cfg[0].is_high_resolution = 0; sg_adc_cfg[1].channel =0x20; sg_adc_cfg[1].is_continue_mode = 0; sg_adc_cfg[1].is_differential_mode = 0; sg_adc_cfg[1].is_high_resolution = 0; sg_adc_cfg[2].channel =0x80; sg_adc_cfg[2].is_continue_mode = 0; sg_adc_cfg[2].is_differential_mode = 0; sg_adc_cfg[2].is_high_resolution = 0; OPERATE_RET tkl_adc_read_voltage(TUYA_ADC_NUM_E port_num, INT32_T *buff, UINT16_T len) {
if(port_num == TUYA_ADC_NUM_0) { if(buff == NULL) { return OPRT_INVALID_PARM; } if(len == 0) { return OPRT_INVALID_PARM; } hal_adc_config_channel(sg_adc_cfg[0], tkl_adc_evt_handler); hal_adc_start(INTERRUPT_MODE); WaitUs(300); } else if(port_num == TUYA_ADC_NUM_1) { if(buff == NULL) { return OPRT_INVALID_PARM; } if(len == 0) { return OPRT_INVALID_PARM; } hal_adc_config_channel(sg_adc_cfg[1], tkl_adc_evt_handler); hal_adc_start(INTERRUPT_MODE); WaitUs(300); } else if(port_num == TUYA_ADC_NUM_2) { if(buff == NULL) { return OPRT_INVALID_PARM; } if(len == 0) { return OPRT_INVALID_PARM; } hal_adc_config_channel(sg_adc_cfg[2], tkl_adc_evt_handler); hal_adc_start(INTERRUPT_MODE); WaitUs(300); } UINT32_T adc_mv = (UINT32_T)(sg_adc_value * 1000); *buff = adc_mv; return OPRT_OK; }

通过TUYA_ADC_NUM_0,TUYA_ADC_NUM_1,TUYA_ADC_NUM_2分三路去读,单独读哪一路都没有问题,但是放在定时器循环读就不行

User avatar
逻辑的院子
Posts: 290
Contact:

Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败

我这边模拟了您描述的情况,如果降低Log打印的频次,测试了正常配网没有问题,在TuyaOS V3.8.3版本基础上改动了三个文件,改动后的SDK详见附件,您可以参考一下

PHY6222-TuyaOS-3.8.3.zip
(94.03 MiB) Downloaded 171 times
Post Reply