51单片机学习记录(13) “初识I2C总线原理部分“

51单片机学习记录(13) “初识I2C总线原理部分”

概要(了解即可)

在这里插入图片描述

在这里插入图片描述

  1. I2C总线是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。
  2. 其中SDA为数据线,SCL为时钟线
  3. 总线上可以接任一器件,从第二张图也可以看出两根线均上拉了电阻连接了+VDD.所以当总线空闲时,两根线均为高电平,当任一器件输出低平时,总线的信号都会变低.也就是各器件的数据线和时钟线都是线"与"关系(只要有一器件输出低电平,其余器件都为低电平)
  4. 总线上的器件地址都是唯一确定的

数据的传送

1.数据位的有效性规定

在这里插入图片描述

在进行数据传送时,时钟信号为高电平期间,数据线(SDA)上的数据必须保持稳定, 只有在时钟线(SCL)上的信号为低电平期间,数据线上的高低电平状态才允许变化(交叉部分),也就是说这时候传入的数据才是有效的。
2.起始与终止信号

在这里插入图片描述

图示为时序图其中图中标出的部分就是我们需要关注的地方,当时钟线(SCL)在处高电平期间,数据线(SDA)由高电平向低电平的跳变(下降沿)表示起始信号。 当时钟线(SCL)在处高电平期间,数据线(SDA)由低电平向高电平的跳变(上升沿)表示终止信号。

数据的传送格式

字节的传送与应答

在这里插入图片描述

前面说过在进入交叉部分后,传送的数据才是有效的。且传送的每一个字节必须保证是8位长度,传送时先传送最高位(MSB),每当传送完一个字节后面都必须跟一位应答位,即一帧有9位
总线的寻址

I2C总线协议有明确的规定:采用7位的寻址字节(寻址字节是起始信号后的第一个字节)
在这里插入图片描述

如上图所示,从第7位到第1位是组成从机的地址的,而最后一位是"数据传送的方向位" 当R/W=0时表示主机向从机写数据,当R/W=1时表示主机向从机读数据
主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正被主机寻址,根据R/W位将自己确定为发送器或接收器

数据帧格式

由上图可以知道从机的地址是7位的,还有一位数据传送方向位。因为I2C总线上传送的数据信号是多样的,既有地址信号,又有数据信号,所以在起始信号后必须传送一个7位的从机的地址,和一位数据传送的方向位
每一次数据传送总是由主机产生的终止信号结束,如果要一直占用总线进行新的数据传送,不产生终止信号即可,再一次发出起始信号对另一从机进行寻址,于是就产生了以下几种组合的方式(数据传送的流程图)

注: 有阴影的部分表示数据由主机向从机传送,无阴影则表示数据由从机向主机传送 A表示应答 A非表示非应答(高电平),S表示起始信号,P表进终止信号。

  1. 主机向从机发送数据,数据传送方向在整个传送过程中不变
    在这里插入图片描述
首先主机发送起始信号,然后发送从机的地址,接着发送0表示现在主机向从机写数据,从机应答表示接收。随后主机开始发送数据,从机应答。如此下去,当主机发完最后的数据或是想要结束发送,从机可以应答或非应答信号,最后主机发送终止信号表示已结束。
  1. 主机在第一个字节后,立即从从机读数据
    在这里插入图片描述
主机发送起始信号的从机地址后,发送1表示向从机读取数据,这时从机发送应答表示接收,紧接着从机开始发送数据,主机发送应答表示已接收,当发送完所有数据后,主机发送非应答信号并发送终止信号表示结束。
  1. 在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反向
    在这里插入图片描述
解读的方式和上面的差不多,这里就不在细说了

模拟信号(重要)

因为80C51单片机上并没有I2C总线的接口,但是可以利用软件来进行信号的模拟也就是实现上述原理的过程,为了传送数据的可靠性,编写时必须严格按照时序图来,这一过程,具体就是用延时以及高低电平的变化来实现

在这里插入图片描述

如上图所示,为起始信号,终止信号的时序图,现在我们需要看懂,并会利用延时以及高低电平的变化来实现它们
先来看看起始信号,前面有提到当时钟线(SCL)在处高电平期间,数据线(SDA)由高电平向低电平的跳变(下降沿)表示起始信号。

在这里插入图片描述

可以看到要想模拟出起始信号,首先让数据线(SDA)上升至高电平如图中1表示,此时需要进时大于4.7us的延时,保证数据的稳定,并且让时钟线(SCL)保持在高电平,然后进行第3步,给数据线(SDA)一个下降沿让SDA=0,并延时一段时间,这样就完成了起始信号的模拟,终止信号也是如此下面展示一下例程
void StartSignal()
{
	SDA = 1; //先让数据线处在高电平,准备一次下降沿
	delay(); //延时一段时间
	SCL = 1; //让时钟线也在高电平
	delay(); //再延时一段时间
	SDA = 0; //给数据线一下降沿的跳变
	delay(); //延时一段时间
	SCL = 0; //让时钟线为低电平
	delay(); //最后延时一段时间保持稳定
}

void EndSignal()
{
	SDA = 0; //先让数据线处在低电平,准备一次上升沿
	delay(); //延时一段时间
	SCL = 1; //让时钟线处在高电平
	delay(); //延时一段时间
	SDA = 1; //给数据线一上升沿的跳变
	delay(); //最后延时一段时间保持稳定
}

AT24C系列存储器工作原理

在这里插入图片描述

在这里插入图片描述

因为51单片机使用I2C总线时用到AT24C系列芯片,现将芯片图及其各引脚的功能图放上,后编写程序时在说明
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值