linux i2c驱动原理与架构分析

一、I2C总线原理

        I2C是一种常用的串行总线,由串行数据线SDA 和串线时钟线SCL组成。I2C是一种多主机控制总线,它和USB总线不同,USB是基于master-slave机制,任何设备的通信必须由主机发起才可以,而 I2C 是基于multi master机制,一条总线上可允许多个master

       系统的I2C模块分为I2C总线控制器和I2C设备。I2C 总线控制器是CPU提供的控制I2C总线接口,它控制I2C总线的协议、仲裁、时序。I2C设备是指通过I2C总线与CPU相连的设备,如EEPROM。 使用I2C通信时必须指定主从设备。 一般来说,I2C总线控制器被配置成主设备,与总线相连的I2C设备如AT24C02作为从设备。

1.1、IIC读写原理

        IIC总线的开始/停止信号如图1所示。开始信号为:时钟信号线SCL为高电平,数据线SDA从高变低。停止信号为:时钟信号线SCL为高电平,数据线SDA从低变高。



                                                                                            图1 IIC Start-Stop Signal

1.2、IIC总线Byte Write

        IIC总线写数据分几种格式,如字节写和页写。

        字节写传送格式如图2所示。开始信号之后,总线开始发数据,第一个Byte是IIC的设备地址,第二个Byte是设备内的地址(如EEPROM中具体的某个物理地址),然后就是要传送的真正的数据DATA。

        NOTE:IIC 总线在传送每个Byte后,都会从IIC总线上的接收设备得到一个ACK信号来确认接收到了数据。其中,第一个Byte的设备地址中,前7位是地址码,第 8位是方向位(“0”为发送,“1”为接收)。IIC的中断信号有:ACK,Start,Stop。



                                                                                                图2 IIC Byte Write

         Write功能的实际实现原理如图3所示:

        (1)设置GPIO的相关引脚为IIC输出;

        (2)设置IIC(打开ACK,打开IIC中断,设置CLK等);

        (3)设备地址赋给IICDS ,并设置IICSTAT,启动IIC发送设备地址出去;从而找到相应的设备即IIC总线上的设备。

        (4)第一个Byte的设备地址发送后,从EEPROM得到ACK信号,此信号触发中断;

        (5)在中断处理函数中把第二个Byte(设备内地址)发送出去;发送之后,接收到ACK又触发中断;

        (6)中断处理函数把第三个Byte(真正的数据)发送到设备中。

        (7)发送之后同样接收到ACK并触发中断,中断处理函数判断,发现数据传送完毕。

        (8)IIC Stop信号,关IIC中断,置位各寄存器。



图3 IIC Write Operation

        NOTE:对于EEPROM,IICDS寄存器发送的数据会先放在Ring buffer中,当其收到stop信号时,开始实际写入EEPROM中。在实际写的过程中,EEPROM不响应从CPU来的信号,直到写完才会响应,因而有一段延迟代码。在page write时,注意一定要有延时!

        NOTE: 数据先写到EEPROM的ring buffer中,收到Stop信号时,开始实际地把数据写入EEPROM,这时不响应任何输入。即这时Write函数中后面的延时中,向其发 slvaddr时,不会得到ACK,直到数据写完时,才会收到ACK。

1.3、IIC总线Random Read

        IIC总线读数据为Current Address Read,Random Read,Sequential Read

        IIC 总线Random Read传送格式如图4所示。开始信号后,CPU开始写第一个Byte(IIC的设备地址),第二个Byte是设备内的地址(此地址保存在设备中)。然后开始读过程:发送设备地址找到IIC设备,然后就开始读数据。类似写过程,CPU读一个byte的实际数据后,CPU向IIC的EEPROM 发ACK,ACK触发中断。读数据也在中断程序中进行。




图4 IIC Random Read Operation

二、I2C架构概述

        在linux中,I2C驱动架构如下所示:



图5 I2C驱动架构1

        Linux中I2C体系结构如下图所示(图片来源于网络)。图中用分割线分成了三个层次:用户空间(也就是应用程序),内核(也就是驱动部分)和硬件(也就是实际物理设备)。我们现在就是要研究中间那一层。

2.1、I2C驱动概述

        Linux的I2C驱动结构可分为3个部分:

        a、  I2C核心

        I2C 核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“algorithm”),与具体适配器无关的代码以及探测设备、检测设备地址等。i2c-core.c中的核心驱动程序可管理多个I2C总线适配器(控制器)和多个I2C从设备。每个I2C从设备驱动都能找到和它相连的I2C总线适配器。

        b、 I2C总线驱动

        I2C总线驱动主要包括I2C适配器结构i2c_adapter和I2C适配器的algorithm数据结构。

        通过I2C总线驱动的代码,可控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。

    c、 I2C设备驱动

        I2C设备驱动是对I2C设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。I2C设备驱动主要包括数据结构i2c_driver和i2c_client。


图6 I2C驱动架构2

        如上图所示,每一条I2C总线对应一个adapter。在kernel中,每一个adapter提供了一个描述的结构(struct i2c_adapter),也定义了adapter支持的操作。再通过i2c core层将i2c设备与i2c adapter关联起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值