Code: Select all
STATIC VOID ADC_Callback(PVOID_T arg)
{
UINT16_T adc_buf = 0;
tuya_adc_t *adc_dev = (tuya_adc_t *)arg;
while(1)
{
...
while(tuya_adc_convert(adc_dev,&adc_buf,1) != 0)
{
PR_ERR("ADC gather error!");
vTaskDelay(pdMS_TO_TICKS(100));
}
...
}
}
OPERATE_LIGHT ADC_Init(void)
{
tuya_adc_t *adc_dev = (tuya_adc_t *)tuya_driver_find(TUYA_DRV_ADC,TUYA_ADC2);
if(NULL==adc_dev){
PR_ERR("tuya adc find failed!");
return LIGHT_INVALID_PARM;
}
TUYA_ADC_CFG(adc_dev,TUYA_ADC2,0);
OPERATE_LIGHT ret = tuya_adc_init(adc_dev);
if (ret != LIGHT_OK) {
PR_ERR("adc soc init error!");
return LIGHT_INVALID_PARM;
}
ret = tuya_hal_thread_create(NULL, "mic_acquisition", 512 * 2, TRD_PRIO_4, ADC_Callback, adc_dev);
if (ret != OPRT_OK) {
PR_ERR("MIC Create thread error!: %d", ret);
return ret;
}
return ret;
}
demo如上,读取ADC失败等待一段时间后重新读取,有概率出现读取ADC失败死循环。
现象:adc open总是失败,但是close却返回OK
原因:sdk默认开启了温度检测线程,并且温度检测采用消息开启,读取完毕在中断关闭的方式,可能存在温度检测ADC读取完成前,被用户open的时候就会失败
解决方案:1.读取adc之前先调用temp_detect_pause_timer()停止温度检测定时器,读取完ADC在重新调用temp_detect_restart_detect(),或者简单粗暴直接把温度检测的宏CFG_USE_TEMPERATURE_DETECT赋0
2.读取ADC失败等待一段时间后重新读取,改为读取失败直接continue
3.读取ADC前先判断ADC是否为关闭状态