基于 RT-Thread Studio 的软件 I2C 驱动开发文档

简介

I2C 总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA,另一根是双向时钟线 SCL。

I2C 总线可以通过芯片上板载的 I2C 外设实现,也可以通过 GPIO 引脚模拟 I2C 总线协议来实现。

硬件 I2C 对应芯片上的 I2C 外设,由相应的 I2C 控制器和驱动电路组成,其所使用的引脚也是专用的。软件 I2C 使用的是普通的 GPIO 引脚,用软件控制 GPIO 管脚状态来模拟 I2C 通信波形。所以软件 I2C 不受管脚限制,接口也比较灵活。

RT-Thread 的 I2C 设备驱动框架即支持硬件 I2C 也支持软件模拟 I2C。本文将基于 stm32l475-atk-pandora 开发板就软件 I2C 的驱动开发展开讲解。

新建 RT-Thread 项目

使用 RT-Thread Studio 新建基于 v4.0.2 的工程,界面如下图所示

i2c-project

配置过程可总结为以下步骤:

  • 定义自己的工程名及工程生成文件的存放路径

  • 选择 基于芯片 创建工程,选择的 RT-Thread 版本为 v4.0.2

  • 选择厂商及芯片型号

  • 配置串口信息

  • 配置调试器信息

工程配置完成后点击下方的 完成 按钮即可创建 RT-Thread 的工程。

打开 I2C 框架

RT-Thread Setting 文件中借助图形化配置工具打开软件 I2C 的驱动框架,如下图所示

open-picture

左键单击即可开启 软件模拟 I2C(组件开启,相应的图标会高亮),在该选项上右键,可以查看软件模拟 I2C 的 详细配置,具体配置如下所示

RT-Thread Setting
----组件
--------设备驱动程序
------------使用 I2C 设备驱动程序
----------------使用 GPIO 模拟 I2C

配置结果如下图所示

open-frame

添加软件 I2C 源码

下载驱动源码

上节中只是打开了软件 I2C 的驱动框架,具体芯片的软件 I2C 驱动源码还需要自己手动添加到工程驱动文件所在的路径。本例中使用的是 stm32l475-atk-pandora 开发板,所以需要下载 STM32 系列的软件 I2C 驱动。Github 下载地址Gitee 下载地址

添加软件 I2C 驱动

将下载的软件 I2C 驱动源码 drv_soft_i2c.cdrv_soft_i2c.h 文件添加到自己工程驱动文件所在的路径(如果不放在驱动文件所在的路径,需要自己手动添加头文件的路劲),例如 F:\work\IDE\soft-i2c\drivers 。并刷新工程,可以看到软件 I2C 驱动源码已经添加到工程中,如下图所示

f5-project

注册 I2C 设备

软件 I2C 添加到工程中之后就可以调用软件 I2C 注册函数 rt_hw_i2c_init 来注册软件 I2C 设备了。该函数的原型如下

int rt_hw_i2c_init(char *name, rt_uint8_t scl, rt_uint8_t sda)

函数的各个参数含义

参数 描述
name 软件 I2C 的名字
scl 软件 I2C 的 SCL 引脚
sda 软件 I2C 的 SDA 引脚

例如 stm32l475-atk-pandora 开发板的 PC1 引脚和 PD6 引脚分别连接了温湿度传感器 aht10 的 SCL 和 SDA ,所以注册软件 I2C 的示例如下

int register_i2c(void)
{
    rt_hw_i2c_init("i2c1", GET_PIN(C,1), GET_PIN(D,6));

    return RT_EOK;
}
INIT_BOARD_EXPORT(register_i2c);

如果需要注册更多的 I2C 设备,只需要调用 rt_hw_i2c_init 函数进行注册即可。

编译并下载程序输入 list_device 测试命令可以看到 i2c1 已经成功注册到系统中了,如下图所示

list_device

I2C 总线设备使用示例 章节中的 I2C 的测试代码添加到工程中

编译并下载程序,在控制台中输入 i2c_aht10_sample 命令,在串口中可以看到如下打印信息

aht10-data

从终端打印的信息可以看到我们成功使用 I2C 设备读取到了 aht10 传感器中的数据。

注意事项

  • STM32 软件 I2C 的驱动依赖于 PIN 设备驱动。

更多关于 I2C 的使用请参考 I2C 总线设备

Question && Feedback