Page 1 of 3
【已解决】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 17:42
by sandia
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));
}
}
如果配置有问题的话,需要怎么修改?
求助大佬
Re: 求助-PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 17:43
by sandia
Re: 求助-PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 17:49
by sandia
其他功能没有任何影响,只有配网配不上,log报错报的是disconnect: 0x08
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 18:44
by 逻辑的院子
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 18:59
by sandia
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采集,也是配不上网
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 19:01
by sandia
初始化是读了P11,P14跟P20这三个地方的AD值
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 19:04
by 逻辑的院子
您是不是开启了很多Log?可以尝试把Log关掉试一下呢
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 19:10
by sandia
没有,我尝试把LOG标志关掉,情况是一样的;
我把定时器设置为100ms就没问题,能正常配网,定时器设置为50ms的话平均配网6次会成功一次
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 19:13
by sandia
我还尝试过初始化的时候把配置填成这样:
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分三路去读,单独读哪一路都没有问题,但是放在定时器循环读就不行
Re: 【求助】【tuyaOS】PHY6222配置多路ADC采集导致配网失败
Posted: 2023年 Nov 3日 19:24
by 逻辑的院子
我这边模拟了您描述的情况,如果降低Log打印的频次,测试了正常配网没有问题,在TuyaOS V3.8.3版本基础上改动了三个文件,改动后的SDK详见附件,您可以参考一下