低功耗设备io引脚工作不正常

Zigbee 子设备开发


hzb
Posts: 38

基于参看demo的tuyaos_demo_zg_pir_tl例程低功耗设备,用TUYA_GPIO_NUM_12(PB4)和TUYA_GPIO_NUM_13(PB5) 引脚io模拟i2c驱动传感器(放在tuya_init_first或tuya_init_last,2个函数中都试初始化都不行),2个引脚都没有输出(见附件“非正常波形”),开发环境:
模组: ZT5
SDK:TLSR8258_TuyaOS-3.8.0

相同的代码,基于tuyaos_demo_zg_light2例程是正常工作,但是在tuyaos_demo_zg_pir_tl工程中就没不正常(无输出),尝试将
"dev_role":"sleep_end_dev", 修改为"router" , 编译会报错(详见附件):

Code: Select all

../../../libs/tuya_lib/router\lib_router_tkl_telink_zigbee_release.a(tkl_zll_commissioning.o): In function `tkl_zll_initiator_scan_start':
tkl_zll_commissioning.c:(.text.tkl_zll_initiator_scan_start+0x20): undefined reference to `tal_zg_inner_end_device_rejoin_clear'
tkl_zll_commissioning.c:(.text.tkl_zll_initiator_scan_start+0x3e): undefined reference to `tal_zg_inner_end_device_rejoin_clear'

看编译报错信息,将工程中zll相关功能屏蔽后,发现PB4和PB5工作也正常了(见附件"正常波形"),间接证明了好像是低功耗模式也哪里影响这2个引脚配置输出

hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

另外说明下,设备是还未进入休眠模式(在tuya_init_first 和 tuya_init_last中调用传感器初始化),并且也未打印进入低功耗的回调函数__tuya_pre_sleep_cb

详见附件。

Attachments
附件.7z
(944.62 KiB) Downloaded 89 times
hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

关于传感器引脚配置:

Code: Select all

#define I2C_SDA_PIN 	TUYA_GPIO_NUM_12//PB4
#define I2C_SCL_PIN 		TUYA_GPIO_NUM_13//PB5
#define SENSOR_INT_PIN	TUYA_GPIO_NUM_19	//PC3

#define I2C_SCL_H()		tal_gpio_write(I2C_SCL_PIN, TUYA_GPIO_LEVEL_HIGH)
#define I2C_SCL_L()		tal_gpio_write(I2C_SCL_PIN, TUYA_GPIO_LEVEL_LOW)

#define I2C_SDA_H()		tal_gpio_write(I2C_SDA_PIN, TUYA_GPIO_LEVEL_HIGH)
#define I2C_SDA_L()		tal_gpio_write(I2C_SDA_PIN, TUYA_GPIO_LEVEL_LOW)

#define I2C_SCL(x)      (x ? tal_gpio_write(I2C_SCL_PIN, TUYA_GPIO_LEVEL_HIGH):tal_gpio_write(I2C_SCL_PIN, TUYA_GPIO_LEVEL_LOW) )       
#define I2C_SDA(x) (x ? tal_gpio_write(I2C_SDA_PIN, TUYA_GPIO_LEVEL_HIGH):tal_gpio_write(I2C_SDA_PIN, TUYA_GPIO_LEVEL_LOW) ) #define RD_I2C_SDA() gpio_read(GPIO_PB4) // tal_gpio_read(I2C_SDA_PIN,&level); void I2C_Init(void) { TUYA_GPIO_BASE_CFG_T io_cfg; io_cfg.mode = TUYA_GPIO_OPENDRAIN; io_cfg.direct = TUYA_GPIO_OUTPUT; io_cfg.level = TUYA_GPIO_LEVEL_HIGH; tal_gpio_init(I2C_SCL_PIN, &io_cfg); tal_gpio_init(I2C_SDA_PIN, &io_cfg); //I2C_SCL(1); //I2C_SDA(1); I2C_SCL_H(); I2C_SDA_H(); } static void platform_init(void) { I2C_Init(); TUYA_GPIO_IRQ_T irq_cfg = { .mode = TUYA_GPIO_IRQ_RISE, .cb = __sensor_pin_irq_handle, .arg = NULL, }; tal_gpio_irq_init(SENSOR_INT_PIN, &irq_cfg);//PD2 }
huanghuan
Posts: 202

Re: 低功耗设备io引脚工作不正常

1.tlsr8258 平台由于芯片设计的原因,进入休眠时输出是不保持的,为了保证输出,低功耗固件默认输出是使用上下拉方式进行输出,这会使得输出能力比较弱。
2.你反馈的问题可能是上述问题导致的,请检查 BOOL_T tkl_gpio_output_use_wakeup_mode(TUYA_GPIO_NUM_E pin_id) 这个函数是如何配置的,如果你想要自己控制唤醒及休眠时机使用推挽输出的话,可以返回TRUE;或者区分不同管脚进行不同的返回值,实现不同管脚不同的输出方式,可以参考pir demo。

hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

在tkl_gpio_output_use_wakeup_mode中TUYA_GPIO_NUM_12 ,TUYA_GPIO_NUM_13 引脚返回TRUE,好像可以了,具体如下:

Code: Select all

BOOL_T tkl_gpio_output_use_wakeup_mode(TUYA_GPIO_NUM_E pin_id)
{
    if((TUYA_GPIO_NUM_12 == pin_id) ||  (TUYA_GPIO_NUM_13 == pin_id) ||(GPIO_APP_NET_LED == pin_id)){
        return TRUE;
    }
    else
    {
        return FALSE;        
} }

但是改成如上之后,模组无限重启了,根据打印的日志,定位到运行tal_gpio_irq_init(SENSOR_INT_PIN, &irq_cfg);//TUYA_GPIO_NUM_19---PC3 就复位重启了

Attachments
异常重启.png
hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

以上图片看不清楚的话,可看以下代码:

Code: Select all

static void platform_init(void)
{
	TAL_PR_DEBUG("[%s] ===1===", __FUNCTION__);
	I2C_Init();
	TAL_PR_DEBUG("[%s] ===2===", __FUNCTION__);
    TUYA_GPIO_IRQ_T irq_cfg = {
        .mode = TUYA_GPIO_IRQ_RISE,
        .cb = __sensor_pin_irq_handle,
        .arg = NULL,
    };
	TAL_PR_DEBUG("[%s] ===3===", __FUNCTION__);	
    tal_gpio_irq_init(SENSOR_INT_PIN, &irq_cfg);//TUYA_GPIO_NUM_19---PC3
    TAL_PR_DEBUG("[%s] ===4===", __FUNCTION__);
}

运行打印了 TAL_PR_DEBUG("[%s] ===3===", FUNCTION); 但是没有打印TAL_PR_DEBUG("[%s] ===4===", FUNCTION); 就无限重启了, 请问这个配置有冲突嘛

hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

将tal_gpio_irq_init(TUYA_GPIO_NUM_19, &irq_cfg);//TUYA_GPIO_NUM_19---PC3 屏蔽了,传感器初始化正常了,也不会重启, 但是这个引脚是传感器中断脚(lis2dw12三轴传感器INT1引脚),用来检测当有外部移动传感器时,来唤醒模组,并读取三轴加速度值,并上报。 请问这个引脚TUYA_GPIO_NUM_19,有什么其他配置嘛? 为什么一使能中断,就会不断重启。

hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

是否与tkl_reallocate_gpio_interrupt_source 这个函数有关?目前这个函数是:

Code: Select all

BOOL_T tkl_reallocate_gpio_interrupt_source(TUYA_GPIO_NUM_E pin,UINT8_T before_mode,UINT8_T* after_mode)
{
    /* if(pin == GPIO_APP_ZLL_SCAN_PIN){
        *after_mode = 1;
        return TRUE;
    }
    else*/
   	{
        *after_mode = 2;
        return TRUE;
    }
    return FALSE;
}
huanghuan
Posts: 202

Re: 低功耗设备io引脚工作不正常

你好,我在3.8.0 pir demo基础上修改成你相同配置后,无法复现你会重启的问题,请将你的app路径下参与编译的工程文件以附件的方式给到我们,我们将进行确认

hzb
Posts: 38

Re: 低功耗设备io引脚工作不正常

好的,详见附件。 特别说明下细微修改了sdk中tkl_gpio_initio函数(用模拟i2c配置成开漏输出并使能了输入,不知道有没影响):
if(cfg->mode == TUYA_GPIO_OPENDRAIN || cfg->mode == TUYA_GPIO_OPENDRAIN_PULLUP)
gpio_set_input_en(gpio_tlsr, 1);//0
else
gpio_set_input_en(gpio_tlsr, 0);//0

Attachments
tuyaos_zg_g_sensor.7z
(1.77 MiB) Downloaded 62 times
Post Reply