I2C总线设备
概要
一般情况下 MCU 的 I2C 器件都是作为主机和从机通讯,在 RT-Thread 中将 I2C 主机虚拟为 I2C 总线设备, I2C 从机通过 I2C 设备接口和 I2C 总线通讯。
注:手头上的板子是正点原子的潘多拉,所以在这个潘多拉的bsp基础上进行分析
水平有限,仅供参考
首先,要确定是使用硬件I2C还是软件I2C,这个可以看配置菜单来确定,这里,可以在bsp对应的目录下调用env命令窗口,输入menuconfig即可。
一、I2C硬件资源初始化
由于是使用软件I2C,对于stm32,硬件相关初始化定义在在/bsp/stm32/libraries/HAL_Drivers/drv_soft_i2c.c文件中。
int rt_hw_i2c_init(void)
{
rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct stm32_i2c);
rt_err_t result;
for (int i = 0; i < obj_num; i++)
{
/* 操作包括set_sda set_scl get_sda get_scl udelay */
i2c_obj[i].ops = stm32_bit_ops_default;
/* 数据包括scl_pin sda_pin bus_name */
i2c_obj[i].ops.data = (void*)&soft_i2c_config[i];
i2c_obj[i].i2c2_bus.priv = &i2c_obj[i].ops;
/* 配置引脚功能 */
stm32_i2c_gpio_init(&i2c_obj[i]);
/* 注册到i2c总线上 */
result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c2_bus, soft_i2c_config[i].bus_name);
RT_ASSERT(result == RT_EOK);
stm32_i2c_bus_unlock(&soft_i2c_config[i]);
}
return RT_EOK;
}
INIT_BOARD_EXPORT(rt_hw_i2c_init);
在rt_hw_i2c_init函数中,我们发现,其所调用的注册函数是rt_i2c_bit_add_bus。那么,我们就去看下这个函数。
二、软件I2C的注册函数
rt_i2c_bit_add_bus函数定义在i2c-bit-ops.c文件中,i2c-bit-ops.c文件主要实现了利用GPIO模拟IIC总线时序的相关接口函数。