news 2026/1/10 1:49:30

Linux GPIO模拟I2C

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux GPIO模拟I2C

目录

目录

前言

软件I2C的DTS配置参考

软件I2C的内核配置参考

总结


前言

I2C(Inter-Integrated Circuit)是一种两线式串行通信协议,主要用于近距离、低数据速率的通信。它通过SDA(Serial Data Line)和SCL(Serial Clock Line)两根线实现数据传输。

I2C通信的基本内容包括:

1. 起始信号:SCL为高电平时,SDA由高变低。

2. 结束信号:SCL为高电平时,SDA由低变高。

3. 数据传输:SCL为高电平时,SDA保持稳定进行数据传输。

4. 应答信号:接收数据的IC在接收完数据后,向发送数据的IC发出特定的低电平信号进行应答。

在嵌入式开发过程中,由于主控芯片的I2C接口数量有限或者出于硬件画板的方便,我们可能需要将普通的GPIO模拟I2C接口使用。

其中硬件I2C和软件I2C是两种不同的实现方式,它们主要有以下区别:

1. 硬件I2C:

硬件I2C是通过专门的硬件电路实现的,通常由微控制器或其它集成电路上的硬件模块提供支持。硬件I2C具有以下优点:

  • 高速传输:硬件I2C使用专门的硬件电路,可以实现高速的数据传输。
  • 低占用率:硬件I2C的传输过程由硬件电路完成,无需CPU的干预,因此可释放CPU的资源。
  • 稳定性高:硬件I2C的时序由硬件电路控制,不容易受到外部干扰的影响。

2. 软件I2C:

软件I2C是通过软件控制GPIO管脚来模拟I2C协议的时序。软件I2C具有以下优点:

  • 灵活性高:软件I2C可以使用任意的GPIO管脚来实现,可以适应不同的硬件平台和需求。
  • 可移植性强:软件I2C的实现不依赖于特定的硬件电路,可在不同的平台上进行移植和适应。
  • 使用范围广:软件I2C可在没有硬件I2C支持的情况下使用,也可以用于扩展硬件I2C的功能。

软件I2C的DTS配置参考

aliases { /* aliases用于为硬件设备定义和管理别名,方便操作系统在启动时根据设备别名动态识别硬件设备并加载对应的驱动程序。 */ i2c2 = &i2c2_gpio; }; i2c2_gpio: i2c@2 { compatible = "i2c-gpio"; /* 指定使用GPIO模拟I2C */ #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c2_gpio_c>; sda-gpios = <&gpioc 8 GPIO_ACTIVE_HIGH>; /* SDA引脚描述 */ scl-gpios = <&gpioc 9 GPIO_ACTIVE_HIGH>; /* SCL引脚描述 */ i2c-gpio,delay-us = <2>; /* “delay-us”:GPIO操作之间的延时参数,范围[0,10],例如需要总线频率为100KHz,则设置为2 */ status = "okay"; gt9xx@0x14 { /* I2C器件子节点,这里是GT9XX触摸屏的I2C器件子节点。 */ compatible = "goodix,gt9xx"; /* compatible属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序。 */ reg = <0x14>; /* 器件I2C从机地址 */ status = "okay"; /* 通过status字段确定是否启用此I2C器件,okay表示启用,disabled表示禁用。 */ ... }; da380_gs@0x27 { reg = <0x27>; /* 器件I2C从机地址 */ compatible = "miramems,da380-gs"; /* compatible属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序。 */ #address-cells = <1>; #size-cells = <0>; status = "okay"; /* 通过status字段确定是否启用此I2C器件,okay表示启用,disabled表示禁用。 */ }; }; pinctrl: pinctrl@xxx { pinctrl_i2c2_gpio_c:i2c2_c-grp { xxx,pins = "gpioc-8", "gpioc-9"; xxx,pin-pud = <ENABLE_PULL_UP>; /* 使能内部上拉 */ }; };

软件I2C的内核配置参考

CONFIG_I2C=y CONFIG_I2C_CHARDEV=y CONFIG_I2C_BOARDINFO=y CONFIG_I2C_GPIO=y

总结

总的来说,硬件I2C具有高速传输、低占用率和稳定性高的优点,适用于对传输速率和稳定性要求比较高的场景;而软件I2C具有灵活性高和可移植性强的特点,适用于没有硬件I2C支持或需要扩展硬件I2C功能的场景。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/8 19:33:00

如何设计一款好的软件

一、以用户为中心&#xff1a;解决真需求&#xff0c;提供高价值体验 好产品的首要标准是有效用&#xff08;Utility&#xff09;——即真正解决用户的实际问题或满足其深层需求。这要求产品经理具备深刻的用户洞察力&#xff0c;识别“真痛点”而非表面需求。例如&#xff0c;…

作者头像 李华
网站建设 2026/1/9 3:40:27

美联储降息概率逼近九成:为何市场如此笃定?全球经济将如何演化?

截至2025年12月10日(美联储议息夜前夕),市场对于本次降息的预期已经高度一致。无论从概率、机构研判还是基本面信号来看,本次降息几乎已成“共识事件”。 一、降息概率是否真的高达 90%? 不仅如此,实际市场预期甚至远超 90%。 根据多个权威渠道: CME “美联储观察”显…

作者头像 李华