文章目录
一:什么是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详细教程