1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,12,章 单片机的串行扩展技术,单片机的,并行总线扩展,已不再是单片机系统,唯一的扩展结构,,近年来又出现了,串行总线扩展技术,。,串行扩展方式主要有,:,(1),PHILIPS,公司,的,I,2,C,(,Inter Interface Circuit,)总线、,(2),DALLAS,公司,的,单总线,(,1-Wire,),(3),Motorola,公司,的,SPI,串行外设接口。,单片机的串行扩展技术与并行扩展技术相比具有显著的优点,接口时,需要的,I/O,口线很少(仅需,1,4,条),,串行接口器件
2、体积小,因而,占用电路板的空间小,,串行扩展技术在,IC,卡、智能仪器仪表以及分布式控制系统等领域得到了广泛的应用。,12.1,单总线接口简介,单总线(,1-Wire bus,),是由,DALLAS,公司,推出的外围串行扩展总线。它只有一条数据输入,/,输出线,DQ,,总线上的所有器件都挂在,DQ,上,电源也通过这条信号线供给,这种使用一条信号线的串行扩展技术,称为,单总线,技术。,各种器件,,由,DALLAS,公司提供的专用芯片实现。,每个芯片都有,64,位,ROM,,厂家对每一个芯片用激光烧写编码,其中存有,16,位,十进制,编码序列号,,它是,器件的地址编号,,确保它挂在总线上后,可以唯
3、一被确定。除了器件的地址编码外,芯片内还包含收发控制和电源存储电路,如,图,12-1,所示。,SETB P1.,在终止信号出现后,总线就处于空闲状态。,(3)发送应答位/“0”,MOV A,R2;,SCL线上的时钟信号对SDA,WLP:RLC A;A左移,发送位进入C,6;SCL=1,使SDA数据线上的数据有效,主器件采用89C51,晶振频率为6MHz(即机器周期为2ms),对图12-11中的几个典型信号的模拟子程序如下。,使用条线:串行时钟SCK,主器件输入/从器件输出数据线MISO(简称SO),主器件输出/从器件输入数据线MOSI(简称SI)和从器件选择线。,接在总线上的智能器件,如单片机
4、或其他微处理器能识别这个地址,并与之传送数据。,引脚地址(A2、A1、A0)是由I2C总线外围器件所指定的地址端口,A2、A1、A0在电路中接高电平、接地或悬空,形成地址编码。,MAXIM公司的MAX127/128(A/D)和MAX517/518/519(D/A),ATMEL公司的AT24C系列存储器等。,其中,SLAR为寻址字节(读),Data1Data n为从器件被读出的n个数据字节。,6;子程序结束,使SCL=0,从器件内部的n个数据地址,由器件设计者在该器件的I2C总线数据操作格式中,指定第一个数据字节作为器件内的单元地址指针,并且设置地址自动加减功能,以减少地址的寻址操作。,图,12
5、1,这些芯片的,耗电量都很小,(空闲时几,W,,工作时几,mW,),工作时从总线上,馈送电能到大电容中,就可以工作,故,一般不需另加电源,。,图,12-2,为一个由单总线构成的,分布式温度监测系统,。多个带有单总线接口的数字温度计和多个集成电路,DS1820,芯片都挂在,DQ,总线上。单片机对每个,DS1820,通过总线,DQ,寻址。,DQ,为漏极开路,须加上拉电阻。,DALLAS,公司为单总线的寻址及数据的传送提供了,严格的时序规范,,具体内容读者可,查阅相关资料,。,图,12-2,12.2 SPI,总线接口简介,SPI,(,Serial Periperal Interface,),是,M
6、otorola,公司,推出的,同步串行外设接口,,允许单片机与多个厂家生产的带有该接口的设备直接连接,以串行方式交换信息。,使用,条线,:串行时钟,SCK,,主器件输入,/,从器件输出数据线,MISO,(简称,SO,),主器件输出,/,从器件输入数据线,MOSI,(简称,SI,)和,从器件选择线,。,SPI,的典型应用是,单主系统,。该系统只有一台主器件,从器件通常是外围接口器件,如存储器、,I/O,接口、,A/D,、,D/A,、键盘、日历,/,时钟和显示驱动等。,图,12-3,是,SPI,外围串行扩展结构图。,图,12-3,单片机与外围器件在时钟线,SCK,、数据线,MISO,和,MOSI,
7、都是,同名端相连。,扩展多个外围器件时,,SPI,无法通过数据线译码选择,故接口的外围器件都有片选端。在,扩展单个,SPI,器件,时,外围器件的片选端可以接地或通过,I/O,口控制;在,扩展多个,SPI,器件,时,单片机应分别通过,I/O,口线来分时选通外围器件。,在,SPI,串行扩展系统中,如果某一从器件,只作输入,(如键盘)或,只作输出,(如显示器)时,,可省去一条数据输出,(,MISO,)或一条数据输入(,MOSI,),从而,构成双线系统(接地)。,SPI,系统中从器件的选通依靠其引脚,数据传送软件十分简单,,省去了传输时的地址选通字节。,但在扩展器件较多时,连线较多。,在,SPI,串行
8、扩展系统中,作为主器件的单片机在启动一次传送时,便,产生,8,个时钟,,传送给接口芯片,作为同步时钟,,控制数据的输入和输出。数据的传送格式是高位(,MSB,)在前,低位(,LSB,)在后,如,图,12-4,所示。,数据线上输出数据的变化以及输入数据时的采样,都取决于,SCK,。但对于不同的外围芯片,有的可能是,SCK,的上升沿起作用,有的可能是,SCK,的下降沿起作用。,图,12-4,SPI,有,较高的数据传输速度,,最高,可达,。,Motorola,公司,为广大用户提供了一系列具有,SPI,接口的单片机和外围接口芯片,如存储器,MC2814,,显示驱动器,MC14499,和,MC14489
9、等芯片。,SPI,外围串行扩展系统的,主器件,是,单片机,,也可以不带,SPI,接口,,但是,从器件,一定要有,具有,SPI,接口,。,12.3 I,2,C,串行总线的组成及工作原理,I,2,C,(,Inter Interface Circuit,)是,PHILIPS,公司推出的一种串行总线。目前,使用较广泛,的芯片间串行扩展总线,也是,很有发展前途,的芯片间串行扩展总线。该总线,用,两条连线,实现全双工同步数据传送,。,它可以使具有,I,2,C,总线的单片机,(如,PHILIPS,公司的,8xC552,),直接与具有,I,2,C,总线接口的各种扩展器件,(如存储器、,I/O,口、,A/D,
10、D/A,、键盘、显示器、日历,/,时钟),连接,。,对不带有,I,2,C,接口的单片机,(如,89C51,)可采用普通的,I/O,口结合,软件模拟,I,2,C,串行接口总线时序,的方法,完成,I,2,C,总线的串行接口功能。,I,2,C,串行总线概述,只有,两条,信号线,,一条是,数据线,SDA,,另一条是,时钟线,SCL,,所有连接到,I,2,C,总线上器件的数据线都接到,SDA,线上,各器件的时钟线均接到,SCL,线上,,系统的基本结构,如,图,12-5,所示。,图,12-5,I,2,C,的运行由主器件控制,主器件是指启动数据的发送(发出起始信号)、发出时钟信号、传送结束时发出终止信号
11、的器件。,主器件,可以具有,I,2,C,总线接口,也可以不带,I,2,C,总线接口。,从器件,可以是存储器、,LED,或,LCD,驱动器、,A/D,或,D/A,转换器、时钟,/,日历器件等,从器件,必须带有,I,2,C,总线接口,。,I,2,C,串行总线的,SDA,和,SCL,是双向的,带有,I,2,C,总线接口的器件的,输出端为漏级开路,,故,必须通过上拉电阻接正电源,(见图,12-5,中的两个电阻)。,总线空闲时,两条线均为高电平。由于连接到总线上的器件的输出级必须是漏级或集电极开路的,只要有一个器件输出低电平,都将使总线上的信号变低。,SCL,线,上的时钟信号对,SDA,线上的各器件间的
12、数据传输起同步控制作用。,SDA,线上的数据起始、终止及数据的有效性均要根据,SDA,线上的时钟信号来判断。,标准,I,2,C,普通模式,,数据的传输速率为,100kb/s,,,高速模式,可达,400kb/s,。,总线上,扩展器件的数量,不是由电流负载决定,而是,由电容负载,确定。,I,2,C,总线上每个节点器件的接口都有一定的等效电容,连接的器件越多,电容值越大,这会造成信号传输的延迟。,总线上允许的器件数以总线上的电容量不超过,400pF,(,通过驱动扩展可达,4000pF,),据此可计算出总线长度及连接器件的数量。每个连到,I,2,C,总线上的器件都有一个唯一的地址,扩展器件时同时也要受
13、器件地址数目的限制。,I,2,C,总线系统,允许多主器件,,为避免混乱,某一时刻究竟由哪一台主器件来控制总线要通过,总线仲裁,来决定。读者可,查阅,I,2,C,总线的仲裁协议,。当然,经常遇到的是以单片机为主器件,其他外围接口器件为从器件的单主器件情况。,12.3.2 I,2,C,总线的数据传送,1,数据位的有效性规定,在,I,2,C,总线上,每一数据位的传送都与时钟脉冲相对应,逻辑“,0”,和逻辑“,1”,的信号电平取决于相应电源,V,CC,的电压。,I,2,C,总线在,进行数据传送,时,,时钟线为高电平,期间,数据线上的数据必须保持稳定,只有在,时钟线为低电平,期间,数据线上的高电平或低电
14、平状态才允许变化,如,图,12-6,所示。,根据,I,2,C,总线协议,总线上,数据传送的信号由起始信号(,S,)、终止信号(,P,)、应答信号(,A,)、非应答信号()以及总线数据位,组成,。,图,12-6,(,1,)起始信号(,S,)。,在,SCL,线,为高电平期间,,SDA,线,由高电平向低电平的变化表示起始信号,只有在起始信号以后,其他命令才有效。,(,2,)终止信号(,P,)。,在,SCL,线,为高电平期间,,SDA,线,由低电平向高电平的变化表示终止信号。随着终止信号的出现,所有外部操作都结束。,起始和终止信号都是由主器件发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号
15、出现后,总线就处于空闲状态。起始信号和终止信号如,图,12-7,所示。,图,12-7,若连接到,I,2,C,总线上的器件,具有,I,2,C,总线的硬件接口,,则很容易检测到起始和终止信号。,对于,不具备,I,2,C,总线硬件接口,的有些单片机(如,89C51,),为了检测起始和终止信号,必须保证在每个时钟周期内对数据线,SDA,取样两次。,图,12-8,2,I,2,C,总线上数据字节的传送与应答,数据传送时,,传送的字节数(数据帧)没有限制,,但是每一字节必须是,8,位,长度。,先传送最高位,(,MSB,),每一个被传送的字节后面都,必须跟随,1,位应答位(即一帧共有,9,位),,见,图,12
16、8,。,接收器件收到一个完整的数据字节后,,有可能需要完成一些其他工作(如从器件正在进行实时性的处理工作而无法接收总线上的数据),不需要立刻接收下一字节,这时接收器件可以将,SCL,线拉成低电平,从而使主器件处于等待状态。直到接收器件准备好接收下一个字节时,再释放,SCL,线使之为高电平,从而使数据传送可以继续进行。,如果主器件对从器件进行了应答,但在数据传送一段时间后无法继续接收更多的数据,从器件可以通过对无法接收的第一个数据字节的“非应答”通知主器件,主器件则应发出终止信号以结束数据的继续传送。,当主器件接收数据时,它收到从器件发出的最后一个数据字节后,必须向主器件发出一个结束传送的信号
17、这个信号是由对从器件的“非应答”来实现的。然后,从器件释放,SDA,线,以允许主器件产生终止信号。,I,2,C,总线上应答与非应答信号见,图,12-8,。,3,I,2,C,总线总线上的数据传送过程,(,1,),I,2,C,总线总线的寻址,寻址字节,I,2,C,总线传送的数据信号既包括地址信号,又包括真正的数据信号。,I,2,C,总线,所有扩展器件都有地址,。地址由,7,位组成,第,8,位是数据的传送方向位(,R/W,*,),用“,0”,表示主器件发送数据(,W,*,),“,1”,表示主器件接收数据(,R,)。这,8,位共同构成了,I,2,C,总线器件的寻址字节。,寻址字节的格式,:,器件地址
18、DA3,、,DA2,、,DA1,、,DA0,)是,I,2,C,总线外围器件固有的地址编码,器件出厂时就已经给定。,引脚地址,(,A2,、,A1,、,A0,)是由,I,2,C,总线外围器件所指定的地址端口,,A2,、,A1,、,A0,在电路中接高电平、接地或悬空,形成地址编码。,数据方向位(,R/W,*,)规定了总线上的单片机(主器件)与外围器件(从器件)的数据传送方向。,R/W,*,=1,,表示接收(读)。,R/W,*,=0,,表示发送(写)。,寻址字节中的特殊地址,I,2,C,总线规定了一些特殊地址。其中两组固定地址编号,0000,和,1111,已被保留作为特殊用途,如,表,12-1,
19、所示。,起始信号后,的,第,1,字节,的,8,位为“,0000 0000”,,称为,通用呼叫地址,,即用于寻访接到,I,2,C,总线上所有器件的地址。不需要从通用呼叫地址命令获取数据的器件可以不响应通用呼叫地址。否则,接收到这个地址后应作出应答,并把自己置为从器件接收器方式,以接收随后的各字节数据。,另外,当遇到不能处理的数据字节时,不作应答,,否则收到每个字节后都应作应答。,通用呼叫地址的含义,在第,2,字节中,加以说明。,格式如下,:,第,2,字节为,06H,时,,所有能响应通用呼叫地址的从器件复位,并由硬件装入从器件地址的可编程部分。能响应命令的从器件器件复位时不拉低,SDA,和,SCL
20、线,以免堵塞总线。,第,2,字节为,04H,时,,所有能响应通用呼叫地址并通过硬件来定义其可编程地址的从机器件将锁定地址中的可编程位,但不进行复位。,如果第,2,字节的方向位,B,为“,1”,,则这两个字节命令称为,硬件通用呼叫命令,。也就是说,这是由“硬件主器件”发出的。所谓硬件主器件,就是不能发送所要寻访从件地址的发送器,如键盘扫描器等。这种器件在制造时无法知道信息应向哪儿传送,所以它发出硬件呼叫命令时,在第,2,字节的高,7,位说明自,己的地址。接在总线上的智能器件,如单片机或其他微处理器能识别这个地址,并与之传送数据。硬件主器件作为从器件使用时,也用这个地址作为从器件地址。,格式为,
21、在系统中另一种选择可能是系统复位时硬件主器件工作在从器件接收方式,这时由系统中的主器件先告诉硬件主器件数据应送往的从器件的地址。当硬件主器件要发送数据时,就可以直接向指定从器件发送数据了。,(,2,)数据传送格式,I,2,C,总线上每传送一位数据都与一个时钟脉冲相对应,传送的每一帧数据均为一字节。但启动,I,2,C,总线后传送的字节数没有限制,只要求每传送一个字节后,对方回答一个应答位。,在时钟线为高电平期间,,数据线的状态就是要传送的数据。数据线上数据的改变必须在时钟线为低电平期间完成。,在数据传输期间,,只要时钟线为高电平,数据线都必须稳定,否则数据线上的任何变化都当作起始或终止信号。,I
22、2,C,总线数据传送是必须遵循规定的数据传送格式。,图,12-9,为一次完整的数据传送应答时序。,图,12-9,根据总线规范,起始信号表明一次数据传送的开始,,其后为寻址字节,。在寻,址字节后是按指定读、写的数据字节与应答位,。在,数据传送完成后主器件都必须发送,停止信号,。在起始与停止信号之间传输的数据字节数由单片机决定,理论上讲没有字节限制。,其中,,SLAR,为寻址字节(读),,Data1,Data,n,为从器件被读出的,n,个数据字节。主器件发送停止信号前应发送非应答信号,向从器件表明读操作要结束。,主器件的读,/,写操作。,在一次数据传送过程中需要改变传送方向的操作,此时起始位和寻
23、址字节都会重复一次,但两次读,/,写方向正好相反。,数据传送格式如下:,其中,,Sr,为重复起始信号,寻址字节的方向位决定了数据字节的传送方向;,SLAW/R,和,SLA R/W,分别表示写,/,读寻址字节或读,/,写读寻址字节。,从上述数据传送格式可以看出:,无论何种数据传送格式,寻址字节都由主器件发出,数据字节的传送方向则遵循寻址字节中的方向位的规定。,寻址字节只表明了从器件的地址及传送方向。从器件内部的,n,个数据地址,由器件设计者在该器件的,I,2,C,总线数据操作格式中,指定第一个数据字节作为器件内的单元地址指针,并且设置地址自动加减功能,以减少地址的寻址操作。,每个字节传送都必须有
24、应答信号(,A/A,*,)相随。,I,2,C,总线从器件在接收到起始信号后都必须释放数据总线,使其处于高电平,以便对将要开始的从器件地址的传送进行预处理。,12.4 89C51,单片机扩展,I,2,C,总线器件的接口设计,随着微电子技术的发展,许多公司,如,PHILIPS,、,Motorola,、,ATMEL,和,MAXIM,等,都推出许多带有,I,2,C,总线接口的单片机及各种外围器件,如,:,存储器、,A/D,转换器、,D/A,转换器、,LED,及,LCD,驱动器、日历时钟电路(且带有,2568RAM,),如,PHILIPS,公司,的,PCF8553,(和,PCF8570,(,2568RA
25、M,)等。,MAXIM,公司,的,MAX127/128,(,A/D,)和,MAX517/518/519,(,D/A,),,ATMEL,公司,的,AT24C,系列存储器等。,I,2,C,总线系统中的主器件通常由单片机来担当,它可以具有,I,2,C,总线接口,也可以不带,I,2,C,总线接口。从器件必须带有,I,2,C,总线接口。对于,89C51,单片机,没有配置,I,2,C,总线接口,这时可以利用通用并行,I/O,口线模拟,I,2,C,总线接口的时序,使,89C51,单片机不受没带,I,2,C,总线接口的限制。,因此,在许多单片机应用系统中,都将,I,2,C,总线的模拟传送,技术作为,常规的设计
26、方法,。,下面介绍,89C51,单片机扩展,I,2,C,总线器件的硬件接口设计,然后介绍用,89C51,I/O,口结合软件模拟,I,2,C,总线数据传送,以及数据传送模拟通用子程序的设计。,12.4.1 I,2,C,总线器件的扩展接口电路,89C51,单片机的,I,2,C,总线扩展的硬件接口设计比较简单。,图,12-10,为一个,89C51,单片机与具有,I,2,C,总线接口器件的扩展电路。,图中,,AT24C02,为,E2PROM,芯片,,PCF8570,为静态,2568RAM,。,PCF8574,为,8,位,I/O,口,,SAA1064,为,4,位,LED,驱动器。虽然各种器件的原理和功能
27、有很大的差异,但它们与,89C51,的连接是相同的。各种器件的工作原理和用法见有关资料。,图,12-10,12.4.2 I,2,C,总线数据传送的模拟,89C51,单片机为单主器件的工作方式下,总线数据的传送控制比较简单,没有总线的竞争与同步,只存在单片机对,I2C,总线上各从器件的读(单片机接收)、写(单片机发送)操作。通常可利用软件实现,I,2,C,总线的数据传送,即软件与硬件结合的信号模拟。,1,典型信号模拟,为保证数据传送的可靠性,标准,I,2,C,总线的数据传送有严格的时序要求。,I,2,C,总线的起始信号、终止信号、发送“,0”,及发送“,1”,的模拟时序如,图,12-11,所示。
28、图,12-11,表,12-2,所示为,I,2,C,总线的时序特性,。由表可知,除了,SDA,、,SCL,线的信号下降时间为最大值外,其他参数只有最小值。这表明在,I,2,C,总线的数据传送中,,可以利用,时钟同步机制,展宽低电平周期,迫使主器件处于等待状态,使传送速率,降低,。,表,12-2,中的数据还为程序模拟总线信号提供了基础。假设,89C51,的晶振频率为,6MHz,,则可用两个单机器周期(,2ms,)指令“,NOP”,模拟,SCL,时钟高电平的宽度。,对于一个新的,起始信号,,要求起始前总线的空闲时间,T,BUF,大于,而对于一个重复的起始信号,要求建立时间,T,SU,:,STA,也
29、须大于。所以,,图,12-11,中起始信号适用于数据模拟传送中任何情况下的起始操作。起始信号到第一个时钟脉冲的时间间隔应大于。,对于,终止信号,,要保证有大于的信号建立时间,T,SU,:,STO,。终止信号结束时,要释放总线,使,SDA,、,SCL,维持在高电平上,在大于后才可以进行第一次起始操作。在单主器件系统中,为防止非正常传送,终止信号后,SCL,可以设置在低电平。,对于,发送应答位、非应答位,来说,与发送数据“,0”,和“,1”,的信号定时要求完全相同。只要满足在时钟高电平大于期间,,SDA,线上有确定的电平状态即可。,2,典型信号模拟子程序,主器件,采用,89C51,,晶振频率为,6
30、MHz,(即机器周期为,2ms,),对,图,12-11,中的几个典型信号的,模拟子程序,如下。,(,1,)起始信号,S,START:SETB P1.7;SDA=1,SETB P1.6;SCL=1,NOP,NOP,CLR P1.7;SDA=0,NOP;,起始信号保持,4ms,NOP,CLR P1.6;SCL=0,RET,(,2,)终止信号,P,STOP:CLR P1.7;SDA=0,SETB P1.6;SCL=1,NOP;,终止信号建立时间,NOP,SETB P1.7;SDA=1,NOP,NOP,CLR P1.7,RET,(,3,)发送应答位,/“0”,ASK:CLR P1.7;SDA=0,SE
31、TB P1.6;SCL=1,NOP,NOP,CLR P1.6;SCL=0,SETB P1.7;SDA=1,RET,(,4,)发送非应答位,/“1”,NASK:SETB P1.7;SDA=1,SETB P1.6;SCL=1,NOP,NOP,CLR P1.6;SCL=0,CLR P1.7;SDA=0,RET,2,发送,1,字节数据子程序,模拟,I,2,C,的数据线,SDA,发送,1,字节数据的子程序,调用本子程序前,将欲发送的数据送入,A,中。参考子程序如下:,S1BYTE:MOV R6,#08H;8,位数据长度送入,R6,中,WLP:RLC A;A,左移,发送位进入,C,MOV P1.7,C;,
32、将发送位送入,SDA,引脚,SETB P1.6;SCL=1,使,SDA,引脚上的数据有效,NOP,NOP,CLR P1.6;SDA,线上数据变化,DJNZ R6,WLP,RET,3,接收,1,字节数据子程序,模拟从,I,2,C,数据线,SDA,读取,1,字节数据,并存入,R2,中,程序如下,R1BYTE:MOV R6,#08H;8,位数据长度送入,R6,中,RLP:SETB P1.7;,置,SDA,数据线为输入方式,SETB P1.6;SCL=1,使,SDA,数据线上的数据有效,MOV C,P1.7;,读入,SDA,引脚状态,MOV A,R2;,RLC A;,将,C,读入,A,MOV R2,A
33、将,A,存入,R2,CLR P1.6;SCL=0,继续接收数据,DJNZ R6,RLP,RET,4,发送,n,字节数据子程序,本子程序用来模拟主器件向,I,2,C,的数据线,SDA,连续发送,n,字节数据,从器件接收。子程序的编写必须遵照,I,2,C,总线规定的读,/,写格式进行,连续发送,n,字节数据的格式如下:,其中,,SLAW,为外围器件寻址字节(写)。,本子程序,定义了,如下一些,符号单元,:,MSBUF,主器件发送数据缓冲区首地址的存放单元。,WSLA,外围器件寻址字节(写)的存放单元。,NUMBYT,发送,n,字节数据的存放单元。,在调用本程序之前,必须将寻址字节代码存放在,W
34、SLA,单元;必须将要发送的,n,字节数据依次存放在以,MSBUF,单元内容为首地址的发送缓冲区内。,调用本程序后,依次传送到外围器件内部相应的单元中。在写入过程中,外围器件的单元地址具有自动加,1,功能,即自动修改地址指针,这使传送过程大大简化。,参考子程序如下:,SNBYTE:MOV R7,NUMBYT;,发送字节数送,R7,LCALL START;,调用起始信号模拟子程序,MOV A,WSLA;,发送,SLAW,寻址字节,LCALL S1BYTE;,调用发送,1,字节子程序,LCALL CACK;,检查应答位,JBF0,SNBYTE;,为非应答位则重发,MOVR0,MSBUF;,主器件发
35、送数据缓冲区首址送,R0,SDATA:MOV A,R0;,发送数据送,A,LCALLS1BYTE;,调用发送,1,字节子程序,LCALL CACK;,检查应答位,JBF0,SNBYTE;,为非应答位则重发,INCR0;,修改地址指针,DJNZR7,SDATA,LCALL STOP;,调用发送子程序,发送结束,RET,5,读入,n,字节数据子程序,本子程序用来模拟主器件向,I,2,C,的数据线,SDA,读入,n,字节数据,从器件发送。主器件读入,n,字节数据的格式如下:,其中,,SLAR,为外围器件寻址字节(读)。,为非应答位。,本子程序,定义了如下一些符号单元,:,RSABYT,外围器件寻址字
36、节(读)存放单元。,MRBUF,主机接收缓冲区存放接收数据的首地址单元。,在调用本程序之前,必须将,寻址字节代码,存放在,RSABYT,单元。执行本子程序后,从外围器件指定首地址开始的,n,字节数据依次存放在以,MRBUF,单元内容为首地址的发送缓冲区中。外围器件的单元地址具有自动加,1,功能,即自动修改地址指针,简化了程序设计。参考子程序如下:,RNBYTE:MOVR7,NUMBYT;,读入字节数,n,存入,R7,RLP:LCALL START ;,调用起始信号模拟子程序,MOV A,RSABYT;,寻址字节送入,A,LCALL S1BYTE;,写入寻址字节,LCALL CACK;,检查应答位,JBF0,RNBYTE;,非正常应答时重新开始,MOVR0,MRBUF;,接收数据缓冲区的首址送,R0,SDATA:LCALL R1BYTE;,读入,1,字节到,A,MOV R0,A;,接收的数据存入缓冲区,DJNZR7,ACK;,n,字节未读完则跳转,ACK,LCALL NASK;,n,字节读完则发送非应答位,LCALL STOP;,调用发送停止位子程序,RET,ACK:LCALL ASK;,发送一个应答位到外围器件,INC R0;,修改地址指针,SJMP,SDATA,本章结束,






