IIC通讯协议理解及部分代码的设置


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 ),一般表示接收器接收该字节没有成功。

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_();//等待下一轮
	}

}

小白学习记录,写的一般,欢迎大佬补充————

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值