一:什么是i2c
1.1 协议概述
IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式.
1.2 特点
简单性和有效性。
由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大 传输速率支持40个组件
多主控(multimastering)
其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
1.3 构成
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。
二 如何实现I2C
I2C包括起始信号,终止信号,和应答信号 。其中起始信号是不可缺的。
2.1 起始信号
通过起始信号时序图,我们可以看出。在虚线框之内,SCL始终为高电平。 而SDA是高到低一个电平的跳转。SDA高电平时间持续大于4.7us,低电平持续时间大于4us。 - void IIC_start ()
- {
- scl = 1;//首先将scl拉高
- sda = 1;//拉高sda
- Delay5us();//SDA高电平时间持续大于4.7us
- sda = 0;//低电平持续时间大于4us。
- Delay5us();
- }
复制代码
2.2 终止信号
通过终止信号时序图,我们可以看出。在虚线框之内,SCL始终为高电平。 而SDA是低到高一个电平的跳转。SDA高电平时间持续大于4.7us,低电平持续时间大于4us。 - void IIC_stop ()
- {
- scl = 1;//首先将scl拉高
- sda = 0;//拉低sda
- Delay5us();//SDA高电平时间持续大于4.7us
- sda = 1;//低电平持续时间大于4us。
- Delay5us();
- }
复制代码
2.3 应答信号 (ack)
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字 节; 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 - char IIC_ack()
- {
- char flag;//建立一个标志位,来获取sda
- sda = 1;释放数据线
- Delay5us();
- scl = 1;
- Delay5us();
- flag = sda;
- Delay5us();
- scl = 0;
- Delay5us();
- }
复制代码
2.4 发送字节
根据时序图可以看出,当scl为高电平时发送数据。sda发送的数据可以为0或1.但sda数据线高低电平变化不能发生在SCL高电平期间,否则设备将会认为终止信号或起始信号。 - void IIC_send_byte (char sendata)
- {
- int i;//没执行发送一位,发送八次为一个字节
- for(i=0;i<8;i++){
- scl = 0;
- _nop_();//调用一个空函数 时间为5微秒
- sda = sendata & 0x80;//获取最高位 1000 0000
- _nop_();
- scl = 1;
- _nop_();
- scl = 0;
- _nop_();
- sendata = sendata << 1;左移一位
- }
- }
复制代码
三 总结
经过三个函数的封装,就可以使用I2C协议。配合设备时序图,就可以完成IIC通信。下一节将IIC和oled配合使用. oled部分:oled详细教程 |