T5 AMP(3.12.25) 上使用硬件I2C去驱动tp

更新时间:2025-12-24 07:16:47下载pdf

操作步骤如下(默认是用的模拟的I2C),demo仅供参考,谢谢!

1. 修改配置文件:

CONFIG_SIM_I2C

CONFIG_SIM_I2C_HW_BOARD_V3

vendor\T5\t5_os\projects\tuya_app\config\bk7258_cp1\config

T5 AMP(3.12.25) 上使用硬件I2C去驱动tp

2. 修改应用层配置IO的地方,改为TUYA_GPIO_NUM_MAX

T5 AMP(3.12.25) 上使用硬件I2C去驱动tp

3. 修改驱动代码,我这边通过判断去做分流,做了一个宏控制了一下,不改动原始代码(tp_driver.c):

#include "tuya_cloud_types.h"
bk_err_t bk_tp_i2c_init(const tp_config_t *config)
{
	if(NULL == config)
	{
		bk_printf("%s, pointer is null!\r\n", __func__);
		return BK_FAIL;
	}

//兼容硬件I2C的地方	
#if 1
	bk_printf("swimming clk = %d, sda = %d, max =%d \r\n",tkl_display_ll_tp_config(2),tkl_display_ll_tp_config(3),TUYA_GPIO_NUM_MAX);

	//用硬件I2C
	if(tkl_display_ll_tp_config(2) == TUYA_GPIO_NUM_MAX && tkl_display_ll_tp_config(3) == TUYA_GPIO_NUM_MAX)
	{
		bk_printf("swimming hw i2c \r\n");
		TUYA_IIC_BASE_CFG_T i2c_cfg = {
			.role = TUYA_IIC_MODE_MASTER,
			.speed = TUYA_IIC_BUS_SPEED_400K,
			.addr_width = TUYA_IIC_ADDRESS_7BIT,
		};

		//硬件I2C0
		bk_err_t ret = bk_i2c_init(0, &i2c_cfg);
		if (BK_OK != ret)
		{
			bk_printf("SWIMMING I2C init err = %d \r\n",ret);
			return BK_FAIL;
		}

		bk_printf("SWIMMING I2C init ok ! \r\n");
	}
	else
	{
		i2c_config_t i2c_config = {0};

		i2c_config.baud_rate = I2C_BAUD_RATE_100KHZ;
		i2c_config.addr_mode = I2C_ADDR_MODE_7BIT;
		if (BK_OK != bk_i2c_init(TP_I2C_ID, &i2c_config))
		{
			bk_printf("%s, I2C%d init fail!\r\n", TP_I2C_ID);
			return BK_FAIL;
		}
	}
#else
	i2c_config_t i2c_config = {0};

	i2c_config.baud_rate = I2C_BAUD_RATE_100KHZ;
	i2c_config.addr_mode = I2C_ADDR_MODE_7BIT;
	if (BK_OK != bk_i2c_init(TP_I2C_ID, &i2c_config))
	{
		bk_printf("%s, I2C%d init fail!\r\n", TP_I2C_ID);
		return BK_FAIL;
	}
#endif
	return BK_OK;
}

4. 需要去掉里面一个判断,不然会跑不下去:

T5 AMP(3.12.25) 上使用硬件I2C去驱动tp

5. 加了打印可以正常跑到对应的地方了:

vendor\T5\t5_os\bk_idk\middleware\driver\i2c\i2c_driver.c

T5 AMP(3.12.25) 上使用硬件I2C去驱动tp
T5 AMP(3.12.25) 上使用硬件I2C去驱动tp