I2C总线详细讲述ppt
I2C总线入门(很详细,很经典)
I2C 【2 】总线入门1)比来进修51单片机,学到A/D,D/A转换的时刻发明我板子上的转换芯片不是书上所讲的ADC0804和DAC0832而是PCF8591T,看了一下它的数据手册,发明它并不是书上所说的并行传输数据,是应用 I2C 总线传输的.搞了两天才搞懂,写出来给大家分享一下,不足之处请务必不吝指出.以上是I2C总线的简略介绍.就比如说AT24C02存储芯片,和PCF8591数模模数转换芯片都支撑I2C端口.(如下图)2)接下来看若何应用I2C总线进行通讯以上是I2C总线通讯的格局.由上图可以看出进行通讯须要以下几个步骤a.初始化I2C总线就是把SDA和SCL都变成高电平.void init()//初始化{SDA=1;delay();SCL=1;delay();}delay()为延时函数void delay()//延时4-5个微秒{;;}b.发送肇端旌旗灯号就是保持SCL为高电平,而SDA从高电平降为低电平(这是I2C总线的划定,别问我为什么)void start()//肇端旌旗灯号{SDA=1;delay();SCL=1;delay();SDA=0;delay();}c.发送地址字(芯片的硬件地址)(8591的数据手册)前四位对统一种芯片来说是固定的,不同的芯片之间不同.就像pcf8591是1001而at24c02是1010接下来三位A0,A1,A2是可编程的三个地址位,这里说说的编程并不是经由过程软件编程,而是把A0,A1,A2三个引脚接不同的电压来肯定命值.接VCC表示1,接GND表示0.为什么要有这三个呢?因为有可能你在I2C总线上“并联”了不止一个雷同的元件(比如说接了三个8591),那你若何来分辩你要操作的是哪一个芯片呢,就是经由过程设置A0,A1,A2的数值,来差别.可编程的地址一个有三位,也就是说最多可以接8个雷同的芯片在统一个I2C总线上.最后一位是读/写位,1为读,0为写.@若何写数据写数据只须要按照时序图1.先将SCL置0(只有它为0的时刻SDA才许可变化)2.转变SDA是数值(就是你当前要穿的一位是0照样1)3.把SCL置1(此时芯片就会读取总线上的数据)下面是代码#define uchar unsigned char#define uint unsigned intvoid write_byte(uchar date)//写一字节数据{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;//左移一位移出的一位在CY中SCL=0;//只有在scl=0时sda能变化值delay();SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay();}发送地址的时刻只需把地址传给该函数即可.d.应答(ACK)每接收或发送一字节数据后都须要发送一位应答,来表是否收到了前面一个字节的数据.void respons()//应答相当于一个智能的延时函数{uchar i;SCL=1;delay();while((SDA==1)&&(i<250))//充公到应答,我等!~~i++;//等了250次充公到就不管他了,就当他收到了-_-//其实充公到的话可以停滞程序的SCL=0;delay();}e.发送/接收数据(取决于前面地址字的最后一位读/写位)发送数据和上面的发送地址挪用统一个函数,只要穿给他数据即可.吸收数据其实和发送数据差不多,只不过要把吸收到的数据一位一位拼装成一字节数据,看代码~uchar read_byte(){uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i<8;i++){SCL=1;delay();k=(k<<1)|SDA;//先左移一位,再在最低位接收当前位SCL=0;delay();}return k;}f.应答g.·······如斯轮回,直到数据一个字一个字的发完h.发送终止旌旗灯号就是SCL在高电平的时刻SDA由低电平变成高电平void stop()//停滞旌旗灯号{SDA=0;delay();SCL=1;delay();SDA=1;delay();}以上就是全部数据传输的进程了为了更好的控制I2C总线我在此放两个例子,一个是书上(郭天祥的,你们懂的)EPROM存储准不时光的例子,还有就是用PCF8591进行D/A转换的例子.1.EPROM存储准不时光//JP10(P0)接JP12//我发明数据手册(电路图pdf)上错了 SCL连的是P2^1 而SDA连的P2^0//程序功效:在数码管上显示数字,每隔1s增长1//但是每次复位或者失落电程序都邑把当前数值存储到AT24C02中,并鄙人次启动时读取#include <reg51.h>#define uchar unsigned char#define uint unsigned intbit write=0;//写24c02的标志sbit SCL=P2^1; //串行时钟输入端sbit SDA=P2^0; //串行数据输入端sbit LS138A=P2^2;//138译码器的3位控制数码管的sbit LS138B=P2^3;sbit LS138C=P2^4;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数显管字模uchar second,tempt;//second用来计秒数 ,tempt用光降时存放0.05s的次数满20即1s写入void delay()//延时4-5个微秒{;;}void delay_1ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void start()//肇端旌旗灯号{SDA=1;delay();SCL=1;delay();SDA=0;delay();}void stop()//停滞旌旗灯号{SDA=0;delay();SCL=1;delay();SDA=1;delay();}void respons()//应答相当于一个智能的延时函数{uchar i;SCL=1;delay();while((SDA==1)&&(i<250))//充公到应答,我等!~~i++;//等了250次充公到就不管他了,就当他收到了-_- //其实充公到的话可以停滞程序的SCL=0;delay();}void init()//初始化{SDA=1;delay();SCL=1;}void write_byte(uchar date)//写一字节数据{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;//左移一位移出的一位在CY中SCL=0;//只有在scl=0时sda能变化值delay();SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay();}uchar read_byte(){uchar i,k;SCL=0;SDA=1;delay();for(i=0;i<8;i++){SCL=1;delay();k=(k<<1)|SDA;//先左移一位,再在最低位接收当前位SCL=0;delay();}return k;}void write_add(uchar address,uchar date){start();write_byte(0xa0);//10100000 前四位固定接下来三位全体被接地了所以都是0 最后一位是写所认为低电平respons();write_byte(address);respons();write_byte(date);respons();stop();}uchar read_add(uchar address) {uchar date;start();write_byte(0xa0);respons();write_byte(address);respons();start();write_byte(0xa1);respons();date=read_byte();stop();return date;}void display(uchar ge,uchar shi) {P0=0xff;LS138A=0;//第一位LS138B=0;LS138C=0;P0=table[ge];delay_1ms(5);P0=0xff;LS138A=1;//第二位LS138B=0;LS138C=0;P0=table[shi];delay_1ms(5);P0=0xff;}void main(){init();second=read_add(2);//读出保存的数据if(second>=100)second=0;TMOD=0x01;//准时器工作方法1ET0=1;EA=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TR0=1;//开端计时while(1){display(second/10,second%10);if(write==1){write=0;write_add(2,second);}}}void t0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tempt++;if(tempt==20){tempt=0;second++;write=1;if(second==100)second=0;}}这是电路图为了更好的控制I2C总线我在此放两个例子,一个是书上(郭天祥的,你们懂的)EPROM存储准不时光的例子,还有就是用PCF8591进行D/A转换的例子.1.EPROM存储准不时光//I2C总线很壮大//程序功效:经由过程DA转换把输出电压逐渐增大,使加在上面的发光二级管慢慢变亮// 到最亮后再变暗,如斯轮回#include <reg51.h>#define uchar unsigned char#define uint unsigned int#define PCF8591 0x90 //PCF8591 地址sbit SCL=P2^1; //串行时钟输入端sbit SDA=P2^0; //串行数据输入端void delay()//延时4-5个微秒{;;}void delay_1ms(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void start()//开端旌旗灯号{SDA=1;delay();SCL=1;delay();SDA=0;delay();}void stop()//停滞旌旗灯号{SDA=0;delay();SCL=1;delay();SDA=1;delay();}void respons()//应答相当于一个智能的延时函数{uchar i;SCL=1;delay();while((SDA==1)&&(i<250))i++;SCL=0;delay();}void init()//初始化{SDA=1;delay();SCL=1;delay();}void write_byte(uchar date)//写一字节数据{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1;//左移一位移出的一位在CY中SCL=0;//只有在scl=0时sda能变化值delay();SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay();}void write_add(uchar control,uchar date){start();write_byte(PCF8591);//10010000 前四位固定接下来三位全体被接地了所以都是0 最后一位是写所认为低电平respons();write_byte(control);respons();write_byte(date);respons();stop();}void main(){uchar a;init();while(1){write_add(0x40,a);delay_1ms(5);a++;if(a>250)a=0;}}第21页,-共21页。
I2C总线中文讲解,详尽通俗
一. I2C总线简介I2C管理总线:(Intel-Integrated Circuit bus)I2C总线是一种由飞利浦Philip公司开发的串行总线,产生于80年代,最初为音频和视频设备开发,现主要在服务器管理中使用。
是两条串行的总线,它由一根数据线(SDA)和一根时钟线(SDL)组成。
◆I2C总线的数据传输过程基本过程为:●主机发出开始信号。
●主机接着送出1字节的从机地址信息,其中最低位为读写控制码(1为读、0为写),高7位为从机器件地址代码。
●从机发出认可信号。
●主机开始发送信息,每发完一字节后,从机发出认可信号给主机。
●主机发出停止信号。
I2C数据传输图◆I2C总线上各信号的具体说明:●开始信号:在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。
●停止信号:在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。
●应答信号:既认可信号,主机写从机时每写完一字节,如果正确从机将在下一个时钟周期将数据线(SDA)拉低,以告诉主机操作有效。
在主机读从机时正确读完一字节后,主机在下一个时钟周期同样也要将数据线(S DA)拉低,发出认可信号,告诉从机所发数据已经收妥。
(注:读从机时主机在最后1字节数据接收完以后不发应答,直接发停止信号)。
注意:在I2C通信过程中,所有的数据改变都必须在时钟线SCL为低电平时改变,在时钟线SCL为高电平时必须保持数据SDA信号的稳定,任何在时钟线为高电平时数据线上的电平改变都被认为是起始或停止信号。
◆I2C总线数据格式:I2C数据格式图I2C支持两种数据格式:_ 7-bit/10-bit 寻址数据格式_ 7-bit/10-bit 寻址和重复开始信号的数据格式✧S ―I2C 开始标识✧Slava address ―从设备地址。
有两种从地址类型:1)固定的从地址,I2C总线只能接一个同类型的固定的从地址设备。
2)半固定的从地址,前半部分地址是固定的,后半部分地址是可编程的,I2C总线只能接多个同类型的半固定的从地址设备。
I2C通讯协议介绍ppt课件
结束整个通讯并且释放总线;
最新课件
15
I2C数据传送
•SCL线呈现高电平期间,SDA线上的电平必 须保持稳定,低电平表示0(此时的线电压 为地电压),高电平表示1(此时的电压由元 器件的VDD决定)。只有在SCL线为低电平期 间,SDA上的电平允许变化。
• 在多主机系统中,可能同时有几个主机企 图启动总线传输数据。为了避免混乱,I2C 总线要通过总线仲裁决定由哪一台主机控 制总线——支持多主控模块,但同一时刻 只允许有一个主控
最新课件
13
•启动信号START后紧接着发送一个地址字节,其中 7位为被控器件的地址码,一位为读/写控制位 R/W,R. /W位为0表示由主控向被控器件写数据, R/W为1表示由主控向被控器件读数据;
字节; • 5. 主控收到数据后发送ACK表示继续传送数据,发送
NACK表示传送数据结束; • 6. 主控发送完全部数据后,发送一个停止位STOP,结
束整个通讯并且释放总线
最新课件
17
I2C数据的中断
• 接收器收到一个完整的数据字节后,有可 能需要完成一些其它工作,如处理内部中 断服务等,可能无法接受下一个字节,这 时候接收器可以将SCL线拉成低电平,从而 使主机处于等待状态,直到接收器准备好 接受下一个字节时,再释放SCL线使为高电 平,使数据传输继续。
I2C串行總線的原理
1、总线的概述 2、总线结构 3、总线传输协议 4、常见波形分析
最新课件
1
I2C串行總線概述
• I2C(Inter-Integrated Circuit)總線是由 PHILIPS公司開發的兩線式串行總線,用于 连接微控制器及其外圍設備。是微電子通 信控制領域廣泛采用的一種總線標準。
集成电路互连总线I2Cppt课件
➢ I2C总线的典型电路 下图给出一个由MCU作为主机,通过I2C总线带3个从机的单主机I2C总线系统。
这是最常用、最典型的I2C总线连接方式
I2C总线的典型连接
6
1.3 I2C总线数据通信协议概要 ➢ I2C总线上数据的有效性
I2C总线以串行方式传输数据,从数据字节的最高位开始传送,每个数位在SCL上都 有一个时钟脉冲相对应。在一个时钟周期内,当时钟线高电平时,数据线上必须保持稳定 的逻辑电平状态,高电平为数据1,低电平为数据0。当时钟信号为低电平时,才允许数据 线上的电平状态变化
主机从从机读数据
14
* AW60的I2C模块寄存器 AW60的I2C模块相关寄存器
寄存器名称 地址寄存器 分频寄存器 控制寄存器 状态寄存器 数据I/O寄存器
缩写 I2C1A I2C1F I2C1C I2C1S I2C1D
地址 0x00000058 0x00000059 0x0000005A 0x0000005B 0x0000005C
12
1.4 主机向从机读/写1个字节数据的过程 ➢ 主机向从机写1个字节数据的过程
主机要向从机写1个字节数据时,主机首先产生START信号,然后紧跟着发送一个从机地址, 这个地址共有7位,紧接着的第8位是数据方向位(R/W),0表示主机发送数据(写),1表 示主机接收数据(读),这时候主机等待从机的应答信号(ACK),当主机收到应答信号时, 发送要访问的地址,继续等待从机的响应信号,当主机收到响应信号时,发送1个字节的数 据,继续等待从机的响应信号,当主机收到响应信号时,产生停止信号,结束传送过程。
1992年PHILIPS首次发布I2C总线规范Version1.0 1998年PHILIPS发布I2C总线规范Version2.0,至此标准模式和快速模式的I2C总线已经获
第11章 I2C总线图文图文课件
编号;
位 为1,表示要对器
01
3.数据传输 在数据传送过程中,SCL为高电平时,SDA必须是一稳定的高或低电平,此时
数据有效。SDA线的改变只能发生在SCL为低电平。 4.传输应答
所有数据都是按字节发送的,每次发送的字节数不限,但每发完每一个字节 要释放SDA线(呈高电平),然后由接收器下拉SDA线(呈低电平)产生应答位,表 示传输成功,此时主控器必须产生一个与此位相应的额外时钟脉冲。I2C 总线 数据传送时,每成功地传送一个字节数据后接收器都必须产生一个应答信号, 应答的器件在第9 个时钟周期时将SDA 线拉低,表示其已收到一个8 位数, 24C04在接收到起始信号和从器件地址之后响应一个应答信号,如果器件已选择 了写操作,则在每接收一个8 位字节之后响应一个应答信号。当24C04 工作于
主机发送地址时,总线上的每一个从机都将这7位地址码与自已的器件地址 进行比较,如果相同则认为自已正被主机寻址,根据读写位将自已确定为发送 器或接收器。
从机的地址由一个固定部分和一个可编程部分组成。固定部分为器件的编号
02 例如24C02的地址格式如下:
其中高四位1010为器件标识类型。 A2~A0:引脚地址,对应于该芯片引脚A2~A0的取值,当A2-A0引脚均接低电 平时,该器件的地址为A0H或A1H,如果为A0H表示写数据到该器件,A1H表示从 该器件读数据。 说明:从机地址只表明选择挂在总线的哪一个器件及传送方向,而器件内 部的地址是由编程者传送的第一数据中指定的,即第一个数据为器件内的子地 址。
功能:该函数与rcvbyte() 不同,它包含了从启动总线、 发送从器件地址、读数据到结 束总线的全过程。
如其果中返:回1表示操作成功, 否则s操la作:有从错器。件地址
IIC通讯协议_讲解PPT
LOGO 1.2.2通讯的起始和停止信号
当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表 示通讯的起始。当 SCL 是高电平时 SDA线由低电平向高电平切换, 表示通讯的停止。起始和停止信号一般由主机产生。
LOGO 1.2.3数据的有效性
使用 SDA 信号线来传输数据。 使用 SCL 信号线进行数据同步。
LOGO 2.3通讯过程
使用 I2C 外设通讯时,在通讯的 不同阶段它会对“状态寄存器 (SR1 及 SR2)”的不同数据位写 入参数,我们通过读取这些寄存器 标志来了解通讯状态。
主发送器
作为 I2C 通讯的主机端时, 向外发送数据
主接收器
作为 I2C 通讯的主机端时, 从外部接收数据
LOGO 2.3.1主发送器
向该寄存器位写入此值 则可以控制 IIC 的通讯速 率为400KHz。
LOGO 2.2.3数据控制逻辑
I2C 的 SDA 信号主要连接到数据移位寄存器上,数据移位寄存器的数据 来源及目标是数据寄存器(DR)、地址寄存器(OAR)、 PEC 寄存器以及 SDA 数据线。
1
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源, 把数据一位一位地通过 SDA 信号线发送出去;
SDA数据线在 SCL 的每个时钟周期传输一位数据。传输时, SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表 示数据“0”。当 SCL为低电平时, SDA 的数据无效,一般在这个时候 SDA 进行电 平切换,为下一次表示数据做好准备。
LOGO 1.2.4地址及数据方向
LOGO
1.2.5响应
传输时主机产生时钟,在
第 9 个时钟时,数据发送 端会释放 SDA 的控制权, 由数据接收端控制 SDA,若 SDA 为高电平,表示非应答 信号(NACK),低电平表示应 答信号(ACK)。
02-I2C总线及其应用课件
bit f; / / / uchar i; IIC_start();
IIC_write(OxaO)^ f=IIC_ack () ;
if ( !fT
IIC_write(a f=IIC_a.ck
(); if(!f?
for(i=0;i<len;i++
IIC_write f=IIC_ack()
for(i=0; i<8; i++)
SDA=(bit)(temp & 0x80); SCL=1; Delay (); SCL=0; temp«=l; ) SDA = 1;
bit IIC ack () 3{
bit flag; SCL = 1; Delay(}; flag=SDA; SCL=0; return(flag);
]
IIC_start (); IIC_write (Oxa.1] f=IIC_ack(); if ( !fT
]
S器件地址+0 A 读也首地址 ed cha
IIC_stop(); return(temp); }
读到的数据。
Data 1
I2C总线及其应用技术 5.程序设计
#include <reg51.h> #include <stdio.h> #include <intrins.h> ♦include <absacc.h> ♦define uint unsigned int #define uchar unsigned char #define portA 0x0 #define portB 0x1 #define portC 0x2 #define Cont 0x3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、总线初始化
Void init( ) {
SCL=1; SDA=1; delay( );//将总线拉高以释放总线 }
2 、起始信号
Void T2CStart(void)
{
SDA=1;
SCL = 1;
delay( );
SDA = 0;
delay();//scl高电平器件,sda一
个
下降沿启动信号
}
二、IIC总线特点
在硬件结构上,它采用数据(SDA)和时钟 (SCL)两根线来完成数据的传输及外围器件的扩展, 任何一个具有IIC总线接口的外围器件,不论其功 能差别有多大,都具有相同的电气接口,因此都 可以挂接在总线上,使其连接方式变得十分简单。
对各器件的寻址是软寻址方式,因此节点上 没有必须的片选线,器件地址给定完全取决于器 件类型与单元结构,这也简化了IIC系统的硬件连 接。
储区的首地址,收到存储器器件的应答后,单片机就逐个发 送各数据字节,但每发送一个字节后都要等待应答。
AT24C系列器件片内地址在接收到每一个数据字节地址后 自动加1,在的芯片“一次装载字节数”(不同芯片字节数不 同)限度内,只需输入首地址。装载字节数超过芯片的“一 次装载字节数”时,数据地址将“上卷”,前面的数据将被 覆盖。
单片机进行写操作时,首先发送该器件的7位地址 码和写方向位“0”(共8位,即一个字节),发送完 后释放SDA线并在SCL线上产生第9个时钟信号。被 选中的存储器器件在确认是自己的地址后,在SDA 线上产生一个应答信号作为相应,单片机收到应答 后就可以传送数据了。
传送数据时,单片机首先发送一个字节的被写入器件的存
3、数据传送格式
I2C总线发送器送到SDA线上的每个字节必须为8位 长,传送时高位在前,低位在后。与之对应,主器件在 SCL线上产生8个脉冲;第9个脉冲低电平期间,发送器释 放SDA线,接收器把SDA线拉低,以给出一个接收确认 位;每传1个字节需要9个时钟脉冲
4、主机向从机读写数据的过程
I2C总线上传送的数据信号是广义的,既包括地址 信号,又包括真正的数据信号。
①主机(主控器):在IIC总线中,提供时钟信 号,对总线时序进行控制的器件。主机负责总线 上各个设备信息的传输控制,检测并协调数据的 发送和接收。主机对整个数据传输具有绝对的控 制权,其它设备只对主机发送的控制信息作出响 应。如果在IIC系统中只有一个MCU,那么由 MCU担任主机。
②从机(被控器):在IIC系统中,除主机外的 其他设备均为从机。主机通过从机地址访问从机, 对应的从机作出响应,与主机通信。从机之间无 法通信,任何数据传输都必须通过主机进行。
从机的地址由固定部分和可编程部分组成。在一 个系统中可能希望接入多个相同的从机,从机地址中 可编程部分决定了可接入总线该类器件的最大数目。 如一个从机的7位寻址位有4位是固定位,3位是可编程 位,这时仅能寻址8个同样的器件,即可以有8个同样的 器件接入到该I2C总线系统中。
五、8051单片机模拟IIC总线通信协议
一、IIC概述
IIC(Inter-Integrated Circuit)总线,许多文献写作 I2C, 主要用于同一电路板内各集成电路模块(IC)之 间的连接。IIC采用双向2线制串行数据传输方式, 简化IC之间的通信连接。IIC协议是PHILIPS公司于 二十世纪八十年代初提出,其后,PHILIPS和其他 厂商提供了种类丰富的IIC兼容芯片。目前,IIC总 线标准已经成为世界性的工业标准。各大半导体公 司推出了大量的带有IIC接口的芯片,如RAM、 EEPROM、Flash ROM、A/D、D/A转换、 LED/LCD驱动、I/O接口、实时时钟等。
I2C串行总线通信原理
采用串行总线技术可以使系统的硬件设计大大
简化、系统的体积减小、可靠性提高。同时,系统 的更改和扩充极为容易。
常用的串行扩展总线有: I2C (Inter IC BUS) 总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)总线等。本章仅讨论I2C串行 总线。
起始和终止信号都是由主机发出的,在 起始信号产生后,总线就处于被占用的状态, 其它器件不能再产生开始信号。 在终止信号 产生后,总线就处于空闲状态。
连接到I2C总线上的器件,若具有I2C总 线的硬件接口,则很容易检测到起始和终止 信号。
应答信号:
应答信号(A):接收数据的IC在接收到8位数据后,向发送 数据的IC发出的低电平脉冲应答。每一个数据字节后面都要跟 一位应答信号,表示已收到数据。应答信号在第9个时钟周期 出现(scl=1),这时发送器必须在这一时钟位上释放数据线, 由接收设备拉低SDA电平来产生应答信号。所以,一个完整的 字节
应答信号 应答信号
非应答信号
star 从 0 A 被 A star 从 1 A 数
ST
t机 地
访
t机
问
地
据 A OP
址
子
址
地
址
W
R
主机读入 的一个字
节数据
主机要从从机读1个字节数据时,主机首先产 生START信号,然后紧跟着发送一个从机地址, 注意此时该地址的第8位为0,表明是向从机写命 令,这时候主机等待从机的应答信号(A),当主机
for(i=0;i<8;i++)
{
scl=1;
delay();
rec=(rec<<1)|sda;//read in the sda
scl=0;
delay();
}
return(rec);
}
六、串行E2PROM AT24C02与单片机的通信
六、串行E2PROM AT24C02与单片机的通信
寻址字节的位定义
D7~D1位组成从机的地址。D0位是数据传送方向位,为“0” 时表示主机向从机写数据,为“1”时表示主机由从机读数据。
主控器发送开始信号后,立即发送寻址字节,这 时,总线上的所有器件都将寻址字节中的7位地址与自 己器件地址比较。如果两者相同,则该器件认为被主 控器寻址,并发送应答信号,被控器根据读,写位确 定自身是作为发送器还是接收器。
2、起始、终止信号和应答信号
起始信号(START):如下图所示,当SCL为高 电平时,SDA由高电平向低电平跳变,主机就向 从机产生开始信号。当总线空闲的时候,主机通 过发送开始(START)信号建立通信。
停止信号(STOP):如下图所示,当SCL 为高电平时,SDA由低电平向高电平跳变,
产生停止信号。主机通过发送停止信号, 结束数据通信。
上拉电阻一般为10k
(一)、I2C总线的数据传送
1、总线上数据的有效性规定 IIC总线是以串行方式传输数据, I2C总线进行数据传
送时,从数据字节的最高位开始传送,每一个数据位在SCL 上都有一个时钟脉冲相对应。时钟信号为高电平期间,数 据线上的数据必须保持稳定,只有在时钟线上的信号为低 电平期间,数据线上的高电平或低电平状态才允许变化。
收到应答信号时,发送要访问的地址,继续等待
从机的应答信号,当主机收到应答信号后,主机 要改变通信模式(主机将由发送变为接收,从机将 由接收变为发送)所以主机发送重新开始信号,然
后紧跟着发送一个从机地址,注意此时该地址的 第8位为1,表明将主机设置成接收模式开始读取
数据,这时候主机等待从机的应答信号,当主机 收到应答信号时,就可以接收1个字节的数据,当
非应答信号:如果接收设备保持SDA的高电平则产生非应 答信号。
如果从机作为接收方 向主机发送非应答信号,这样,主 机方就认为此次数据传输失败;
如果是主机作为接收方,在从机发送器发送完一个字节数 据后,发送了非应答信号,从机就认为数据传输结束,并释放 SDA线。不论是以上哪种情况都会终止数据传输。
应答信号由接收器产生,总线上带有IIC总线接口的器件 很容易检测到这些信号。
一、典型信号模拟
为了保证数据传送的可靠性,标准的I2C总线的数 据传送有严格的时序要求。I2C总线的起始信号、终 止信号、应答发送“0”及非应答发送“1”的模拟时
序:
单片机在模拟IIC总线通信时,需要写出如下几 个关键部分的程序:总线初始化、启动信号、应 答信号、停止信号、写一个字节、读一个字节, 下面结合前面的时序图及文字描述写出这些相应 的子函数
另外IIC总线能在总线竞争过程中进行总线 控制权的仲裁和时钟同步,并且不会造成数据丢 失,因此由IIC总线连接的多机系统可以是一个多 主机系统,支持多主控。
串行的8位双向数据传输位速率在标准模式下 可达100kbit/s,快速模式下可达400kbit/s,高速 模式下可达3.4Mbit/s。
三、IIC总线的相关术语
3、终止信号 void Stop(void) {
SDA = 0; SCL = 1; delay(); SDA = 1; delay(); }
4、应答信号
Void ack( ) {
uchar i; scl=1; while((sda==1)&&(i<200))i++; scl=0; delay( ); }
③地址:每一个IIC器件都有自己的地 址,以供自身在从机模式下使用。在标准 的IIC中定义从机地址是7位(扩展IIC允许10 位地址)。
④发送器:发送数据到总线的器件。
⑤接收器:从总线接收数据的器件。
⑥SDA(Serial DAta):串行数据线。 ⑦SCL(Serial CLock):串行时钟线。
接收完成后,主机发送非应答信号,表示不再接 收数据,主机进而产生停止信号,结束传送过程。
5、从机的寻址约定
为了消除IIC总线系统中主控器与被控器的地址选择线, 最大限度地简化总线连接线,IIC总线采用了独特的寻址约定, 规定了开始信号后的第一个字节为寻址字节,用来寻址被控 器件,并规定数据传送方向。