51单片机入门:I2C通讯协议

I2C通讯协议

I2C简介

串口通信只能在两个设备之间进行,如果是三个设备相互通讯,那么每个设备需要两组串口,实际上是3组相互独立的串口通信。如果是4个设备相互通信就更加麻烦了,最突出的问题就是线路连接比较复杂。

 为了解决这个难点,人们设计了一种总线通讯,总线通讯有很多种协议,例如:USB、SPI、CAN、IIC。重点介绍IIC通讯。IIC(Inter-Integrated Circuit)也可写作I2C,意思是芯片与芯片之间的通讯。是一种串行通信总线,使用多主从架构(模式)。例如我们的单片机是主机,而其他设备都是从机。

好处:节约了单片机IO口的资源,降低了PCB布线成本等。


通讯模式:多主从模式

通信设备之间的地位是平等的,分为主设备从设备,其中主设备一个、从设备多个。主设备要主导整个通信过程,从设备根据I2C协议被动的响应主设备;

在I2C通信中,没有规定谁做主设备、谁做从设备,是通信双方自己协商的。一个设备在同一时间只能做主设备或者从设备。有的设备可以通过软件配置来决定在此次通信时做主设备还是从设备。


通信特征

串行:只有一根数据线(SDA),每次传输一个bit位;

同步:主从设备工作频率相同,主设备通过SCL时钟线给从设备提供时钟频率;

半双工、低速率


I2C总线通信协议

1、主设备发送一个起始信号;

2、主设备接着发送8bit数据,其中高7位是从设备的地址,最后一位表示此次主设备是要读数据还是写数据;

3、和主设备发送的地址匹配的从设备发出一个ack响应信号

4、主/从设备将数据发送到SDA总线上,每次传输都是8bit数据;

5、主/从设备从SDA线上接收数据,并发送一个ACK响应信号;

6、重复发送和接收的过程,直到主设备发送停止信号,停止本次通信;


四个状态

空闲态:当SCL和SDA同时为高电平时,为空闲态。

起始状态:当主设备在I2C总线上发出起始信号,标志着开始通信。此时必须在时钟信号为高电平期间,数据信号完成由高到低的跳变。这样起始信号就发送完了。

/**
    *功能:I2C开始通信
    *参数:无
	*返回值:无
	*/
void I2C_Start(){
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

为了让每个模块都可以衔接上,对SCL每次结束都拉低,停止通信时才拉高。

忙态:主从设备正在通信。

停止状态:当主设备在I2C总线上发出停止信号,停止本次通信。当时钟信号为高时,数据信号需要由低到高的跳变。

 

/**
  *功能:I2C停止通信
	*参数:无
	*返回值:无
	*/
void I2C_Stop(){
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

数据线高低电平控制

如果某一时刻有两个设备要发送数据,例如从设备1发送了一个1(高电平)、设备2发送了一个0(低电平),最终数据线上是高电平还是低电平呢?

如下图,在芯片IO口的内部一般会有两颗MOS管,上面的MOS管导通就输出高电平、下面的MOS管导通就输出低电平。当我们把两个IO口都挂在一根总线上,如果一个芯片输出高电平,一个芯片输出低电平,那么电流就直接从电源流入到地。红色的线实际上就短路了,必定会有元器件的烧毁。

为了解决这个问题,I2C总线对于设备的IO口做了一些处理:去掉了上面的MOS管,同时在总线上加一个上拉电阻(取值通常为4.7K)与电源连接。因此总线默认为高电平状态(空闲态)。

芯片想输出低电平就导通MOS管,输出高电平只需要关闭MOS管即可(即:OD开漏输出)。


I2C时序结构

发送字节

SCL低电平时期,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机在高电平期间读取数据位。所以SCL高电平期间,SDA不允许有数据变化。依次循环上述过程8次,即可发送一个字节。

/**
  *功能:I2C发送一个字节
	*参数:Byte 要发送的字节
	*返回值:无
	*/
void I2C_SendByte(unsigned char Byte){
	unsigned char i;
	for(i=0;i<8;i++){
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;
		I2C_SCL=0;
	}
}

此处置1后又立刻置0,是需要考虑IIC设备是否可以接受的。51单片机的机器周期约1us,也就是说IO口电平反转周期为1us,若与其通讯的从设备,以AT24C02为例,其时钟频率是1MHz,数据手册中采集电压也是ns级别,因此这里是可以直接置1又置0,但采用更高速的单片机,这里是要加延时的

接收字节

SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化。(主机在接收之前,需释放SDA)

/**
  *功能:I2C接受一个字节
	*参数:无
	*返回值:接受到的一个字节数据
	*/
unsigned char I2C_ReceiveByte(){
	unsigned char i,Byte=0x00;
	
	I2C_SDA=1;
	
	for(i=0;i<8;i++){
		I2C_SCL=1;
		if(I2C_SDA){Byte|=(0x80>>i);}//此时SDA由从机决定0或1
		I2C_SCL=0;
	}
	
	return Byte;
}

释放SDA:指主机放手对SDA线的控制权,即单片机的IO口置1表示放弃SDA的控制权,交给从机进行对SDA线进行操作。

发送应答

在接收完一个字节后,主机在下一个时钟发送一位数据,0代表应答、1代表非应答;

/**
  *功能:I2C发送应答
	*参数:AckBit 应答位,0为应答,1为非应答
	*返回值:无
	*/
void I2C_SendAck(unsigned char AckBit){
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

接收应答

在发送完一个字节后,主机在下一个时钟接受一位数据,判断从机是否应答。0代表应答,1代表非应答。(主机在接收之前需释放SDA)

/**
  *功能:I2C接受应答位
	*参数:无
	*返回值:接收到的应答位,0为应答,1为非应答
	*/
unsigned char I2C_ReceiveAck(){
	unsigned char AckBit;
	
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	
	return AckBit;
}
  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 绪 论 重点与难点: 本章重点是让学生掌握单片机单片机系统、单片机应用系统和单片机开发系统的概念;了解单片机的发展与特点;知道单片机开发需要的开发工具; 教学基本要求: 通过对基本概念和单片机的发展与特点的介绍,使学生建立起对单片机单片机应用系统的开发过程有全面的认识,激发学生学习单片机的学习信心和兴趣。 教学内容: 1.单片机概述 2.单片机的发展 3.单片机的应用 4.单片机开发与开发工具 §1-1单片机概述 微型计算机包括有微处理器(通称CPU—Central Processing Unit ),存储器(存放程序指令或数据的ROM—Read Only Memory、RAM—Random Access Memory),输入/输出口(I/O—Input/Output)及其他功能部件,如定时/计数器、中断系统等。它们通过地址总线(AB—Address Bus)、数据总线(DB—Data Bus )和控制总线(CB—Control Bus )连接起来,通过输入/输出口线与外部设备及外围芯片相连。CPU中配置有指令系统,计算机系统中配有驻机监控程序、系统操作软件及用户应用软件。 一.单片机: 是将微型计算机的主要组成部分集成在一个芯片上的微型计算机(图1-1)。具体地说就是把中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、中断系统、定时器/计数器以及I/O接口电路等集成在一块芯片上的微型计算机。换一种说法,单片机就是不包括输入输出设备、不带外部设备的微型计算机,相当于一个没有显示器,没有键盘,不带监控程序的单板机。虽然单片机只是一个芯片,但从组成和功能上看,它已具有了计算机系统的属性,因此称它为单片微型计算机SCMC(Single Chip Micro-Computer ),简称单片机。 图1-1 单片机的系统结构 单片机在应用时通常处于被控系统核心地位并融入其中,即以嵌入的方式进行使用。为了强调其“嵌入”的特点,也常常将单片机称为嵌入式微控制器EMCU(Embedded Micro-Controller Unit),在单片机的电路和结构中有许多嵌入式应用的特点。 在学习单片机时,还应注意区别通用单片机和专用单片机单片机单片机系统、单片机应用系统和单片机开发系统、单片机的程序设计语言和软件。 二.单片机单片机系统: 单片机只是一个芯片,而单片机系统则是在单片机芯片的基础上扩展其他电路或芯片构成的具有一定应用功能的计算机系统。 通常所说的单片机系统都是为实现某一控制应用需要由用户设计的,是一个围绕单片机芯片而组建的计算机应用系统。在单片机系统中,单片机处于核心地位,是构成单片机系统的硬件和软件基础。 在单片机硬件的学习上,既要学习单片机,也要学习单片机系统,即单片机芯片内部的组成和原理,以及单片机系统的组成方法。 三.单片机应用系统和单片机开发系统: 单片机应用系统是为控制应用而设计的,该系统与控制对象结合在一起使用,是单片机开发应用的成果。但由于软硬件资源所限,单片机系统本身不能实现自我开发,要进行系统开发设计,必须使用专门的单片机开发系统。 单片机开发系统是单片机系统开发调试的工具:早期,逻辑分析仪;现在,在线仿真器ICE(In Circuit Emulator),如:DICE、SICE、DP-852、KDC-51、SBC-51、EUDS-51;PC单片机开发系统。 四.单片机的程序设计语言和软件 单片机程序设计语言和软件,主要是指在开发系统中使用的语言和软件。在单片机开发系统中使用机器语言、汇编语言和高级语言,而在单片机应用系统中只使用机器语言。 机器语言是用二进制代码表示的单片机指令,用机器语言构成的程序称之为目标程序。汇编语言是用符号表示的指令,汇编语言是对机器语言的改进,是单片机最常用的程序设计语言。虽然机器语言和汇编语言都是高效的计算机语言,但它们都是面向机器的低级语言,不便记忆和使用,且与单片机硬件关系密切,这就要求程序设计人员必须精通单片机的硬件系统和指令系统。 单片机也开始尝试使用高级语言,其中编译型语言有Pl、M5l、C-5l、C、MBASIC-51等,解释型的有MBASIC和MBASIC-52等。 单片机程序设计有其复杂的一面,因为编写单片机程序主要使用汇编语言,使用起来有一定的难度,而且由于单片机应用范围广泛,面对多种多样的控制对象和系统,很少有现成的程序可供借鉴, 这与微型机在数值计算和数据处理等应用领域中有许多成熟的经典程序可供直接调用或模仿有很大的不同。 §1-2 单片机的发展 1971年,微处理器研制成功不久,就出现了单片的微型计算机,即单片机但最早的单片机是1位的。 1975年,德克萨斯仪器公司发明了世界上第一个4位单片机TM

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值