首页 > 代码库 > (一)I2C学习

(一)I2C学习

一、介绍
     I2C总线是由Philips公司发明的一种两线式串行总线,用于连接微控制器及其外围设备。I2C最主要的优点是简单、有效。由于不需要额外独立的接口,所以i2c总线占用的空间非常少,减少了电路板的空间和芯片引脚的数量。i2c总线最初是为音频和视频设备开放,现在已应用于各种设备。


二、I2C概述
     I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接受数据,每个设备都有唯一的地址识别。I2C运用主/从双向通信,器件发送数据到总线上则定义为发送器,器件接受数据则是接受器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微处理器)控制,主器件产生SCL控制总线的传输方向,并产生起始和停止条件。SDA上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA上状态的改变被用来表示起始和停止。
     I2C数据格式如下:
    无数据:SCL=1,SDA=1;
    开始位(Start):当SCL=1时,SDA由1向0跳变;
    停止位(Stop):当SCL=1时,SDA由0向1跳变;
    数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;
    当SCL保持为0时,SDA上的数据可随意改变;
    地址位:定义同数据位,但只由发送器发给接收器;
    应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
    否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。
    当数据为单字节传送时,格式为:
       开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。
    当数据为一串字节传送时,格式为:
           开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。
     需要注意的是:
    (1)SCL一直由主器件(Master)控制,SDA依照数据传送的方向,读数据时由从器件(Slave)控制SDA,写数据时由Master控制SDA。当8位数据传送完毕之后,应答位或者否应答位的SDA控制权与数据位传送时相反。
    (2)开始位“Start”和停止位“Stop”,只能由Master来发出。
    (3)地址的8位传送完毕后,成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时,将放弃数据传送,发送“Stop”。
    (4)当写数据的时候,Master每发送完8个数据位,Slave设备如果还有空间接受下一个字节应该回答“ACK”,Slave设备如果没有空间接受更多的字节应该回答“NACK”,Master当收到“NACK”或者一定时间之后没收到任何数据
       将视为超时,此时Master放弃数据传送,发送“Stop”。
    (5)当读数据的时候,Slave设备每发送完8个数据位,如果Master希望继续读下一个字节,Master应该回答“ACK”以提示Slave准备下一个数据,如果Master不希望读取更多字节,Master应该回答“NACK”以提示Slave设备准
       备接收Stop信号。
    (6)当Master速度过快Slave端来不及处理时,Slave设备可以拉低SCL不放(SCL=0将发生“线与”)以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。
    


三、I2C驱动框架
Linux的I2C体系结构分为3个组成部分:
1.I2C核心
I2C 核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“algorithm”)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
2.I2C总线驱动
I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至直接集成在CPU内部。
I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。
经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。
3.I2C设备驱动
I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。