IIC总线原理及其在51单片机中的简单应用

发布者:PeacefulAura最新更新时间:2018-11-21 来源: eefocus关键字:IIC总线  51单片机 手机看文章 扫描二维码
随时随地手机看文章

1. IIC总线基本概念


1.1总线概述


IIC总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串行总线。


1.2总线结构


IIC总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间可以进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这两条总线上。


1.jpg


2. IIC总线协议


2.1数据传输中的主/从机


在多主机系统中,可能同时有几个主机企图启动总线传送数据。为了避免混乱, IIC总线要通过总线仲裁,以决定由哪一台主机控制总线。连在每一个总线上的电路和模块都有一个唯一地址,它们彼此之间只有简单的Master/Slaver关系。


主机:控制时钟线,产生启动信号、时钟信号、停止信号。控制线上的发送和接收节奏。


从机:按SCL线上的时钟接收SDA线上的数据或发送数据到SDA线上。


2.2协议概述


IIC总线仅占用系统的两个I/O口,一条作为串行数据线SDA,一条作为串行时钟线SCL,线上外加上拉电阻,在不传数据时SCL、 SDA总保持高电平。IIC总线通过上拉电阻接电源正极。当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。


2.3时序图


完整的数据传输过程时序图:


2.gif


2.4信号类型


(1)开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。


(2)结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。


3.jpg


(3)应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况判断是否继续传递信号。若未收到应答信号,由判断为受控单元出现故障。


4.jpg


(4)总线空闲:SCL和SDA都保持高电平的状态


(5)总线忙:在数据传送开始以后,SCL为高电平的时候,SDA的数据必须保持稳定,只有当SCL为低电平的时候才允许SDA上的数据改变.


5.jpg


这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。IIC总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生。


3. IIC总线数据传输格式


3.1字节传送与应答:


每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。


3.2数据帧格式


IIC总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。(注:下图中有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。A表示应答, A非 表示非应答(高电平)。S表示起始信号,P表示终止信号。)


A. 主机向从机发送数据,数据传送方向在整个传送过程中不变


B. 主机在第一个字节后,立即从从机读数据


C. 传送过程中,当需改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。


4. IIC总线多主机竞争的仲裁


总线上可能挂接有多个器件,有时会发生两个或多个主器件同时想占用总线的情况,这种情况叫做总线竞争。IIC总线具有多主控能力,可以对发生在SDA线上的总线竞争进行仲裁,其仲裁原则是这样的:当多个主器件同时想占用总线时,如果某个主器件发送高电平,而另一个主器件发送低电平,则发送电平与此时SDA总线电平不符的那个器件将自动关闭其输出级。总线竞争的仲裁是在两个层次上进行的。首先是地址位的比较,如果主器件寻址同一个从器件,则进入数据位的比较,从而确保了竞争仲裁的可靠性。由于是利用IIC总线上的信息进行仲裁,因此不会造成信息的丢失。


为何识别到“0”将丢失仲裁呢?因为对于OD门,只能驱动到低电平,释放总线只能通过不驱动总线释放,停止驱动即产生“1”,但是发现总线还是“0”,这说明还有主机在跟自己竞争总线使用权,自己线驱动到“1”,确检测到“0”,那代表自己已经失去了仲裁。


• 主机只能在总线空闲时启动传送。两个或多个主机可能在起始条件的最小持续时间tHD;STA 内产生一个起始条件,结果在总线上产生一个规定的起始条件。


• 当SCL 线是高电平时,仲裁在SDA 线发生;这样,在其他主机发送低电平时,发送高电平的主机将断开它的数据输出级,因为总线上的电平与它自己的电平不相同。然后,进一步获得其的判定条件:


• 仲裁可以持续多位。首先是比较地址位。如果每个主机都试图寻址同一的器件,仲裁会继续比较数据位(假设主机是发送器),或者比较响应位(假设主机是接收器)。


• IIC总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息。丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。


• 在串行传输过程中时,一旦有重复的起始条件或停止条件发送到IIC 总线的时侯,仲裁过程仍在进行。如果可能产生这样的情况,有关的主机必须在帧格式相同位置发送这个重复起始条件或停止条件。


• 此外,如果主机也结合了从机功能,而且在寻址阶段丢失仲裁,它很可能就是赢得仲裁的主机在寻址的器件。那么,丢失仲裁的主机必须立即切换到它的从机模式。


• IIC总线的控制只由地址或主机码以及竞争主机发送的数据决定,没有中央主机,总线也没有任何定制的优先权。


5.时钟信号的同步


在 IIC总线上传送信息时的时钟同步信号是由挂接在SCL线上的所有器件的逻辑“与”完成的。SCL线上由高电平到低电平的跳变将会影响到这些器件,一旦某个器件的时钟信号下跳为低电平,将使SCL线一直保持低电平,使SCL线上的所有器件开始低电平期。此时,低电平周期短的器件的时钟由低至高的跳变并不能影响SCL线的状态,于是这些器件将进入高电平等待的状态。当所有器件的时钟信号都上跳为高电平时,低电平期结束,SCL线被释放返回高电平,即所有的器件都同时开始它们的高电平期。其后,第一个结束高电平期的器件又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时间由时钟低电平期最长的器件确定,而时钟高电平时间由时钟高电平期最短的器件确定。


6.总线功能特点及应用


6.1 IIC总线功能特点


IIC总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。


IIC总线的另一个优点是,它支持多主控,其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。


6.2总线应用


目前有很多半导体集成电路上都集成了IIC接口。带有IIC接口的单片机有:CYGNAL的 C8051F0XX系列,三星的S3C24XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I²C接口。


7.利用51单片机模拟IIC总线协议


7.1所需器件


AT89C51单片机、24C02存储器、6kΩ电阻两个、导线若干


7.2接线方式


利用AT89C51的IO口模拟实现IIC总线协议进行与24C02存储器的通信,其电路图如下:


6.jpg


7.3程序代码


下面是使用AT89C51的IO口模拟实现IIC总线协议进行通信的程序:


#include


#include


#define uc unsigned char


sbit SDA=P1^0;


sbit SCL=P1^1;


bit NackFlag;


void delay()


{


_nop_();


_nop_();


_nop_();


_nop_();


}


void DelayX1ms(uc count)


{


uc i,j;


for(i=0;i


for(j=0;j<120;j++)


;


}


void start() //启动


{


SDA=1;


delay();


SCL=1;


delay();


SDA=0;


delay();


SCL=0;


}


void stop() //停止


{


SDA=0;


delay();


SCL=1;


delay();


SDA=1;


delay();


SCL=0;


}


void ChkAck() //应答


{


SDA=1;


SCL=1;


NackFlag=0;


if(SDA==1)


NackFlag=1;


SCL=0;


}


void send8bit(uc num)


{


uc i=8;


uc temp;


temp=num;


for(i=8;i>0;i--)


{


SDA=temp&0x80;


SCL=1;


delay();


SCL=0;


temp=temp<<1;


}


}


void sendbyte(uc num,uc addr)


{


start();


send8bit(0xa0);


ChkAck();


send8bit(num);


ChkAck();


stop();


DelayX1ms(10);


}


void main(void)


{


uc i;


for (i=0;i<0xff;i++)


{


sendbyte(i,i);


DelayX1ms(5);


}


while(1);


}


关键字:IIC总线  51单片机 引用地址:IIC总线原理及其在51单片机中的简单应用

上一篇:单片机的两种型号区别 AT89C51和AT89C52的区别
下一篇:在Linux下搭建51单片机的开发烧写环境

推荐阅读最新更新时间:2024-03-16 16:17

51单片机超声波模块数码管程序编写
超声波原理简单测距准确,应用广泛下面贴一个自己写的数码管程序,显示部分需要改,写的是我使用的是慧净开发板,共阴数码管。 //超声波模块程序 //Trig = P2^0 //Echo = P3^2 #include #define uchar unsigned char #define uint unsigned int unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; //0-9的码表 uinttime = 0; uintTImeH = 0; uintTImeL = 0;
[单片机]
<font color='red'>51单片机</font>超声波模块数码管程序编写
51单片机教程第4讲_寄存器
任何单片机,内部都有寄存器,用来存储数据和控制器件。51单片机的寄存器是8位的,用二进制表示就是00000000到11111111之间的数据。我们在学习51单片机,本质上就是在学习它的寄存器。单片机的寄存器被放到内部特定的地址空间,并被命名,这个命名文件就叫做单片机的头文件,例如reg51.h文件内容如下所示: #ifndef __REG51_H__ #define __REG51_H__ /* BYTE Register */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P2 = 0xA0; sfr P3 = 0xB0; sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0x
[单片机]
8051单片机(STC89C52)以定时器中断模式实现倒计时器
之前用轮询方式实现了定时器精准定时, 这里用前后台系统架构实现倒计时器. 每10ms都会触发一次中断处理程序T0_INT(), 根据tcount的值, 决定显示个位数字还是十位数字: 当tcount = 100时, 将tcount置回初始值0, 并将sec的值减1. 当sec的值减到-1时, 将sec重新置回15. #include STC89C5xRC.H unsigned char code DIG_CODE = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//对应数码管显示0~9 int tcount = 0;//记录经过的10m
[单片机]
80<font color='red'>51单片机</font>(STC89C52)以定时器中断模式实现倒计时器
51单片机DS1302时钟芯片简单程序
#include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int data_7seg ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; uchar hour,min,sec; sbit shi=P1^0; sbit fen=P1^1; sbit miao=P1^2; sbit rst=P1^4; sbit sck=P1^5; sbit io=P1^6; sbit fm=P1^7; /*函数声明:*/ void write_ds1302_byte(ucha
[单片机]
【单片机学习】51单片机【定时/计数器】,详细介绍
一、先知先会 1、CPU时序的有关知识 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:1个机器周期=6个状态周期=12个振荡周期。 指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。 1.1、周期换算 2、在学习定时器之前需要明白的 (1)51单片机有两组定时器/计数器; 因为既可以定时,也可以计数,所以称为定时/计数器。 (2)定时/计数器和单片机的CPU是相互独立的。 定时/计数器工作过程是自动完成的,不需要CPU的参与。 (3)51单片机中的定时/计数器是根据机器内部的时钟或者
[单片机]
【单片机学习】<font color='red'>51单片机</font>【定时/计数器】,详细介绍
51单片机学习:独立按键实验
实验名称:独立按键实验 接线说明: 实验现象:下载程序后,按下“独立按键”模块中K1键,控制D1指示灯亮灭 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义独立按键控制脚 sbit KEY1=P3^1; sbit KEY2=P3^0; sbit KEY3=P3^2; sbit KEY4=P3^3; //定义LED
[单片机]
51单片机做的拉幕式数码显示课程设计
简介:用AT89S51单片机的P0.0/AD0-P0.7/AD7端口接数码管的a-h端,8位数码管的S1-S8通过74LS138译码器的Y0-Y7来控制选通每个数码管的位选端。AT89S51单片机的P1.0-P1.2控制74LS138的A,B,C端子。在8位数码管上从右向左循环显示“12345678”。能够比较平滑地看到拉幕的效果。 1. 电路原理图 2. 系统板上硬件连线 (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7用8芯排线连接到“动态数码显示”区域中的a-h端口上; (2. 把“三八译码模块”区域中的Y0-Y7用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; (3. 把“单
[单片机]
用<font color='red'>51单片机</font>做的拉幕式数码显示课程设计
基于51单片机的锅炉水位温度压力检测系统仿真设计
仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0056 1.主要功能: 基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用) 1.系统实时通过LCD1602显示水位检测值,锅炉炉膛温度值,锅炉内部压力值。 2、可对锅炉的水位上下限、炉膛温度上下限、压力上下限进行设置,第一行显示上限值,第二行显示下限值。 3、如果水位、温度、压力过限则蜂鸣器报警,通过LED指示报警类型。 4、默认水位下限值10cm,上限值40cm,压力下限值30kPa,压力上限值50kPa,温度下限值5℃,温度上限值105℃。 5、温
[单片机]
基于<font color='red'>51单片机</font>的锅炉水位温度压力检测系统仿真设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved