IIC
I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
IIC总线物理层的特点:
1 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机;
2 一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步;
3 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问;
4 总线通过上拉电阻(通常4.7K)接到电源(2 ~ 15V)。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平;
5 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线;
6 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多IIC设备尚不支持高速模式;
7 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 ;
IIC总线协议层:
IIC的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
接下来的这些内容全部来自于IIC总线协议:
1 数据有效性:
由于连接到IIC总线上的设备工艺不同,逻辑0和逻辑1的电平不是固定的(由VDD决定),每传输一个数据位就产生一个时钟脉冲;
SDA 线上的数据必须在时钟的高电平周期保持稳定。SDA线高/低电平状态只有在 SCL 线的时钟信号是低电平时才能改变;
2 起始和终止条件
起始条件: SCL 线是高电平时 SDA 线从高电平向低电平切换;
终止条件: SCL 是高电平时 SDA 线由低电平向高电平切换;
起始信号:
// step1 把两根总线拉高
SDA = 1;
SCL = 1;
// step2 等待电平稳定
delay(us);
// step3 依次拉低SDA SCL(中间要等待电平稳定)
SDA = 0;
delay(us);
SCL = 0;
delay(us);
终止信号:
// step1 两根线按时间轴拉低
SCL = 0;
SDA = 0;
// step2 等待电平稳定
delay(us);
// step3 按时间轴依次拉高
SCL = 1;
delay(us);
SDA = 1;
delay(us);
3 传输数据
字节格式
发送到 SDA 线上的每个字节必须为8位,每次传输可以发送的字节数量不受限制 每个字节后必须跟一个应答位。首先传输的是数据的最高位 MSB。如果从机要完成一些其他功能后 例如一个内部中断服务程序,才能接收或发送下一个完整的数据字节,可以使时钟线 SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。
7位设备地址和8位设备地址
比如EEPROM的设备地址为:1111 000,有时会写为0X78,这都表示7位设备地址。
8位设备地址:7位地址 + 读写位
读地址:0X78 + 1 = (1111 000) << 1 + (0000 0001) = 0XF1 = 1111 0001
写地址:0X78 + 0 = (1111 000) << 1 + (0000 0000) = 0XF0 = 1111 0000
4 数据应答
数据传输必须带响应。相关的时钟脉冲由主机产生,在响应的时钟脉冲期间,发送器释放SDA线,此时被SDA被自动拉高。在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平;
通常,被寻址的接收器在接收到的每个字节后,除了用CBUS地址开头的报文,必须产生一个响应;
当从机不能响应从机地址时,例如它正在执行一些实时函数不能接收或发送,从机必须使数据线保持高电平,主机然后产生一个停止条件终止传输,或者产生重复起始条件开始新的传输;
5 数据的传输格式
传输过程描述:
- 起始信号;
- 一个字节(7位地址 + 读写位)+ ACK;
- 一个数据字节 + ACK;
- ...
- 停止信号;
几种可能的数据格式:
1 主机向从机写入数据,整个的传输方向不变;
2 主机在发送第一个字节后,立即读从机。后面的字节传输方向发生改变,第一次的应答仍由从机产生,后续的应答信号全部由主机产生,当读取到指定个数的数据时,主机先发送非应答信号,然后发送停止信号。
3 复合格式
传输改变方向的时侯,起始条件和从机地址都会被重复。但R/ W位取反。如果主机接收器发送一个重复起始条件,它之前应该发送了一个不响应信号。
复合格式可以用于例如控制一个串行存储器(EEPROM),先写从机设备地址,然后在第一个数据字节期间,要写内部存储器的地址。再重复起始条件和从机地址后,数据可被传输。
复合格式的一般应用:
前面一般是7位设备地址+0(写方向),然后第一个数据字节(发送要读取的寄存器地址),这个地址会被EEPROM内部保存起来,然后重新发送起始信号,再写7位设备地址+1(读方向),接下来就可以读到数据。
6 数据位定义