470 likes | 605 Views
串行数据存储器的接口方法. 串行扩展总线技术是新一代单片机技术发展的一个显著特点。在没有专门的串行扩展总线时,除了可以使用 UART 串行接口的移位寄存器方式扩展并行 I/O 口外,还可以通过并行总线扩展外围器件。. 并行总线扩展外围器件的优点是容量大,速度快。但由于并行总线扩展时连线过多,外围器件操作方式各异,外围器件与数据存储器混合编址等,都给单片机应用系统设计带来较大的困难。. 串行数据存储器的接口方法.
E N D
串行数据存储器的接口方法 串行扩展总线技术是新一代单片机技术发展的一个显著特点。在没有专门的串行扩展总线时,除了可以使用UART串行接口的移位寄存器方式扩展并行I/O口外,还可以通过并行总线扩展外围器件。 并行总线扩展外围器件的优点是容量大,速度快。但由于并行总线扩展时连线过多,外围器件操作方式各异,外围器件与数据存储器混合编址等,都给单片机应用系统设计带来较大的困难。
串行数据存储器的接口方法 • 目前新一代单片机中使用的串行扩展接口有Motorola的SPI,NS公司的MICROWIRE/PLUS和PHILIPS公司的I2C总线。其中I2C总线具有标准的规范以及众多带I2C接口的外围器件,形成了较为完善的串行扩展总线。
I2C总线 • I2C总线(Inter IC Bus)是PHILIPS公司推出的两线串行多主总线。 I2C总线最显著的特点是规范的完整性,结构的独立性和用户使用时的“傻瓜”化。 • I2C总线有严格的规范:接口的电器特性、信号时序、信号传输的定义、总线状态设置、总线管理规则及总线状态处理等。
I2C总线结构 • I2C总线通过两根线:串行数据线SDA和串行时钟线SCL,在总线连接的器件之间传信息,采用软件寻址方式识别每个器件。 • I2C是多主机总线。可以由所连的多个器件分时控制总线(图5-13)。
I2C总线结构 • 单片机A将信息送至B:A(主器件)寻址B(从器件);A(发送方)把数据传至B(接收方);A终止传送。 • 单片机A从B接收信息:A(主器件)寻址B(从器件);A(接收方)接收B(发送方)数据;A终止接收。
I2C总线结构 • 串行数据线SDA和串行时钟线SCL都是双向I/O线,通过上拉电阻接正电源电压VDD,因此电平取决于线上的正电源,也可以由用户自行改变。
数据传输与起停 • 在总线进行正常数据传输时,如果时钟线CLK处于高电平,数据线DATA上必须保持稳定电平,接收器从总线上读取数据,高电平为1,低电平为0.只有CLK为低电平时,才允许数据发送器变换数据,将待发送位写到数据线上。
数据传输与起停 • I2C总线数据交换的起始和停止信号靠时钟线和数据线的不同状态组合产生。时钟线保持高电平时,数据线电平由高到低的跳变为起始信号,由低到高的跳变为停止信号。 • I2C总线的数据每字节8位。总线对每次传送的字节数没有限制,但每个字节后面都有位于第9个时钟脉冲处的应答位,即数据接收方对发送方回送一个低电平应答信号,数据发送方必须在这个时钟位置上释放数据线。
数据传输的标准格式 • 主器件在发出起始信号后,送出地址字节,其中高7位是总线上各个器件的编码地址;第8位是方向位(R/!W),表明主器件与从器件的数据传输方向:0表明主器件对从器件进行写操作,1表示主器件对从器件进行读操作;第9位是接收方的应答;然后是8位数据字节+ACK(应答);最后才是停止信号。
数据传输的三种方式 • (1)主器件写 • 主器件向从器件连续发送n个数据字节,最后给出停止信号,整个过程中数据的传输方向不变。
数据传输的三种方式 • (2)主器件读 • 主器件从从器件连续读取n个数据字节,最后给出停止信号,整个过程中数据的传输方向不变。
数据传输的三种方式 • (3)组合方式 • 主器件首先发出起始信号和地址字节,启动与某一个从器件的数据传输,传输结束后立即与另一个从器件交换数据。
寻址约定 • I2C总线利用起始信号第一个(或前几个)字节传送地址,软件地址至少长7位。除特殊规定外,第一个字节的高7位是从器件地址;包括固定地址和可编程地址两部分。 • 例如: I2C总线分配给8路7位DAC器件的地址为0100XXX,其中高4位0100是固定地址,低3位XXX是可编程地址。
固定地址第一个字节的高4位为1111或0000时的特殊规定固定地址第一个字节的高4位为1111或0000时的特殊规定
10位寻址 • 第一个字节的前5位是11110,表示此次寻址是10位寻址方式,A1,A0两位和第二个字节的8位组成10地址。
设备内部总线和I2C总线的接口 • 设备内部总线和I2C总线的接口有两种方式:中断和查询。中断方式需要I2C总线专用的接口芯片;查询方式在不进行传输时,应尽量采用较低频率查询总线。 • 为保证起始字节也能被反应较慢的器件响应,主器件发出第一个S,再发一个字节00000001,再发一个S’。
仲裁 • I2C总线支持多个主器件操作。当有多个主器件申请总线控制权时,并没有优先次序,需要系统进行总线裁定。 I2C总线的结构设计是采用数据线和时钟线的开漏集(或开集电极)连接方式解决仲裁问题,DATA线和CLK线对于各器件来说在逻辑上是“线与”关系。 • 仲裁方法:各器件在同步时钟的高电平时期,检测DATA线是否与自己发出的数据相同。由于多个器件所发出的数据在DATA线上相与,某个器件为1,将被另外一个为0的屏蔽,检测的结果与原数据不符,仲裁的结果是该器件推出总线竞争。
串行E2PROM扩展 • I2C总线标准的串行存储器有24XXXX系列和85XXXX系列,包括1-256KB等不同规格和容量。 • SCL-时钟 • SDA-数据 • WP-写保护 • A0,A1,A2 • -片选或块选
串行E2PROM扩展 • 24XXXX采用I2C规程,运用主/从双向通信。主器件(通常为微控制器)和从器件可工作于接收器和发送器状态。 • 总线必须由主器件控制,主器件产生串行时钟(SCL),控制总线的传送方向,并产生起始和停止条件。串行E2PROM为从器件。无论主器件,还是从器件,接收一个字节后必须发出一个确认信号。 • 起始和停止位控制总线有效。操作在起始位控制下开始,在停止位控制下结束。 • 当SCL为高时,数据稳定有效;当SCL为低时数据SDA改变为数据位。对于一个SCL脉冲,只能传送一位数据。
控制字节要求 • 起始位以后,主器件送出8位控制字节。 • 说明: • 1.控制字的高四位来确认从器件的类型,由PHILIPS公司规定。若从器件为串行E2PROM,则这四位码为1010.通常串行E2PROM器件一直处于等待状态,直到1010码发送到总线上为止,当1010码发到总线,非串行E2PROM从器件均不会影响。
控制字节要求 • 2.控制字节的A2A1A0三个控制位为片选位,或者为存储器的内部的块地址选择位。按3线-8线译码组合,最多可有8片片选或块选。标准的I2C规程允许选择16KB存储器。
控制字节要求 • 控制字节的A2A1A0的选择必须与外部引脚的硬件连接或者内部块选择匹配。 24XXXX的存储矩阵内部分为若干块,每一块有若干页面,每一页面有若干字节,内部页缓冲器每次只能写入一页字节数据。 • 3.控制字节最低位为读/写操作控制码。如果此位为1,下一个字节进行读操作;此位为0,下一个字节进行写操作。
确认要求 • 在每一个字节接收后,接收器件必须产生一个确认信号为ACK,主器件必须产生一个与此确认位相应的额外时钟脉冲。在此时钟脉冲的高电平期间,将SDA线拉到稳定的低电平为确认信号。若不在从器件输出的最后一个字节中产生确认位,主器件必须发一个数据结束信号给从器件。在这种情况下,从器件必须保持数据线为高电平,使得主器件能产生停止条件。 • 注意,如果内部变成周期(烧写)正在进行,24XXXX不产生任何确认位。
写操作 • 1. 字节写 • 在主器件发出起始信号后,主器件发出写控制字节,即1010A2A1A00.指示从接收器件被寻址,由主器件发送的下一个字节字地址将被写入到24XXXX的地址指针。主器件接收来自24XXXX的另一个确认信号以后,发送数据字节,并写入到寻址的存储器地址。 24XXXX再次发出确认信号,同时主器件产生停止信号P,启动内部写周期。在内部写周期内24XXXX将不产生确认信号。
2. 页面写 • 如同字节写方式,先将写控制字节、字地址发送到24XXXX,接着发n个数据字节。主器件发送不多于一个页面字节到24XXXX,这些数据字节暂存在片内页面缓存器中,在主存储器发送停止信号以后写入到存储器。接收每一个字节以后,低位顺序地址指针在内部加1.高位顺序字节地址保持为常数。如果主存储器件在产生停止信号以前要发送多于一页字的数据,地址计数器将会循环,并且先接收到的数据将被覆盖。
3. 写保护 • 当WP端连接到Vcc,24XXXX被用作串行ROM,此时编程将被禁止,即整个存储器为写保护状态。 • 4. 读操作 • 当从器件地址的R/!W被置为1时,启动读操作。存在三种基本读操作类型:读当前地址内容、读随意地址内容和读顺序地址内容。
(1). 读当前地址内容 • 24XXXX片内包括一个地址计数器,此计数器保持被存取的最后一个字的地址,并在片内自动加1.因此,如果以前存取的地址为n,下一个读操作从n+1地址中读取数据。在接收到从器件的地址中R/!W位为1的情况下,24XXXX发送一个确认位并且送出8位数据字。主器件将不产生确认位,但产生一个停止位。24XXXX不再继续发送。
(2). 读任意地址内容 • 主器件发1010A2A1A0后,发!W位,再发读的存储器地址,在收到从器件的确认位ACK后,产生一个起始条件S,以结束上述写过程,再发一个读控制字节,从器件再发ACK信号后发出8位数据,主器件发!ACK后发一个停止位,24XXXX不再发后续字节。
(3). 读顺序地址内容 • 读顺序地址内容的方式与读任意地址内容的方式相同,只是在24XXXX发送第一个字节(数据n)以后,主器件不发!ACK和停止信号,而是发ACK确认信号,控制24XXXX发送下一个顺序地址的8位数据字,直到x个数据读完。
(4). 防止噪声 • 24XXXX使用一个Vcc门限检测电路。在一般情况下,如果Vcc低于1.5V,门限检测器对内部擦/写逻辑不使能。 • SCL和SDA输入端接有施密特触发器和滤波器电路,即使在总线上噪声存在的情况下,它们也能抑制噪声以保证器件工作正常。
5. 串行E2PROM和8051接口 • P1.6提供24C04的时钟SCL。 • P1.7和24C04进行数据传送。 • A2,A1,A0为片选端,悬浮或接地。 • WP是写保护信号,高电平有效,因要对其写入,故接地。
I2C总线数据传送编程 • 24XXXX系列是采用I2C接口的串行E2PROM器件,而51系列单片机大多数无I2C总线接口功能,这就要靠软件来模拟实现。 • I2C总线在标准方式下的最高时钟频率为100kHz,时钟信号最小低电平时段为4.7 s,高电平时段不小于4 s。
常用的子程序 • 1、产生起始位和停止位 • 假设单片机用的晶体振荡器频率为6MHz,则每个机器周期为2 s. • (1) 发送起始信号 • START: SETB P1.7 • SETB P1.6 • NOP • NOP • CLR P1.7 • NOP • NOP • CLR P1.6 • RET
(1) 发送停止信号 • STOP: CLR P1.7 • SETB P1.6 • NOP • NOP • SETB P1.7 • NOP • NOP • CLR P1.7 • RET
发送应答信号 • MACK: CLR P1.7 • SETB P1.6 • NOP • NOP • CLR P1.6 • SETB P1.7 • RET
发送反应答信号 • MNACK: SETB P1.7 • SETB P1.6 • NOP • NOP • CLR P1.6 • CLR P1.7 • RET
应答位检查子程序 • 在I2C总线数据传送中,接收器收到发送器传送来的一个字节后,必须向SDA线上返回一个应答位ACK,表明此字节已经收妥。子程序使单片机产生一个额外的时钟(第九个时钟脉冲),在脉冲的高电平期间读ACK应答位,并将它的状态复制到F0标志以供检查。若有正常ACK,则F0标志为0,否则为1。 • CACK: SETB P1.7;P1.7作为输入 • SETB P1.6;第九个时钟开始 • NOP • MOV C, P1.7;读SDA线 • MOV F0, C ;存入F0中 • CLR P1.6;时钟脉冲结束 • NOP • RET
字节数据发送子程序 • 由于SDA接在并行口线,无移位寄存器,因此数据通过指令完成移位再从P1.7串行输出。 • 时序要求,数据在时钟低电平时变化,高电平时稳定,每一个时钟脉冲传送一位,编写字节数据传送子程序。 • 该子程序入口条件是待发送的字节位于累加器ACC中。
WRB: MOV R7, #08 ; 位计数器初值 WLP: RLC A ;欲发送位移入C中 JC WR1 ; C为1时,转发送1子程序 WR0: CLR P1.7 ; C为0时,执行发送0子程序 SETB P1.6; SCL为高,SDA为低 NOP ;4 s延时 NOP CLR P1.6 SETBP1.7 DJNZ R7, WLP ;位计数器不为0继续发送 RET ;8位发送结束返回 WR1: SETB P1.7 SETB P1.6 ; SCL为高,SDA为高 NOP ;4 s延时 NOP CLR P1.6 CLR P1.7 DJNZ R7, WLP RET
字节数据接收子程序 • 在时钟高电平时数据已稳定,读入一位,经过8个时钟从SDA线上读入一个字节数据,并将所读字节存入A和R6。 • RDBYT: MOV R7, #08 ; 位计数器初值 • RLP: SETB P1.7 ; P1.7输入 • SETB P1.6 ; P1.6 脉冲开始 • MOV C, P1.7 ;读SDA线 • MOV A, R6 ; R6暂存 • RLC A • MOV R6, A • CLR P1.6 • DJNZ R7, RLP • RET
n个字节发送子程序 • 控制字节1010A2A1A0!W已存在片内RAM的SLA单元中; • 24XXXX接收到数据的首地址存放在单片机内RAM的MTD单元。 • 待发送的字节在单片机内RAM以MTD+1为首地址的n个连续单元中; • NUMBTY单元中存放有欲发送的字节数;
程序清单 • WRNBYT: PHSH PSW ;保护现场 • MOV PSW, #18H ;该用第三组工作寄存器 • LCALL START ;发起始信号 • MOV A, SLA ;读控制字 • LCALL WRB ;发送控制字 • LCALL CACK ; 检查应答信号 • JB F0, WRNBYT ;无应答,重发 • MOV R0, #MTD ;有应答,开始发送数据 • MOV R5, NUMBYT;第一个传送数据为地址
WRDA: MOV A, @R0 ;读入欲发送的字节 • LCALL WRB ;发送字节 • LCALL CACK ;检查应答信号 • JB F0, WRDA ;无应答重发 • INC R0 • DJNZ R5, WRDA • LCALL STOP ;发停止信号 • POP PSW ;恢复现场 • RET
读、存数据程序 • 从24XXXX的当前地址开始读取n个字节数据并存入片内RAM以MRD为首址的单元中 • 程序入口条件 • 片内RAM中的SLA单元存有1010A2A1A0R控制字节 • NUMBYT单元存有欲接收数据的字节数 • 出口条件 • 所读完的数据将存入片内RAM以MRD为首址的n个连续单元内。
RDNBYT: PHSH PSW ;保护现场 • MOV PSW, #18H ;该用第三组工作寄存器 • LCALL START ;发起始信号 • MOV A, SLA ;读控制字 • LCALL WRB ;发送控制字 • LCALL CACK ; 检查应答信号 • JB F0, RDNBYT ;无应答,重发 • MOV R1, #MRD ;有应答,开始接收数据
GO-ON: LCALL RDBYT ;读一个字节 • MOV @R1, A;存入数据缓冲区 • DJNZ NUMBYT, ACK ;未读完转ACK • LCALL NMACK ;读完所有字节发!ACK • LCALL STOP ;发停止信号 • POP PSW ;恢复现场 • RET • ACK: LCALL MACK ;发送ACK • INC R1 ;调整指针 • AJMP GO-ON ;继续接收