I2C
--介绍
I2C(Inter-intergrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线,一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步;I2C总线硬件结构简单,简化了PCB布线,降低了系统成本,提高了系统的可靠性,因此在各个领域得到了广泛应用。
I2C总线是一种多主机总线,连接在I2C总线上的器件分为主机和从机。主机有权发起和结束一次通信,从机只能被动呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到I2C总线上的器件都有一个唯一的地址(7bit),传输数据的设备间是简单的主从关系,每个器件既可以作为主机也可以作为从机(但同一时刻只能有一个主机)总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器
I2C总线可以通过外部连线进行在线检测,便于系统故障诊断和调试,故障可以立即被寻址,软件也有利于标准化和模块化,缩短开发时间
串行的八位双向数据传输速率在标准模式下可达100bit/s,快速模式下可达400bit/s,高速模式下可达3.4Mbit/s
--通信过程
1.主机发送起始信号启用总线
2.主机发送一个字节数据指明从机地址和后续字节的传输方向
3.被寻址的从机发送应答信号回应主机
4.发送器发送一个字节
5.接收器发送应答信号回应发送器
6. .......(循环步骤4,5)
7.通信完成后主机发送停止信号释放总线
注意点:
第四步和第五步用的是发送器和接收器,不是主机和从机,这是由第一个字节的最后一位来决定主机给从机发送,还是从机给主机发送。也就是说,第一个字节和最后的停止信号一定是主机发给从机的,但中间就不一定了。
发送数据过程中不允许改变发送方向
--I2C总线的信号类型
I2C总线在传输数据过程中共有3种类型信号:开始信号、结束信号、响应信号
-开始信号(S)和结束信号(P)
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据
起始信号和停止信号都是由主机发出,起始信号产生后总线处于占用状态,停止信号产生后总线被释放,处于空闲状态。(空闲时,SCL与SDA都是高电平)
停止情况由俩种:
1.主机不想发了,就发送停止信号
2.从机不想接了,不应答,主机就发送停止信号结束此次通信
-响应信号(ACK)
接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平
(注意:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化)
--I2C总线的数据传输格式
I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位(MSB)后传送低位,发送器发送完一个字节数据后接收器必须发送1位应答位来回应发送器,即一帧共有9位
启动一个传输时,主机先发送S信号,然后发出8位数据,这8位数据中前7位为从机地址,第8位表示传输的方向(0表示写操作,1表示读操作)从机收到后会发出一个ACK信号
(注意:主机接收器在接收到最后一个字节后,也不会发出ACK信号。于是从机发送器释放SDA线,以允许主机发出P信号结束传输)
--iMX6ull I2C控制器介绍
inter IC提供标准I2C从机和主机的功能,I2C被设计为兼容标准NXP I2C总线协议
I2C是一种双线串行总线,它提供了一种简单有效的数据交换方法,最大限度地减少了设备之间的互连,这种总线适用于需要在许多设备之间偶尔进行短距离通信的应用,灵活的标准允许将其他设备连接到总线上,以进行扩展和系统开发
-I2C控制器设计
-Clocks
I2C有俩个输入时钟
I2C的时钟源说明如下表所示
外围时钟:这个时钟用于外围总线寄存器读写
模块时钟:这是I2C的功能时钟。串行位时钟频率来源于模块时钟。模块时钟与外设时钟是同步的,在Fast模式下,模块时钟的最小频率应为12.8MHz,以实现400kbps的工作
-Arbitration procedure(仲裁程序)
如果多个设备同时请求总线,总线时钟由一个同步过程确定,其中低周期等于设备中最长的时钟低周期,高周期等于最短的时钟低周期,数据仲裁程序决定了竞争设备的相对优先级
如果一个设备发送高逻辑而另一个发送低逻辑,则失去仲裁;立即切换到Slave Receive模式,停止驱动I2Cn_SDA。在这种情况下,从主模式到从模式的转换不会生成Stop条件,同时,硬件在I2C状态寄存器(I2C_I2SR[IAL]表示仲裁丢失)中设置仲裁丢失位
-Initialization sequence(初始化顺序)
在接口能够传输串行数据之前,必须初始化寄存器,如下所列:
1.设置数据采样率(I2C_IFDR[IC]),从系统总线时钟获得SCL频率
2.更新(I2C_IADR)中的地址以定义其从地址(地址范围从0到0x7f)
3.设置I2C使能位(I2C_I2CR[IEN]),使能I2C总线接口系统
4.修改I2C_I2CR中的位,使其选择“主从模式”、“收发模式”、和“中断使能”
-Generation of Start(Start的生成)
初始化程序完成后,可以通过选择主传输模式来发送串行数据,在多主总线系统中,需要测试忙碌的总线(I2C_I2SR[IBB])以确定串行总线是否空闲,如果总线是空闲的(IBB=0)则可以发送起始信号和第一个字节(从机地址)。写入数据寄存器的数据包括所需从机的地址,并且最低有效位指示传输方向
停止和下一个开始条件之间的空闲时间内置在生成开始周期的硬件中,根据系统时钟和SCL周期的相对频率,在将调用地址写入数据寄存器(I2C_I2DR)后,可能需要等到I2C不忙,然后再将数据加载到数据寄存器(I2C_I2DR)中
-Generation of Stop(Stop的产生)
数据传输结束后,主站发出停止信号,这可能发生再所有数据发送后,对于主接收器终止数据传输,它必须通过不确认最后一个数据字节通知从站发送器,这是通过在读取倒数第二个字节之前设置传输确认位(I2C_I2CR[TXAK])来完成的,在读取最后一个字节之前,必须生成停止信号
-Generation ofRepeated Start(重复启动的产生)
在数据传输之后,如果主站仍然需要总线,它可以发出另一个启动信号,后面跟着另一个从站地址,而不用发出停止信号
-Post-transfer software response(传输后软件响应)
发送或接收一个字节设置数据传输位(I2C)I2SR[ICF]),表示一个字节的通信完成。完成后,中断转台(I2C_I2SR[IIF])也被设置,如果设置了中断使能(I2C_I2CR[IIEN]),则会产生外部中断。软件必须首先清除中断例程中的中断状态(I2C_I2SR[IIF])
数据传输位(I2C_I2SR[ICF])通过在接收模式下从I2C_I2DR读取或在传输模式下写入该寄存器来清除