Q:什么是I2C接口?
A:I2C接口(Inter-Integrated Circuit,内部集成电路),它是由Philips公司开发的一种简单、双向二线制同步串行总线。多用于主控制器和器件间的主从通信,在小数据量场合使用,传输距离短,任一时刻只能有一个主机特性,I2C是半双工。
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。
I2C,SPI的区别不仅在物理层,I2C比SPI有着一套更为复杂的协议层定义。下面来分别说明一下I2C的物理层和协议层。
- (一)II2C的物理层
- 只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL。(I2C是半双工,而不是全双工);
- 每个连接到总线的器件都可以通过唯一的地址和其它器件通信,主机/从机角色和地址可配置,主机可以作为主机发送器和主机接收器;
- I2C是真正的多主机总线,(而这个SPI在每次通信前都需要把主机定死,I2C可以在通信过程中,改变主机)。如果两个或更多的主机同时请求总线,可以通过冲突检测和仲裁防止总线数据被破坏。
- 传输速率在标准模式下可以达到100kb/s,快速模式下可以达到400kb/s。
- 连接到总线的IC数量只是受到总线的最大负载电容400pf限制。
- (二)I2C的协议层
a) 数据的有效性
在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。
b) 起始和结束信号
起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始信号;
结束信号:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止信号;
备注:起始信号和终止信号都是由主机发出的,连接到I2C总线的硬件接口,则很容易检测到起始和终止信号。
总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态。
c) 应答
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到数据,从机应答主机所需要的时钟仍是主机提供的。应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。
d) 数据帧格式
I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向为(R/T),用“0”表示主机发送数据(T),用“1”表示主机接收数据(R)。每次数据传送总是由主机产生终止信号结束。但是主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再发出起始信号对另一从机进行寻址。
在总线的一次数据传输过程中,可以有以下几种组合方式:
1) 主机向从机发送数据,数据传送方向在整个传送过程中不变:
2) 主机在第一个字节后,立即从从机读取数据:
3) 在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反向:
Q:I2C总线的用途?
A:I2C总线上允许连接多个微处理器以及各种外围设备,如存储器、LED及LCD驱动、A/D及D/A转换器等。为了保证数据可靠地传送,任一时刻总线只能由某一台主机控制,各微处理器应该在总线空闲时发送数据。