IIC通信简介
在这里插入图片描述
一、简介
-
产生
PHILIPS(飞利浦)
-
特点
-
占用的引脚数量少
- SDA
- SCL
-
支持多主多从
-
通信协议相对比较简单,通讯速率相对比较高
-
-
用途
- 经常用在MCU跟各种扩展模块(传感器、oled、存储器…)之间
-
分类
- 串行通信
- 同步通信
-
传输速度
- 标准:100Kbit/s
- 高速:400Kbit/s
- 超高速:3.4Mbit/s(能够支持的很少)
二、硬件连接
- 总线形式
三、软件协议
1. 信号分类
- I2C 的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节
2. 基本读写过程
- 写得过程
- 读的过程
3. 基本信号的时序
- 起始信号与停止信号
- 数据
-
响应
- 应答:高电平
- 非应答:低电平
四、IO模拟IIC时序
1. 延时函数
- 通信速率约50K
void Delay10us()
{
uint8_t a,b;
for(b=1;b>0;b--)
for(a=2;a>0;a--);
}
2. 起始信号
void IIcStart()
{
SDA=1;
Delay10us();
SCL=1;
Delay10us();//建立时间是 SDA 保持时间>4.7us
SDA=0;
Delay10us();//保持时间是>4us
SCL=0;
Delay10us();
}
3. 停止信号
void IIcStop()
{
SDA=0;
Delay10us();
SCL=1;
Delay10us();//建立时间大于 4.7us
SDA=1;
Delay10us();
}
4. 发送一个字节
/**
* 返回0:应答成功
* 返回1:非应答
*/
uint8_t IIcSendByte(uint8_t dat)
{
uint8_t a=0,b=0;//最大 255,一个机器周期为 1us,最大延时255us。
// 发送一个字节
for(a=0;a<8;a++)//要发送 8 位,从最高位开始
{
SDA=dat>>7; //起始信号之后 SCL=0,所以可以直接改变 SDA 信号
dat=dat<<1;
Delay10us();
SCL=1;
Delay10us();//建立时间>4.7us
SCL=0;
Delay10us();//时间大于 4us
}
SDA=1;
Delay10us();
SCL=1;
// 等待应答
while(SDA)//等待应答,也就是等待从设备把 SDA 拉低
{
b++;
if(b>200) //如果超过 2000us 没有应答发送失败,或者为非应答,表示接收结束
{
SCL=0;
Delay10us();
return 0;
}
}
SCL=0;
Delay10us();
return 1;
}
5. 接收一个字节
uint8_t IIcReadByte()
{
uint8_t a=0,dat=0;
SDA=1; //起始和发送一个字节之后 SCL 都是 0
Delay10us();
for(a=0;a<8;a++)//接收 8 个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}
起始和发送一个字节之后 SCL 都是 0
Delay10us();
for(a=0;a<8;a++)//接收 8 个字节
{
SCL=1;
Delay10us();
dat<<=1;
dat|=SDA;
Delay10us();
SCL=0;
Delay10us();
}
return dat;
}