1、作者:夏路易电子工业出版社所有第第8章章 单总线、单总线、I2C总线与总线与1602液晶液晶8.1 单总线单总线8.1.1 单总线介绍单总线介绍 单总线(1-Wire)是Maxim全资子公司Dallas的一项专有技术,与目前多数标准串行数据通信方式,如SPI,I2C等不同,它采用单根信号线,既传输时钟,又传输数据,而且数据传输是双向的,它具有节省I/O口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。单总线采用简单的信令协议,通过一条公共数据线实现主机/主控制器与一个或多个从机之间的半双工、双向通信,如图所示。1线 主 机V C CR1线 芯 片 11线 芯 片 n端 口 控 制PI
2、OINFCRXDTXD1WIRE内 置 VDD控 制芯 片功 能C(寄 生 电 源).作者:夏路易电子工业出版社所有 在单总线主机/从机配置中,所有设备共享一条公共数据线,从机芯片借助这条单总线实现数据传输与供电。典型的单总线主机包括一个漏极开路I/O口,通过电阻上拉到3V至5V电源。也可以选用更完善的主控制器,这种控制器具有专用的线驱动器。单总线系统的另一个重要特性是:每个从机有一个唯一的、不能更改(ROM)的64位光刻序列号(ID)。除了为终端产品提供唯一的电子ID外,64位ID还允许主机从挂接在同一条总线上的许多从机芯片中选择一个,由此实现主、从机通信。单总线通信由主机启动、控制所有的数
3、据传输。单总线通信波形与脉宽调制类似,数据位传输按照宽脉冲(逻辑1)或窄脉冲(逻辑0)发送数据。总线主机(MS)首先发出“复位”脉冲启动通信过程,并通过该脉冲同步整个总线系统。大多数单总线器件都支持两种数据速率:15kbps的标准速率和111kbps的高速速率。通信协议为自同步,并可接收数据位之间的较长延迟。作者:夏路易电子工业出版社所有 在没有专用总线主机的情况下,单片机可以产生单总线时序信号。对单片机系统要求如下:(1)单片机的通信端口必须是双向的,其输出为漏极开路,且具有弱上拉。这也是所有单总线的基本要求。(2)单片机必须能产生标准速度单总线通信所需的精确1s延时和高速通信所需要的0.2
4、5s延时。(3)通信过程不能被中断。由主机发出的读写时间片开始时刻SSSSMSMS主机写0主机写1主机读1主机读0SS1线芯片采样MS主机采样.作者:夏路易电子工业出版社所有8.1.2 DS18B20工作原理工作原理 1.DS18B20的特点单线数字温度传感器DS18B20器件的特点如下:1)独特的单线接口方式:DS18B20与微处理器连接时仅需要一条信号线即可实现单片机与DS18B20的双向通讯。2)在使用中不需要任何外围元件。3)可用数据线供电,电压范围:3.0 5.5 V。4)测温范围:-55 125。测温分辨率为0.5。5)通过编程可实现912位的数字读数方式6)用户可自设定非易失性的
5、报警上下限值。7)支 持 多 点 组 网 功 能,多 个 DS18B20可 以 并 联 在 三 条 线 上,实 现 多 点 测 温。8)负压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。作者:夏路易电子工业出版社所有64位ROM和单线接口D1D2电源控制VDDDQ存储与控制逻辑温度传感器高温报警值TH低温报警值TL配置寄存器缓存8位CRC校验发生器内部VDDCDS18B20GNDDQVDDTO-92.作者:夏路易电子工业出版社所有DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如图8-3
6、所示,其中DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在寄生电源接线方式时接地)。(1)64 b闪速ROM的结构如下:8b检验CRC48b序列号8b工厂代码(10H)MSB LSBMSB LSBMSB LSB在ROM中,开始是8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后 8 位 是 前 5 6 位 的 C R C 校 验 码。可 用 R O M 操 作 命 令 读 出 其 内 容。(2)内部存储器DS18B20温度传感器的内部存储器格式如下:温度低位温度高位THTL配置保留保留保留8位CRCLSB MSB第1,2字节保存温度数值,第1字节为低位
7、,第2字节为高位。第3,4字节锁存器TH和TL保存非易市失性温度报警数据,可通过软件写入用户报警上下限。作者:夏路易电子工业出版社所有第5字节是配置寄存器,其内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。该字节各位的定义如下:TMR1R011111 该寄存器低5位都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,即是来设置分辨率,如下表所示(DS18B20出厂时被设置为12位)。由表可知,设定的分辨率越高,所需要的温度数据转换
8、时间就越长。第68字节未用,表现为全逻辑1;第9字节读出的是前面所有8个字节的CRC码,可用来保证通信正确。CRC的产生在64 b ROM的最高有效字节中存储有循环冗余校验码(CRC)。处理器根据ROM的前56位来计算CRC值,并和存入DS18B20中的CRC值做比较,以判断主机收到的ROM数据是否正确。R1R0分辨率最大温度转换时间(ms)00993.750110187.501011275.001112750.00作者:夏路易电子工业出版社所有3.温度值格式当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在内部存储器的第1,2字节
9、。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.0625/LSB形式表示。温度值格式如下:可以知道,当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码(在取补),再计算十进制值。如下是一部分温度值对应表。位76543210低字节232221202-12-22-32-4高字节SSSSS262524温度()二进制十六进制+1250000 01111101 000007D0H+25.06250000 00011001 00010191H+0.50000 00000000 10000008H00000 00000000 00000000H0.5111
10、1 11111111 1000FFF8H25.06251111 11100110 1111FE6FH551111 11001001 0000FC90H作者:夏路易电子工业出版社所有4.DS18B20与单片机的典型接口设计DS18B20与51单片机的接线如图所示。上图是具有独立电源线的DS18B20接线图,由于数据线空闲时为高电平,因此需要加一个上拉电阻4.7 k,另外2个脚分别接电源和地。下图是寄生电源供电方式,为保证在有效的DS18B20时钟周期内提供足够的电流,51单片机的I/O口控制场效应管对单线总线上拉,当DS18B20处于写存储器操作和温度测量操作时,场效应管导通,使总线有强上拉,上
11、拉开启时间最大为10 s。采用寄生电源供电方式时VDD和GND端均接地。51单片机DS18B20GND DQVDDVDDRVDD4.7k(外电源)单总线51单片机DS18B20GND DQVDDRVDD4.7k单总线I/OI/O.作者:夏路易电子工业出版社所有8.1.3 软件设计软件设计 1.复位与读、写时序由于DS18B20是在一根I/O线上读写数据,对读写有着严格的时序要求,因此有通信协议来保证各位数据传输的正确性和完整性。(1)DS18B20的复位时序 复位要求主CPU将数据线下拉500s,然后释放,DS18B20收到信号后等待1660s左右,后发出60240s低脉冲,主CPU收到此信号
12、表示复位成功。GNDVDD主机发出复位脉冲最小480s最大960s15-60s(480s)DS18B20应答(60-240s)DS18B20等待主机的最短接收时间.作者:夏路易电子工业出版社所有(2)DS18B20的读时序 对于DS18B20的读时序分为读0时序和读1时序两个过程。读时序是从单片机把单总线拉低之后,在15s之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。主 机 读 1时 间GNDVDD主 机 读 0时 间1 s间 隙1 s间 隙15 s45 s15 s45 s主 机 采 样主 机 采 样.1 s间 隙作者
13、:夏路易电子工业出版社所有(3)DS18B20的写时序 对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。主机写1时间GNDVDD主机写0时间最小60s最大120s1s间隙1s间隙15s15s30sDS18B20采样时间mintyemax15s15s30sDS18B20采样时间mintyemax.作者:夏路易电子工业出版社所有2.操作命令介绍(1
14、)ROM命令 读ROM(33h)该命令允许从DS18B20芯片中读出8位编码、序列号和8位CRC码,总线上只有一个DS18B20的时候才可用。匹配ROM命令(55h)该命令后跟64位ROM序列,可以在总线上找到一个唯一的DS18B20,只有这个匹配的芯片才能响应随后的命令,而所有不匹配的芯片都等待复位,总线上有1个或多个器件时,都可以使用这个命令。跳过ROM命令(CCh)在总线上只有单芯片时,可以使用这条命令跳过ROM搜索,节省时间,如果有多个芯片,则会发生数据冲突。搜索ROM命令(F0h)当不知道总线上有多少芯片和各芯片序列号时,这条命令采用排除法识别总线上的芯片的64位编码。报警搜索命令(
15、Ech)最近一次测温后,满足报警条件的芯片,将响应这条命令报警。作者:夏路易电子工业出版社所有(2)DS18B20的操作命令1)写暂存器命令(4Eh)写入开始地址为TH(字节2),随后是TL(字节3)和配置字节(字节4),所有写入操作必须在DS18B20芯片复位之前完成。2)读暂存器命令(BEh)该命令从字节0开始,一直读完所有字节(字节8),如果只需要读取部分数据,则可以使用复位命令终止。3)拷贝暂存器命令(48h)将暂存器内容拷贝到EEPROM中。4)启动温度转换命令(44h)启动总线上的DS18B20进行温度转换。5)读EEPROM命令(B8h)将EEPROM内的数据读回暂存器6)读供电
16、模式命令(B4h)若是寄生电源,芯片返回0,若是外部电源,返回1。作者:夏路易电子工业出版社所有8.1.4 DS18B20测量温度的例题测量温度的例题 例题8-1 两位数码管显示DS18B20测量的温度。用独立电源向DS18B20芯片供电,DS18B20芯片的信号线与51单片机的P3_7引脚相连。温度值的整数部分用两位数码管显示,小数部分用5个发光管显示,最高位数码管的小数点显示负号。单片机时钟频率11.0592MHz。源程序如下:#include#include /本程序运行时钟为11.0592MHZunsigned char code dispcode=0 xC0,0 xF9,0 xA4,
17、0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90 ,0 x7c,0 x39,0 x5e,0 x79,0 x71,0 x00;/整数部分译码表unsigned char code dispnum=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f,0 xff;/温度小数部分译码表 unsigned char timecount;/中断次数变量unsigned char readdata2;/保存温度值的数组unsigned char test,test1,test0;/保存温度值的中间变量sbit DQ=P37;/DS
18、18B20的信号端bit sflag;/正负号标志作者:夏路易电子工业出版社所有 void delay(unsigned int i)/延时函数while(i-);reset(void)/复位DS18B20的函数 unsigned char x=0;DQ=1;delay(8);DQ=0;delay(80);DQ=1;delay(14);x=DQ;delay(20);void writecommandtods18b20(unsigned char command)/写字节到DS18B20的函数 unsigned char i=0;for(i=8;i0;i-)DQ=0;DQ=command&0 x
19、01;delay(5);DQ=1;command=1;作者:夏路易电子工业出版社所有unsigned char readdatafromds18b20(void)/从DS18B20读取一个字节 unsigned char i=0;unsigned char temp=0;for(i=8;i0;i-)DQ=0;temp=1;DQ=1;if(DQ)temp|=0 x80;delay(4);return(temp);作者:夏路易电子工业出版社所有void main(void)/主函数 TMOD=0 x01;/定时/计数器0工作在模式1TH0=(65536-4000)/256;/设置初值TL0=(65
20、536-4000)%256;/设置初值ET0=1;/允许定时器0中断EA=1;/允许总中断TR0=1;/启动定时器0while(1)P1=dispcodetest/10;/P1口相连的数码管显示温度值高位P0=dispcodetest%10;/P0口相连的数码管显示温度值低位P2=dispnum(test0&0 x0f)*10/32;/将温度值的小数部分送P2口连接的发光管显示 P1_7=sflag;/高位数码管的小数点显示负号,亮表示负制温度值 作者:夏路易电子工业出版社所有void t0(void)interrupt 1 using 0 /定时/计数器0的中断服务函数 unsigned c
21、har result;TH0=(65536-4000)/256;/重置定时/计数器0的初值TL0=(65536-4000)%256;timecount+;/中断次数每次增加1if(timecount=150)/当150次中断后,执行如下语句 timecount=0;/清0中断次数reset();/复位DS18B20writecommandtods18b20(0 xcc);/发送跳过ROM搜索命令writecommandtods18b20(0 xbe);/发送读命令readdata0=readdatafromds18b20();/读温度值低8位,高4位为整数部分,低4位为小数readdata1=
22、readdatafromds18b20();/读温度值高8位,高5位为符号位,0表示正数 /1表示负数,低3位为温度值sflag=0;/判断正负号作者:夏路易电子工业出版社所有if(readdata1&0 xf8)!=0 x00)/如果高8位与0 xf8相与不等于0(按位“与”运算)sflag=1;/则是负温度值,是补码readdata1=readdata1;/求高8位反码readdata0=readdata0;/求低8位反码result=readdata0+1;/低8位加1,形成补码送变量resultreaddata0=result;/形成补码送回原变量if(result255)/如果低8位
23、大于255readdata1+;/向高3位进位 test0=readdata0;/将温度值低8位送变量test0test1=readdata1;/将温度值高8位送变量test1test=(readdata1*256)+readdata0)/16;/求整数部分的实际温度值reset();/复位DS18B20writecommandtods18b20(0 xcc);/向DS18B20发送跳过ROM搜索命令writecommandtods18b20(0 x44);/启动下一次转换作者:夏路易电子工业出版社所有例题8-3 读ROM程序该例程序为读DS18B20 ROM的程序,购买回DS18B20芯片后
24、,在安装到现场之前,应该将其ROM内容读出。该例中DS18B20的信号与51单片机的P3_7端相连。单片机时钟频率11.0592MHz。源程序如下:#include AT89X51.Hsbit DQ=P37;/定义通信端口void delay(unsigned int i)/延时函数while(i-);Init_DS18B20(void)/初始化DS18B20unsigned char x=0;DQ=1;/DQ复位delay(8);/调用延时函数DQ=0;/单片机将DQ电平拉低delay(80);/调用延时函数,大于480usDQ=1;/将DQ电平拉高delay(14);/调用延时函数延时x=
25、DQ;/稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay(20);作者:夏路易电子工业出版社所有ReadOneChar(void)/读字节函数unsigned char i=0;unsigned char dat=0;for(i=8;i0;i-)DQ=0;dat=1;DQ=1;if(DQ)dat|=0 x80;delay(4);return(dat);WriteOneChar(unsigned char dat)/写字节函数unsigned char i=0;for(i=8;i0;i-)DQ=0;DQ=dat&0 x01;delay(5);DQ=1;dat=1;作者:夏路易电子
26、工业出版社所有unsigned char code dispcode=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90,0 x88,0 x83,0 xC6,0 xA1,0 x86,0 x8E;/十六进制-7段显示译码表unsigned char code xz=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;/字节顺序变量unsigned char timecount;unsigned char s8;/存放ROM内容的数组变量main()/主函数 unsigned char
27、i=0;TMOD=0 x01;/定时器0,工作在模式1TH0=(65536-4000)/256;/设置定时器初值TL0=(65536-4000)%256;ET0=1;/允许定时器0中断EA=1;/允许总中断TR0=1;/启动定时器0作者:夏路易电子工业出版社所有while(1)if(P3_2=0)/当与P3_2相连的按键按下后,执行如下操作for(i=2000;i0;i-);while(P3_2=0);/等待按键抬起 Init_DS18B20();/调用函数初始化DS18B20WriteOneChar(0 x33);/向DS18B20发送读ROM内容的操作命令for(i=0;i=8)nn=0;
28、作者:夏路易电子工业出版社所有8.2 I2C总线总线 8.2.1 I2C总线介绍总线介绍 I2C(InterIntegrated Circuit)总线是一种由Philps公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在电路板上用于芯片之间的互连。1.I2C总线特点 I2C总线最主要的优点是其简单性和有效性。I2C总线支持多主控器件(芯片),其中任何能够进行发送和接收的器件(芯片)都可以成为主控芯片。一个主控器件(芯片)能够控制信号的传输和时钟频率。当然,在任何时刻只能有一个主控器件(芯片)。作者:夏路易电子工业出版社所有(
29、1)总线的构成及信号类型 I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在单片机与被控器件之间、器件与器件之间进行双向传送,最高传送速率100kbps。各种具有I2C接口的器件均并联在这条总线上,每个器件都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一器件既是主控器件(或被控器件),又是发送器件(或接收器件)。单片机发出的控制信号分为地址码和数据两部分,地址码用来选址,即接通需要控制的器件;数据就是向选定器件传输的内容,这样各器件虽然挂在同一条总线上,却彼此独立,互不相关。单片机SCLSDA从机1从机2从机n.目前有很多芯片上都集成了I2C接口。作者:夏路易
30、电子工业出版社所有(2)I2C总线基础1)总线空闲状态当SDA与SCL信号线为高电平时(由上拉电阻拉向电源电压),总线处于空闲状态。2)I2C总线上的信号 在传送数据过程中共有三种类型信号:启用信号、结束信号和应答信号。启 用 信 号:S C L 为 高 电 平 时,S D A 由 高 电 平 向 低 电 平 跳 变,开 始 传 送 数 据。结 束 信 号:S C L 为 低 电 平 时,S D A 由 低 电 平 向 高 电 平 跳 变,结 束 传 送 数 据。应答信号:接收数据的器件在接收到8位数据后,向发送数据的器件发出特定的低电平脉冲,表示已收到数据。例如,单片机向接收器件发出一个信号
31、后,等待接收器件的应答信号,单片机接收到应答信号后,根据实际情况做出是否继续传递信号的判断。如果接收器收到8位数据后,没有使ACK=0,而是ACK为1,则表示接收失败(NACK)。ACK应该在SCL线上出现第9个脉冲之前,使SDA=0。若是接受器为主控器时,则应该收到最后一个字节后,发送一个NACK信号(ACK=1),通知被控器接收结束,并释放总线。控制总线数据传送的芯片为主控器件,该器件提供一次通信所需要的总线启动信号、时钟信号,被控芯片的地址与停止信号。受主控器件控制进行数据传送操作的器件为受控(从)器件。主控器件和受控器件都可以工作在接收和发送状态。在单片机系统中,总线一般由主控器件(通
32、常为单片机)控制。作者:夏路易电子工业出版社所有3)SDA信号与SCL信号之间的关系SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。如图8-11所示。6)插入等待时间 若是接收芯片没有准备好接收下一个字节,则接收芯片将SCL信号拉低,这时发送器件自动进入等待状态,直到接收芯片准备好接收下一个字节,释放总线,发送器件才继续发送下一个字节。若是接收器件不能及时返回应答信号,则SDA信号一直保持高电平。SCLSDA起始位地址或停止位数据应答可改变.作者:夏路易电子工业出版社所有7)重启动总线在主控器完成一次完整的通信后,如果需要继
33、续霸占总线,则在最后一个应答信号ACK信号之后的SCL高电平期间,使SDA信号出现下降沿,则会重新启动总线。8)总线封锁只有有一个器件将总线SCL信号锁定在低电平,则I2C被封锁,所有器件不能实现通信。作者:夏路易电子工业出版社所有(3)总线仲裁 如果两个主器件同时使用I2C总线传送数据,就会出现哪个主器件使用总线的问题,也就出现了总线仲裁问题。如果两个主器件同时使用I2C总线传送数据,则同时送出SCL时钟,由于各个器件之间是线与关系,则最终结果会合并成一个时钟脉冲,其低电平为各个时钟的低电平之“或”,高电平为各个时钟高电平之“与”。由于I2C总线上连接的各个I2C器件之间是线与关系,对于I2
34、C总线来说,只要有一个器件在SDA信号线上输出低电平信号,则SDA信号线就是低电平。所以发送数据的器件在发送SDA信号的同时,还在检查SDA信号的电平与所发送的信号是否一致,如果不一致,则说明有其他发送数据的器件也在发送数据,因此就退出;如果一致,则继续发送数据。在总线仲裁过程中,最终获得总线控制权的主器件没有丢失数据,这是“低电平优先”的仲裁原则。作者:夏路易电子工业出版社所有2.I2C总线数据传输过程有两种工作模式:(1)主控器为发送器(主控发送器),被控器是接收器(被控接收器)(2)主控器是接收器(主控接收器),被控器为发送器(被控发送器)一般规律如下:(1)主控器控制全部发送过程。(2
35、)以启用信号开始,以停止信号结束。(3)传送的字节数没有限制。(4)主控器发送启用信号后,紧跟着发送地址字节。(5)读写控制位用于向被控器提供读写信息,如果为0,则被控器接收数据,如果为1,则被控器发送数据,就是主控器从被控器读入数据。(6)每传送一个字节需要9个脉冲,前8个时钟脉冲对应的是数据,最后一个脉冲对应的是反馈应答信号ACK。(7)所有连接在I2C总线上被控器件都接收启动信号后的地址字节,并把7位地址码与自己寄存器中的地址码比较,如果相同,则为主控器寻找的被控器,在第9个时钟脉冲时反馈应答信号。(8)每个数据字节都是高位在前。作者:夏路易电子工业出版社所有3.信号传送格式主控器与被控
36、器进行一次通信称为一帧。典型的信号格式有以下三种;(1)主控器向被控器写入数据如果主控器向被控器写入n个字节,则格式如下:启动地址读写ACK数据ACK停止位 7位0 8位 主控发出被 控返回主控发出被控返回主控发出 主控发出n个字节数据/被控返回n个ACK,若是被控返回NACK表示接收不成功 作者:夏路易电子工业出版社所有(2)主控器从被控器读回数据如果主控器向被寻址的被控器读回n个字节,则格式如下:启动地址读写ACK数据ACKNACK停 止位 7位1 8位 主控发出被 控返回被控发出主控返回主控返回NACK,表示数据接收完毕主 控发出 被控发出n个字节数据/主控返回n-1个ACK 作者:夏路
37、易电子工业出版社所有(3)主控器连续发动两次数据传输如果主控器先向被控器写入数据,然后再读回数据,则格式如下:启动地址读写ACK数据ACK/NACK重启动地址读写数据ACKN A CK停止位 7位0 8位 7位18位 主控发出被控返回主控发出被控返回主控发出被控发出主控返回主控返回N A CK,表示数据接收完毕主控发出向被控写入n个字节 数据,若是被控返回NACK表示接收不成功被控发出n 个 字 节数据/主控返回n-1个ACK作者:夏路易电子工业出版社所有4.地址格式为了减少引脚数目,I2C总线的7位地址格式如下:D7D6D5D4D3D2D1D0从芯片地址R/W 地址由7位组成,占用了地址字节
38、的的高7位,字节的0位为数据方向控制位。由于地址位是7位,因此在I2C总线上可以连接127个具有I2C接口的芯片。7位地址中,4位为固定地址(器件类型地址),3位为可编程地址。例如LM75数字温度传感器的固定地址为1001,则其地址为:1001A3A2A1D0由于只有3位可编程地址,所以在该I2C总线上只能连接8个相同的芯片。部分器件类型地址如下:存储器类:1010LED与LCD驱动器:0111作者:夏路易电子工业出版社所有5.常见的I2C总线工作方式 一般情况下,只要的时钟频率满足SDA和SCL上升沿与下降沿的需求,就可以用软件方法实现单片机与I2C器件的通信。6.I2C器件与I2C总线连接
39、 I2C接口的存储器AT24C02与I2C总线连接方式如下图所示。A01A12A23GND4SDA5SCL6WP7VCC824C0210k10k12JIICVCCSCLSDA.作者:夏路易电子工业出版社所有8.2.2 I2C接口存储器接口存储器AT24C02 1.AT24C02特点与400KHz I2C 总线兼容。1.8 到6.0 伏工作电压范围。低功耗CMOS 技术。写保护功能当WP 为高电平时进入写保护状态。页写缓冲器。自定时擦写周期。1,000,000 编程/擦除周期。可保存数据100 年。8 脚DIP SOIC 或TSSOP 封装。温度范围商业级工业级和汽车级。作者:夏路易电子工业出版
40、社所有2.引脚排列AT24C02的引脚排列如图所示。其中:SDA是串行数据脚。该脚为双向引脚,漏极开路,用于地址、数据的输入和数据的输出,使用时需加上拉电阻。SCL是时钟脚。该引脚为器件数据传输的同步时钟信号。SDA和SCL脚均为施密特触发输入,并有滤波电路,可有效抑制噪声尖峰信号,保证在总线噪声严重时器件仍能正常工作。在单片机系统中,总线受单片机控制。单片机产生串行时钟(SCL),控制总线的存取,发送启用STRAT和停止STOP信号。WP是写保护引脚,该引脚高电平时处于写保护状态。如果WP 管脚连接到电源VCC,所有的内容都被写保护只能读,当WP 管脚连接到地线VSS或悬空允许器件进行正常的
41、读/写操作 A0、A1和A2引脚是器件地址选择引脚。若是悬空,相当于接0电平,如果只有一个AT24C02被总线寻址这三个地址输入脚A0 A1 A2 可悬空或连接到VSS。VCC是电源引脚,电源电压范围是1.8V6V,极限电压为2V7V。VSS是地线引脚。各个引脚承受极限电压为2VVCC+2V作者:夏路易电子工业出版社所有3.器件地址格式AT24C02的器件地址格式如下:因为是EEPROM,所以高4位都是1010,后4位中的前3位为可选择地址,所以一块电路板上,最多允许8个AT24C02器件。1.字节写 在字节写模式下单片机发送起始命令、从器件地址以及R/W位置0给从器件;从器件产生应答信号后,
42、主器件发送AT24C02的字节地址,主器件在收到从器件的第2个应答信号后,再发送数据到被寻址的存储单元,AT24C02再次应答后,主器件产生停止信号,随后AT24C02开始内部数据的擦写,在内部擦写过程中AT24C02不再应答主器件的任何请求。写时序如图所示。SPACKACK11001110R/WACK从机从机从机停止位主机主机发送的从机地址主机发送的字节地址主机发送的数据写.启动位作者:夏路易电子工业出版社所有2.读操作(1)立即地址读 AT24C02的地址计数器内容为最后操作字节的地址加1,也就是说如果上次读/写的操作地址为N,则立即读的地址为从地址N+1开始,如果N=255则计数器将翻转
43、到0,且继续输出数据,AT24C02接收到器件地址信号、R/W位置1信号,首先发送一个应答信号,然后发送一个8位字节数据,主器件不需发送一个应答信号但要产生一个停止信号。立即读时序如图所示。SNACKACK1100111R/W主机从机主机发送的从机地址主机接收的字节地址P停止位主机读启动位.作者:夏路易电子工业出版社所有(2)选择地址读选择地址读操作允许单片机对寄存器的任意字节进行读操作,单片机首先发送起始信号、从器件地址、需要读取的字节数据的地址;在AT24C02应答之后,主器件重新发送起始信号、从器件地址(R/W位置1),AT24C02响应并发送应答信号,然后输出所要求的一个8位字节数据,
44、主器件不发送应答信号但产生一个停止信号。AT24C02选择地址读的时序如图所示。SPACKACK11001110R/WNACK主 机从 机从 机停 止 位主 机主 机 发 送 的 从 机 地 址主 机 发 送 的 字 节 地 址主 机 接 收 的 数 据SACK1100111R/W从 机主 机 发 送 的 从 机 地 址起 始 位主 机读写启 动 位.作者:夏路易电子工业出版社所有(3)连续地址读连续读操作可通过立即读或选择性读操作方式启动,在AT24C02发送完一个8位字节数据后,单片机产生一个应答信号来响应,通知AT24C02,单片机要求更多的数据,对应每个单片机产生的应答信号,AT24C
45、24将发送一个8位数据字节,当单片机不发送应答信号,而发送停止位时结束此操作。从AT24C02输出的数据按顺序由N到N+1输出,读操作时地址计数器在AT24C02整个地址内增加,当读取的字节超过256,计数器将翻转到0并继续输出数据字节。连续地址读的时序如图所示 PNACK停止位主机主机接收的数据1ACK1R/W从机读主机接收的数据2ACK主机ACK主机主机接收的数据n主机从机地址.作者:夏路易电子工业出版社所有例题8-5 写入AT24C02芯片一个字节,然后读出并在数码管上显示。按下按键k1写0 x12到0 x01地址,按下按键k3写0 x25到0 x01地址,按下按键k2从0 x01地址读
46、出一个字节,显示在P0和P1口相连的数码管上。单片机时钟频率11.0592MHz。源程序如下:#define uchar unsigned char /定义一下方便使用#define uint unsigned int#define ulong unsigned long#include /包括一个52标准内核的头文件#define WriteDeviceAddress 0 xa0 /定义器件在I2C总线中的地址(读写位为0)#define ReadDviceAddress 0 xa1 /定义器件在I2C总线中的地址(读写位为1)sbit SCL=P37;sbit SDA=P36;sbit K
47、1=P32;sbit K2=P33;sbit K3=P34;作者:夏路易电子工业出版社所有void DelayMs(unsigned int number)/延时函数unsigned char temp;for(;number!=0;number-)for(temp=112;temp!=0;temp-);void Start()/启用总线SDA=1;SCL=1;SDA=0;SCL=0;void Stop()/停用总线SCL=0;SDA=0;SCL=1;SDA=1;void NoAck()/发送应答信号ACKSDA=1;SCL=1;SCL=0;作者:夏路易电子工业出版社所有bit TestAck
48、()/测试应答信号ACKbit ErrorBit;SDA=1;SCL=1;ErrorBit=SDA;SCL=0;return(ErrorBit);Write8Bit(unsigned char input)/写入8个二进制位到AT24c02unsigned char temp;for(temp=8;temp!=0;temp-)SDA=(bit)(input&0 x80);SCL=1;SCL=0;input=input1;作者:夏路易电子工业出版社所有void Write24c02(uchar ch,uchar address)/写入一个字节到AT24c02中address地址Start();W
49、rite8Bit(WriteDeviceAddress);/发送器件的地址TestAck();Write8Bit(address);/发送写入字节的地址TestAck();Write8Bit(ch);/发送写入的数据TestAck();Stop();DelayMs(10);uchar Read8Bit()/从AT24c02中读出8个二进制位unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp-)SCL=1;rbyte=rbyte1;rbyte=rbyte|(unsigned char)(SDA);SCL=0;return(rbyte);作者:夏路
50、易电子工业出版社所有uchar Read24c02(uchar address)/从24c02中address地址读出1个字节 uchar ch;Start();/启用总线Write8Bit(WriteDeviceAddress);/发送器件的地址TestAck();/测试应答信号Write8Bit(address);/发送读出字节的地址TestAck();/测试应答信号Start();/启用总线Write8Bit(ReadDviceAddress);/发送器件的地址TestAck();/测试应答信号ch=Read8Bit();/读8位数据NoAck();/无应答信号 Stop();/停止总线