FPGA学习笔记——IIC协议简介
目录
一、IIC概述
二、IIC物理层
三、IIC协议层
(1)字节传送与应答
(2)数据帧格式
四、写操作
五、读操作
一、IIC概述
IIC (I2C,Inter-Integrated Circuit)即集成电路总线,由PHILIPS公司开发,使用主从架构,是由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而开发的两线式串行通信总线。IIC总线具备广泛用途,比如数据采集领域的串行AD,图像处理领域的摄像头配置,EEPROM的使用,更重要的是IIC总线上可以挂载非常多的外设。 对于一些低速器件的访问非常节省IO资源,由于是标准的总线接口,使用起来非常方便。
二、IIC物理层
SDA:双向串行数据线,传输通讯数据;
SCL:串行时钟线,用于同步通讯数据。
物理层特点:
(1)IIC总线物理连接是由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻构成,其空闲状态SCL和SDA均为高电平。(2)IIC总线支持多主多从,总线上挂载的多个设备其中任何一个能够进行发送和接收的设备都可以成为主机。一个主控能够控制信号的传输和时钟频率,但是在任何时间点上只能有一个主控。所有接到IIC总线上的从设备的串行数据SDA分别接到IIC总线的SDA上,从设备的时钟线SCL分别接到IIC总线的SCL上。IIC总线上的每个从设备都有自己一个唯一的地址,来确保不同设备之间访问的准确性。(3)传输速率:IIC 总线上数据的传输速率在标准模式下可达 100kbit/s ,在快速模式下可达 400kbit/s, 在高速模式下可达 3.4Mbit/s。
三、IIC协议层
(1)字节传送与应答
每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
1.开始条件:主设备在SCL高电平时,将SDA的电平由高拉低,这种情况表示起始条件,标志着一次数据传输开始。若有两个主设备同时想控制总线,先拉低SDA的master获得控制权。2.停止条件:master在SCL 保持高电平期间,SDA 被释放,返回高电平,这种情况表示停止条件,标志着一次数据传输的终止。停止信号由master主动建立的,建立该信号之后,IIC 总线将返回空闲状态。3.数据传输:在 IIC 总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在 SCL 串行时钟的配合下,在 SDA 线上逐位地串行传送每一位数据,首先传输数据最高位(MSB)。进行数据传送时,在SCL 的高电平期间, SDA 上的电平必须保持稳定,只有在 SCL 为低电平期间,才允许 SDA 上的电平改变状态。即数据在 SCL 的上升沿到来之前就必须准备好,并在在下降沿到来之前必须保持稳定。4.应答ACK/ NACK:IIC 总线上的所有数据都是以字节传送的,发送端每发送一个字节,就必须在第9个SCL脉冲期间释放SDA,由接收端反馈一个应答信号。
(2)数据帧格式
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T)(写数据),“1”表示主机接收数据(R)(读数据)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
一个从机的7位寻址位有4位是固定位,3位是可编程位,这时仅能寻址8个同样的器件,即可以有8个同样的器件接入到该I2C总线系统中。
这是交流特性(AC特性),可以根据这个来写时序。
四、写操作
进行写操作时,首先发送该器件的7位地址码和写方向位“0”(共8位,即一个字节),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为相应,单片机收到应答后就可以传送数据了。
传送数据时,首先发送一个字节的被写入器件的存储区的首地址(Word Address),收到存储器器件的应答后,就逐个发送各数据字节,但每发送一个字节后都要等待应答。
字节写:主设备发送从机的地址+“0”,等待从设备响应(在第9个时钟周期等待从设备将SDA拉低),再发送寻址地址(这里我理解的就是在EEPROM里面的哪个位置开始写,相当于RAM里面的随机存),然后发送要写入的数据,最后发送停止信号。
页写:发送多个要写入的字节数据(两个及其以上)。
五、读操作
这里的读操作分为三种:
1.当前地址读取
2.随机读取
3.顺序读取
当前地址读取:先发送该器件的7位地址码和读方向位“1”,发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。
然后,从设备发送一个字节数据,主设备应返回“非应答”(高电平),并发出停止信号以结束读出操作。
随机读取:先发送该器件的7位地址码和写方向位“0”(“伪写”),发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。
然后,再发一个字节的要读出器件的存储区的首地址,收到应答后,主设备要重复一次起始信号并发出器件地址和读方向位(“1”),收到器件应答后就可以读出数据字节,每读出一个字节,主设备都要回复应答信号。
当最后一个字节数据读完后,主设备应返回以“非应答”(高电平),并发出停止信号以结束读出操作。
顺序读取:先发送该器件的7位地址码和读方向位“1”,发送完后释放SDA线并在SCL线上产生第9个时钟信号。被选中的存储器器件在确认是自己的地址后,在SDA线上产生一个应答信号作为回应。
然后,从设备发送一个字节数据,主设备应返回“应答”(低电平),收到应答后,从设备就开始发送数据,每发送一个字节数据,主设备都要回应“应答”(低电平),
当最后一个字节数据读完后,主设备应返回以“非应答”(高电平),并发出停止信号以结束读出操作。
以上就是IIC协议简介。(如果有错误,还请大家指出来,谢谢!)