Linux驱动之I2C总线驱动开发

一、IIC 基础概念

1.I2C 基础概念

IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线 ###1.IC总线的特点
IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。IIC总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

2.I2C总线工作原理

a – 总线构成
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,IIC总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分:
1) 地址码用来选址,即接通需要控制的电路,确定控制的种类;
2) 控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。
这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
b – 信号类型
IIC总线在传送数据过程中共有四种类型信号:
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据;
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据;
数据传输信号:在开始条件以后,时钟信号SCL的高电平周期期问,当数据线稳定时,数据线SDA的状态表示数据有效,即数据可以被读走,开始进行读操作。在时钟信号SCL的低电平周期期间,数据线上数据才允许改变。每位数据需要一个时钟脉冲。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

目前有很多半导体集成电路上都集成了IIC接口。带有IIC接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供IIC接口。

3、总线基本操作

IIC规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。
a – 控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。
b – 写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序。
c – 读操作
读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。
d – 总线仲裁
主机只能在总线空闲的时候启动传输。两个或多个主机可能在起始条件的最小持续内产生一个起始条件,结果在总线上产生一个规定的起始条件。
当SCL线是高电平时,仲裁在SDA线发生:这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平和它自己的电平不同。
仲裁可以持续多位。从地址位开始,同一个器件的话接着就是数据位(如果主机-发送器),或者比较相应位(如果主机-接收器)。IIC总线的地址和数据信息由赢得仲裁的主机决定,在这个过程中不会丢失信息。
仲裁不能在下面情况之间进行:
1)重复起始条件和数据位;
2)停止条件和数据位;
3)重复起始条件和停止条件。
4、特性总结
IIC肯定是2线的(不算地线)IIC协议确实很科学,比3/4线的SPI要好,当然线多通讯速率相对就快了
IIC的原则是
a – 在SCL=1(高电平)时,SDA千万别忽悠!!!否则,SDA下跳则”判罚”为”起始信号S”,SDA上跳则”判罚”为”停止信号P”.
b – 在SCL=0(低电平)时,SDA随便忽悠!!!(可别忽悠过火到SCL跳高)
c – 每个字节后应该由对方回送一个应答信号ACK做为对方在线的标志.非应答信号一般在所有字节的最后一个字节后.一般要由双方协议签定.
d – SCL必须由主机发送,否则天下大乱
e – 首字节是”片选信号”,即7位从机地址加1位方向(读写)控制.从机收到(听到)自己的地址才能发送应答信号(必须应答!!!)表示自己在线.其他地址的从机不允许忽悠!!!(当然群呼可以忽悠但只能听不许说话)
f – 读写是站在主机的立场上定义的.”读”是主机接收从机数据,”写”是主机发送数据给从机.
g– 重复位主要用于主机从发送模式到接收模式的转换”信号”,由于只有2线,所以收发转换肯定要比SPI复杂,因为SPI可用不同的边沿来收发数据,而IIC不行.
h – 在硬件IIC模块,特别是MCU/ARM/DSP等每个阶段都会得到一个准确的状态码,根据这个状态码可以很容易知道现在在什么状态和什么出错信息.
i – 7位IIC总线可以挂接127个不同地址的IIC设备,0号”设备”作为群呼地址.10位IIC总线可以挂接更多的10位IIC设备.

二、 Linux下IIC驱动架构

Linux定义了系统的IIC驱动体系结构,在Linux系统中,IIC驱动由3部分组成,即IIC核心、IIC总线驱动和IIC设备驱动。这3部分相互协作,形成了非常通用、可适应性很强的IIC框架。

1、架构层次分类

  第一层:提供i2c adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动soc控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断。覆盖图中的硬件实现

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux驱动开发中的I2C(Inter-Integrated Circuit)是一种串行通信协议,用于连接微控制器、传感器、存储器等外设。下面是关于Linux驱动开发中的I2C的一些重要概念和步骤: 1. I2C总线I2C总线是一种多主从设备的串行通信总线,可以同时连接多个设备。在Linux中,I2C总线I2C控制器和I2C适配器组成。 2. I2C控制器:I2C控制器是硬件模块,负责控制I2C总线的通信。在Linux中,每个I2C控制器都有一个对应的驱动程序。 3. I2C适配器:I2C适配器是与I2C总线连接的硬件接口,可以是主机上的硬件接口或者通过GPIO模拟的软件接口。在Linux中,每个I2C适配器都有一个对应的驱动程序。 4. I2C设备驱动:每个连接到I2C总线上的设备都需要一个对应的设备驱动程序来进行控制和通信。在Linux中,每个I2C设备都有一个对应的驱动程序。 在Linux驱动开发中,使用I2C的步骤如下: 1. 注册I2C适配器:首先需要在Linux内核中注册I2C适配器,以便系统能够识别和管理I2C总线上的设备。 2. 创建I2C设备驱动:为每个连接到I2C总线上的设备编写对应的设备驱动程序,包括设备的初始化、读写操作等。 3. 注册I2C设备驱动:将设备驱动程序注册到Linux内核中,以便系统能够正确地加载和使用该驱动程序。 4. 使用I2C设备:在应用程序中通过打开设备文件、调用相应的读写接口来使用I2C设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值