预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共33页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

IIC设备驱动程序IIC设备是一种通过IIC总线连接的设备由于其简单性被广泛引用于电子系统中。在现代电子系统中有很多的IIC设备需要进行相互之间通信IIC总线是由PHILIPS公司开发的两线式串行总线用于连接微处理器和外部IIC设备。IIC设备产生于20世纪80年代最初专用与音频和视频设备现在在各种电子设备中都广泛应用IIC总线有两条总线线路一条是串行数据线(SDA)一条是串行时钟线(SCL)。SDA负责数据传输SCL负责数据传输的时钟同步。IIC设备通过这两条总线连接到处理器的IIC总线控制器上。一种典型的设备连接如图:与其他总线相比IIC总线有很多重要的特点。在选择一种设备来完成特定功能时这些特点是选择IIC设备的重要依据。主要特点:1每一个连接到总线的设备都可以通过唯一的设备地址单独访问2串行的8位双向数据传输位速率在标准模式下可达到100kb/s;快速模式下可以达到400kb/s;告诉模式下可以达到3.4Mb/s3总线长度最长7.6m左右4片上滤波器可以增加抗干扰能力保证数据的完成传输5连接到一条IIC总线上的设备数量只受到最大电容400pF的限制6它是一个多主机系统在一条总线上可以同时有多个主机存在通过冲突检测方式和延时等待防止数据不被破坏。同一时间只能有一个主机占用总线IIC总线在传输数据的过程中有3种类型的信号:开始信号、结束信号、和应答信号>>开始信号(S):当SCL为高电平时SDA由高电平向低电平跳变表示将要开始传输数据>>结束信号(P):当SCL为高电平时SDA由低电平向高电平跳变表示结束传输数据>>响应信号(ACK):从机接收到8位数据后在第9个周期拉低SDA电平表示已经收到数据。这个信号称为应答信号开始信号和结束信号的波形如下图:主机:IIC总线中发送命令的设备对于ARM处理器来说主机就是IIC控制器从机:接受命令的设备主机向从机发送数据:主机通过数据线SDA向从机发送数据。当总线空闲时SDA和SCL信号都处于高电平。主机向从机发送数据的过程:1当主机检测到总线空闲时主机发出开始信号2主机发送8位数据。这8位数据的前7位表示从机地址第8位表示数据的传输方向。这时第8位为0表示向从机发送数据3被选中的从机发出响应信号ACK4从机传输一系列的字节和响应位5主机接受这些数据并发出结束信号P完成本次数据传输由上图可知IIC控制器主要是由4个寄存器来完成所有的IIC操作的。IICCON:控制是否发出ACK信号是否开启IIC中断IICSTAT:IICADD:挂载到总线上的从机地址。该寄存器的[7:1]表示从机地址。IICADD寄存器在串行输出使能位IICSTAT[4]为0时才可以写入;在任何时候可以读出IICDS:保存将要发送或者接收到的数据。IICCDS在串行输出使能IICSTAT[4]为1时才可以写入;在任何时间都可以读出因为IIC设备种类太多如果每一个IIC设备写一个驱动程序那么显得内核非常大。不符合软件工程代码复用所以对其层次话:这里简单的将IIC设备驱动分为设备层、总线层。理解这两个层次的重点是理解4个数据结构这4个数据结构是i2c_driver、i2c_client、i2c_algorithm、i2c_adapter。i2c_driver、i2c_client属于设备层;i2c_algorithm、i2c_adapter属于总线型。如下图:设备层关系到实际的IIC设备如芯片AT24C08就是一个IIC设备。总线层包括CPU中的IIC总线控制器和控制总线通信的方法。值得注意的是:一个系统中可能有很多个总线层也就是包含多个总线控制器;也可能有多个设备层包含不同的IIC设备由IIC总线规范可知IIC总线由两条物理线路组成这两条物理线路是SDA和SCL。只要连接到SDA和SCL总线上的设备都可以叫做IIC设备。一个IIC设备由i2c_client数据结构进行描述:structi2c_client{unsignedshortflags;//标志位unsignedshortaddr;//设备的地址低7位为芯片地址charname[I2C_NAME_SIZE];//设备的名称最大为20个字节structi2c_adapter*adapter;//依附的适配器i2c_adapter适配器指明所属的总线structi2c_driver*driver;//指向设备对应的驱动程序structdevicedev;//设备结构体intirq;