IIC协议概述
IIC
全称
Inter-Integrated Circuit (
集成电路总线
),属于两线式串行总线,用于连接微控制器及一些外设,属于
半双工同步通信方式
(只能接收信号不能返回)
一、特点及构成
特点:1、简单有效:接口直接在组件上,所以IIC总线占用空间小,减少电路板的空间及管脚的数量,最大传输效率为10kbps。2、多组控:任何能够进行发送和接收的设备都可以成为主总线,一个主控能够控制信号的传输和时钟频率,任何时间点上只能有一个主控。
构成:IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线 的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。
二、IIC协议传输数据的基本过程步骤
1.起始信号
时钟线SCL为高电平时数据线SDA保持5us左右,SDA再拉低5us即为一个起始信号。
void IIC_Start()//起始信号
{
SCL = 1;
SDA = 1;
_nop_();//一个机器周期实际可能有5us,理论上是1us
SDA = 0;
_nop_();
}
2.终止信号
时钟线SCL为高电平时SDA为低电平保持5us ,SDA再到高电平5us,即为一个终止信号。
void IIC_Stop()//终止信号
{
SCL = 1;
SDA = 0;
_nop_();//一个机器周期实际可能有5us,理论上是1us
SDA = 1;
_nop_();
}
3.应答信号
发送器每发送一个字节(8
个
bit
),就在时钟脉冲
9
期间释放数据线(SDA=1释放数据),由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(
ACK
,简称应答位),表示接收器已经成功地接收了该字
节;
应答信号为高电平时,规定为非应答位(
NACK
),一般表示接收器接收该字节没有成功。
![](https://img-blog.csdnimg.cn/940b5536941d4142a9f399a9813ccddf.png)
char IIC_ACK()//应答信号
{
char flag;
SDA = 1;//就在时钟脉冲9期间释放数据线
_nop_();//等待一段时间再重新读取数据线
SCL = 1;//读取数据前要将时钟线SCL拉高才能读取
_nop_();//等待一段时间后读取数据
flag = SDA;//记录读取的数据
_nop_();//读完后要拉低SCL,因为SCL只有高位时才能读取数据,为了避免flag记录出错,加个延时
SCL = 0;//读取结束拉低时钟线
_nop_();
return flag;
}
三、IIC数据发送时序
时序图
红线部分为主要部分,SCL为0时可以进行数据的建立SDA = 0/1(取决于读取到的数dataSend,该读取的数据大小为1个字节8位,读取顺序从最高位开始,每次读一位,所以需要读取8次)然后延时一段时间后SCL拉高开始传数据,SCL为高时,SDA不能翻转,不然信号可能会识别错误,接下来再延时一段时间用于数据的发送时间,后SCL重新拉低进行下一个数据的传输,直到一个字节的数据传输结束。
void IIC_send_Byt(char dataSend)
{
int i;
for(i=0; i<8; i++)
{
SCL = 0;//scl为低电平时可以进行数据的翻转
SDA = dataSend & 0x80;//翻转数据,数据是从8个字节的最高位进行传送,与上1000 0000可以获得dataSend最高位数据
_nop_();//翻转后按照时序等待一段时间
SCL = 1;//拉高,开始数据传输,传输期间,数据不允许翻转
_nop_();//数据传输等待
dataSend = dataSend << 1;//最高位数据被获取后左移一位准备获取第二个数据位,直到8个数据位全部获取
//可有可无,数据循环依旧是从SCL的低位开始,也可以这样手动拉低
SCL = 0;//一位数据发送完毕SCL重新拉低
_nop_();//等待下一轮
}
}
小白学习记录,写的一般,欢迎大佬补充————