I2C协议简介
I2C总线式有Philips 公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可连接于总线上的器件之间传送信息。
主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系是不恒定的,而取决于此时数据传送方向。同一时刻只允许一个主机。
SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出。通过上拉电阻接正电源,当总线空闲时,两根线都是高电平。
主设备和从设备:
系统中的所有外围器件都具有一个7位的\从器件专用地址码\,其中高四位为器件类型,由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。
主端必须是带有CPU的逻辑模块,在同一总线上同一时刻使能有一个主端,可以有多个从端,从端的数量受地址空间和总线的最大电容400PF的限制
二者都可以传输数据,但是从设备不能发起传输,且传输是受主设备控制的。
数据传输
发送到SDA线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制。每个字节后面必须跟一个响应。首先传输的是最高位(MSB),如果从机要完成其他一些功能(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟线SCL保持低电平,迫使主机进入等待状态,当从机准备好接收下一个数据字节并释放时钟线SCL后数据传输继续。
应答响应
数据传输必须带响应,相关的响应时钟脉冲由主机产生。在响应的时钟脉冲期间发送器释放SDA线
上图表示的是I2C总线数据传输和应答响应
开始信号:当SCL为高期间,SDA由高到低的跳变;停止信号:当SCL为低期间,SDA由低到高的跳变;起始信号都是一种电平跳变时序信号,而不是一个电平信号。起始信号和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态。
ACK 发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为高电平时,规定为有效应答(ACK简称应答位),表示接收器已经成功接收了该字节。应答信号位高电平时,规定为非应答位(NACK),一般表示接收没有成功。
对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。
数据的有效性
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
数据的传送:
在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位传送每一位数据。数据的传输时边沿触发。
分析一波代码,嘻嘻:
首先SDA和SCL均为输入输出三端口(串行时钟线,串行数据线)可以设置一个是使能信号,如果是高的话就输入,如果是低的话就输出。时钟上升沿输入,时钟下降沿输出
首先判断起始信号和停止信号
输入的话就有一个时钟输入信号,一个时钟输出信号,有一个复位信号,输出一个周期的应答信号,有一个串行数据线和一个并行数据线。一个读信号,一个写信号,输入地址线。
通过不同的开关控制,是的SDA在不同的情况下输出的数据不同
这里有两个比较终于好的代码块。首先是一个串行数据转并行数据,另一个是并行数据转串行数据。
实现方法:
串行数据转并行数据:设一个寄存器(时钟上升沿触发),第一个输入的SDA放在寄存器的最高位,第二个输入的SDA放在寄存器的次高位,。。。。。第8个输入的数据放在最低位。
并行数据转串行数据:也是设计一个寄存器,每个时钟周期下都左移一次,然后截取这个寄存器的最高位输出。
读写操作的状态转换:空闲——准备——写开始——写控制字——写入地址——写入数据——操作停止——应答——空闲
:空闲——准备——写开始——写控制字——写入地址——读开始——读控制字——读数据——操作停止——应答——空闲
在每个状态的后面都添加一个标志信号,如果这个状态完成了就将其拉高。