. . ..
第8章 单片机常用总线讲解
8.1
C总线接口
C接口的
80C51单片机本身不具有总线接口,但是通过软件进行模拟,可以挂接具有芯片。 8.1.1
C总线的介绍
串行扩展总线在单片机系统中的应用是目前单片机 技术发展的一种趋势。在目前比较流行的几种串行扩展总线中,总线以其严格的规范和众多带接口的外围器件而获得广泛应用。总线是PHILIPS公司推出的芯片间串行传输总线,它由两根线组成,一根是串行时钟线(SCL),一根是串行数据线(SDA)。主控器利用串行时钟线发出时钟信号,利用串行数据线发送或接收数据。总线由主控器电路引出,凡具有接口的电路(受控器)都可以挂接在总线上,主控器通过总线对受控器进行控制。
随着总线研究的深入,总线已经广泛应用于视/音频领域、IC卡行业和一些家电产品中,在智能仪器、仪表和工业测控领域也越来越多地得到应用。
8.1.2 总线的特点
总线的广泛应用是同它卓越的性能和简便的操作方法分不开的。总线的特点主要表现在以下几个方面:
硬件结构上具有相同的硬件接口界面。总线系统中,任何一个总线接口的外围器件,不论其功能差别有多大,都是通过串行数据线(SDA)和串行时钟线(SCL)连接到总线上。这一特点给用户在设计用用系统中带来了极大的便利性。用户不必理解每个总线接口器件的功能如何,只需将器件的SDA和SCL引脚连到总线上,然后对该器件模块进行独立的电路设计,从而简化了系统设计的复杂性,提高了系统抗干扰的能力。
线接口器件地址具有根大的独立性。每个接口芯片具有唯一的器件地址,由于不能发出串行时钟信号而只能作为从器件使用。各器件之间互不干扰,相互之间不能进行通信,各个器件可以单独供电。单片机与器件之间的通信是通过独一无二的器件地址来实现的。
软件操作的一致性。由于任何器件通过总线与单片机进行数据传送的方式是基本一样的,
.v .. ..
第八章 单片机常用总线讲解
这就决定了总线软件编写的一致性。
PHILIPS公司在推出
总线的同时,也为
总线制订了严格的规范,如:接口的电气
特性、信号时片、信号传输的定义等。规范的严密性,结构的独立性和硬、软件接口界面的一致性.极大地方便了时的“傻瓜”化。
总线设计的模块化和规范化,伴随面来的是用户在使用
总线
8.1.3 总线数据的传输规则
①在总线上的数据线SDA和时钟线SCL都是双向传输线,它们的接口各自通过一个上拉电阻接到电源正端。当总线空闲时,SDA和SCL必须保持高电平。为了使总线上所有电路的输出能完成一个线“与”的功能,各接口电路的输出端必须是开路漏极或开路集电极。 ②进行数据传送时.在时钟信号高电平期间.数据线上的数据必须保持稳定;只有时钟线上的信号为低电平期间.数据线上的高电平或低电平才允许变化,如图8.1.1所示。
图8-1 数据的有效性 ③在
总线的工作过程中,当时钟线保持高电平期间,数据线由高电平向低电平变化
定义为起始信号(S)。而数据线由低电平向高电平的变化定义为一个终止倌号(P),如图8.1.2所示,起始信号和终止信号均由主控器产生。
起始条件 停止条件
图8-2 起始和停止条件
④总线传送的每一字节均为8位,但每启动一次总线,传输的字节数没有限制,由主
. . ..
控器发送时钟脉冲及起始信号、寻址字节和停止信号,受控器件必须在收到每个数据字节后做出响应,在传送一个字节后的第9个时钟脉冲位,受控器输出低电平作为应答信号。此时.要求发送器在第9个时钟脉冲位上释放SDA线,以便受控器演出应答信号,将SDA线拉或低电
----------------
平,表示对接收数据的认可,应答信号用ACK或A表示.非应答信号用ACK或A表示,当确认后,主控器可通过产生一个停止信号来终止总线数据传输。示。
总线数据传输示意图如图8.1.3所
起始 地址 读/写 应答 数据 应答 数据 应答 停止
信号 信号
图8-3总线数据传输示意图
需要说明的是,当主控器接收数据时,在最后一个数据字节,必须发送一个非应答位,使受控器释放SDA线,以便主控器产生一个停止信号来终止总线数据传输。
3.总线数据的读写格式
总线上传送数据的格式是指为被传送的各项有用数据安排的先后顺序,这种格式是人们根据串行通信的特点,传送数据的有效性、准确性和可靠性而制定的。另外,总线上数据的传送还是双向的,也就是说主控器在指令操纵下,既能向受控器发送数据(写入),也能接收受控器中某寄存器中存放的数据(读取).所以传送数据的格式有“写格式”与“读格式”之分。 (1)写格式
总
线
数
据
的
写
格
式
如
图
8-4
所
示
.v .. ..
第八章 单片机常用总线讲解
图8-4 总线数据的写格式
写格式是指主控器向受控器发送数据,工作过程是:先由主控器发出启动信号(S),随后传送一个带读/写(R/W)标记的从地址(SLAVE ADD)字节,从地址只有7bit长,第8位是读/写位(R/W),用来确定数据传送的方向,对于写格式,R/W应为“0”,表示主控器将发送数据给受控器,接着传送第二个字节,即从地址的子地址(SUB ADD),若受控器有多字节的控制项目,该子地址是指首(第一个)地址,因为子地址在受控器中都是按顺序编制的,这就便于某受控器的数据一次传送完毕;接着才是若干字节的控制数据的传送,每传送一个字节的地址或数据后的第9位是受控器的应答信号,数据传送的顺序要靠主控器中程序的支持才能实现,数据发送完毕后,由主控器发出停止信号(P)。 (2)读格式
读格式如图8.1.5所示。
与写格式不同,读格式首先要找到读取数据的受控器的地址,包括从地址和子地址,所以格式中在启动读之前,用写格式发送受控器,再启动读格式,不过前3个应答信号因为是指向受控器,所以应由受控器发出;然后,所有数据字节的应答信号因为是指向主控制器,因此由主控器发出。不过最后的A=1。
------
图8-5 受控器向主控器发送数据(读格式)
重点提示 在设置众多受控器中,为了将控制数据可靠地传逆给指定的受控IC,必须使每一块IC编制一个地址码,通常称为从地址,显然从地址不能在不同的IC间重复使用。主控器
. . ..
发送寻址字节时,总线上所有受控器都将寻址字节中的7位地址与自己的从地址相比较,如果两者相同,则该器件就是被寻址的受控器(从器件),受控器内部的n个数据地址(子地址)的首
地址由子地址数据字节指出,总线接口内部具有子地址指针自动加1功能,所
以主控器不必一一发送n个数据字节的子地址。 4.单片机模拟 单片机在模拟
总线通信
总线通信时,需写出如下几个关键部分的程序:总线初始化、启动信号、
应答信号、停止信号、写—个字节、读—个字节。下面分别给出具体函数的写法供大家参考,在阅读代码时请参考前面相关部分的文字描述及时序图。 (1) 总线初始化
void int() //将总线都拉高以释放总线 { SCL=1; delay(); SDA=1; delay(); }
(2) 启动信号
void start() //SCL在高电平期间,SDA一个下降沿启动信号。 {
SDA=1; delay(); SCL=1; delay(); SDA=0; delay();
}
(3) 应答信号
.v .. ..