【转载】WinCE6.0+ S3C6410 IIC驱动学习
转载自:http://jazka.blog.51cto.com/809003/701691
由于Camera驱动中使用了IIC,而且发现现有Camera驱动中,IIC的部分出了问题,所以先入手掌握IIC驱动。
为了能够让整体看着流畅,而且IIC相关的知识不是特别多,所以从IIC的基本知识到驱动源码的分析都做一个介绍。
1、IIC总线介绍
IIC(Inter-Integrated Circuit,内置集成电路总线)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,这对于缓解嵌入式系统资源少的缺陷有很大好处。总线的长度可高达25英尺,总线上的数据的传输速率在标准模式下达到100kb/s,在快速模式下可以达到400kb/s,在高速模式下达到3.4Mb/s。IIC总线支持多主控,其中任何能够进行发送和接收的设备都可以成为主总线。
2、IIC总线工作原理
IIC 总线遵从同步串行传输协议,即各位串行(一位接一位)发送,由时钟(clock )线指示读数据(data )线的时刻。每个数据包前有一个地址,以指示由哪个器件来接收该数据。
IIC采用两根I/O线:一根时钟线(SCL串行时钟线),一根数据线(SDA串行数据线),实现全双工的同步数据通信。IIC总线通过SCL/SDA两根线使挂接到总线上的器件相互进行信息传递。在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。
SDA和SCL都是双向线路,各通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时这两条线路都是高电平,连接到总线的器件输出必须是漏极开路或集电极开路才能执行线与的功能。
IIC在数据传输过程总共产生三种信号:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收器在接收到8bit数据后,向发送器发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
IIC数据传输的两种模式:主设备发送从设备接收和从设备发送主设备接收,这两种模式都需要主机发送开始信号和结束信号,应答信号由接收器产生。从设备的地址一般是1或2个字节,用于区分连接在同一IIC上的不同器件。
3、S3C6410的IIC接口
S3C6410的IIC总线接口有四种操作模式:主控制器发送模式、主控制器接收模式、从属器发送模式和从属器接收模式。
当一个开始信号产生后,IIC总线获得繁忙信号,停止信号将使IIC总线空闲。在一个开始信号后,主控制将发送一个从属器地址来通知从属器设备。一个字节的地址域包含7位地址和1位传输方向指示器,如果为0则表示写操作(发送操作),为1是读操作(接收操作)。
在SDA线上的每一个字节长度必须是8位,每一个字节后面跟随一个应答信号ACK位(acknowledgement)。ACK脉冲在SCL线的第9个时钟产生。发送器在收到ACK信号后,置SDA为高电平来释放SDA线,接收器在ACK发送时钟期间,置SDA为低电平,以使SDA在第9个SCL时钟的高电平期间保持低位。
在发送模式下,当发送数据时,IIC总线接口保持等待,直到写入新数据到IICDS寄存器。在数据写入IICDS之前,SCL一直保持低电平,之后将被释放。6410支持通过中断来判断数据发送是否完成,完成后才可以继续写新数据到IICDS寄存器进行发送。
在接收模式下,当接收数据时,IIC总线接口保持等待,直到IICDS寄存器被读取。在数据从寄存器读出之前,SCL保持低电平,之后才被释放。同样6410支持通过中段来判断数据接收是否完成,完成后便可以继续从IICDS中读取新的数据。
S3C6410处理器有4个寄存器来控制IIC总线的操作:IIC总线控制寄存器(IICCON)、IIC总线控制/状态寄存器(IICSTAT)、IIC总线发送/接收数据移位寄存器(IICDS)和IIC总线地址寄存器(IICADD)。关于各个寄存器的说明请参看手册。