【51单片机】IIC总线

什么是IIC 总线?

IIC是Inter IC Bus的缩写,是由PHLIPS提出的一种串行总线,具备多主机系统所需要的包括总线裁决和高低速器件同步功能的高性能串行总线。
IIC总线有时称为I2C总线(读I方总线)。

IIC总线的结构

IIC总线只有两根双向信号线,一根是数据性SDA,另一根是时钟线SCL。
所有设备都是连接在这两根总线上,IIC总线通过上拉电阻接正电源,当总线空闲时,两根总线均为高电平。当连接到总线上的任一器件输出低电平,总线变为低电平,及各器件的SDA和SCL都是“与”的关系,有一个为低电平,总线就为低电平。
在这里插入图片描述

IIC总线工作原理

每个接到IIC总线上的设备都有唯一的地址。当主机与其他器件之间的数据传送是由主机发送数据到其他器件时,这时主机为发送器,总线上接收数据的其他器件为接收器。

IIC设备的硬件地址可以是固定的,也可以通过编程配置,但不是通过IIC总线动态配置的,而是通过器件的其他引脚来控制。(参考下面的AT24CXX)

IIC总线的数据传送

  • 数据位的有效性规定
    IIC数据进行数据传送时,时钟信号为高电平期间,数据线的数据必须保持稳定,不能改变;当时钟信号为低电平时,允许数据线的信号改变。(数据位指传输0和1的bit位,不包括起始和终止信号)
    在这里插入图片描述

  • 起始和终止信号
    和数据位相反,当时钟信号为高电平期间,数据线变化表示起始和终止信号;数据线由高变低时是起始信号,数据线由低变高时是终止信号。
    在这里插入图片描述

  • 数据传送格式
    数据传送是按字节进行的,一次传送一个字节,数据传送时先发送最高位,发送完一个字节后,接收器需要回一个应答位。
    在这里插入图片描述
    由于某种原因从机不对主机寻址信号应答时(如从机正在进行实时性的处理工作而无法接收总线上的数据),它必须将数据线置于高电平,而由主机产生一个终止信号以结束总线的数据传送。

    如果从机对主机进行了应答,但在数据传送一段时间后无法继续接收更多的数据时,从机可以通过对无法接收的第一个数据字节的“非应答”通知主机,主机则应发出终止信号以结束数据的继续传送。

    当主机接收数据时,它收到最后一个数据字节后,必须向从机发出一个结束传送的信号。这个信号是由对从机的“非应答”来实现的。然后,从机释放SDA线,以允许主机产生终止信号。

  • 数据帧格式
    IIC总线上的数据信号是广义的,即包括地址信号,又包括数据信号;起始信号后面必须紧跟一个从机的地址,总线的设备都会匹配这个地址,如果和自己的地址匹配则接受,否则不接收,这个实现和局域网中的二层报文转发匹配mac地址有点类似。从机地址是7位的地址,后面加1位的读写方向位,1表示主机接收数据,0表示数据发送数据。

    总线在一次发送数据中,可能有以下几种情况
    第一种,主机向从机发送数据,数据传送方向不变:
    在这里插入图片描述
    注:阴影部分是主机向从机传送,无阴影部分是从机向主机传送,A为应答,A非为非应答。
    第二种,主机发送第一个字节后,立刻从从机读数据
    在这里插入图片描述
    第三种,在传送过程中,需要改变传送方向,起始地址和从机地址都需要被重新产生一次,但两次的读写方向位刚好相反。
    在这里插入图片描述

  • 总线寻址
    总线寻址有明确的规定,采用7位寻址字节+1位的方向位
    在这里插入图片描述
    D7-D1是从机地址,D0为读写标记,高电平为主机从从机读,低电平为主机往从机写。

EEPROM(AT24CXX)

EEPROM设备是一种支持IIC总线协议的掉电不丢失存储设备,包括AT24C01/02/04/08/16等多种型号,分别代表内部含有1K/2K/4K/8K/16K的存储空间,注意这里的K代表的是bit,即1K代表1Kb,也就是128个字节(1Kb÷8=128B)。
在这里插入图片描述
设备引脚如下:
SCL,SDA: IIC总线引脚
WP: 写保护引脚,WP接地时可以正常读写,WP接Vcc时,写保护,只读
Vcc:正电源
Vss:接地
A2,A1,A0:器件的可编程位;AT24CXX的设备地址为7位,高4位为固定值,低三位通过这三个引脚进行编程。

51单片机模拟IIC实现

51单片机不带IIC总线接口,需要通过软件进行模拟
在这里插入图片描述

Void I2CStart(void)
{       
	SDA = 1;
	SomeNop(  );
	SCL = 1;
	SomeNop(  );
	SDA = 0;
	SomeNop(  );
}
void I2cStop(void)
{
	SDA = 0;
	SomeNop(  );
	SCL = 1;
	SomeNop(  );
	SDA = 1;
	SomeNop(  );
}

实现中SomeNop()为延时函数,具体延时时间需要根据芯片手册来确定,上面的延时时间是大于4.7us和4us,不同芯片可能延时不同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值