第6章:串行总线技术概要课件.ppt
第6章 串行总线技术 一、本章主要内容:链路层通信协议、各种串行总线。二、本章重点:PC机与单片机的通信,I2C总线、SPI总线 三、本章难点:I2C总线 四、教学内容如下:第第6章串行总线技术章串行总线技术 6.1 串行通信概述串行通信概述按照数据流的方向可分为全双工、半双工和单工。第第6章串行总线技术章串行总线技术 6.1 串行通信概述串行通信概述按照数据流的方向可分为全双工、半双工和单工。串行通信按通信双方是否用同一个时钟,分同步通信和异步通信 发信方 收信方 发信方 收信方 第第6章串行总线技术章串行总线技术 6.1 串行通信概述串行通信概述按照数据流的方向可分为全双工、半双工和单工。串行通信按通信双方是否用同一个时钟,分同步通信和异步通信串行通信的传输速率:波特率(BaudRate)表示 每秒传送的位数(bit/s)。通信协议(链路层协议和应用层协议)之链路层协议。1、异步协议(适合于异步通信)每次通信1帧,每帧1个字符 2、同步协议(适合于同步通信):每次通信1帧(用帧头和帧尾标注1个帧),每帧若干个字符。1.异步通信协议的实例异步通信协议的实例起止式异步协议起止式异步协议 发信方 收信方 2、同步协议、同步协议(适合于同步通信适合于同步通信):每次通信每次通信1帧帧(用帧头和帧尾标注用帧头和帧尾标注1个帧个帧),每帧若,每帧若干个字符。干个字符。(1)面向字符的同步协议面向字符的同步协议 每次通信1帧(用帧头和帧尾标注1个帧),每帧若干个字符。用若干特殊字符标注一帧名名 称称ASCIIASCIIEBCDICEBCDIC序始序始(SOH)(SOH)000000100000010000000100000001文始(文始(STXSTX)000001000000100000001000000010组终组终(ETB)(ETB)001011100101110010011000100110文文终终(ETXETX)000001100000110000001100000011同步同步(SYN)(SYN)001011000101100011001000110010送送毕毕(EOT)(EOT)000010000001000011011100110111询问询问(ENQ)(ENQ)000010100001010010110100101101确确认认(ACK)(ACK)000011000001100010111000101110否否认认(NAKNAK)001010100101010011110100111101转义转义(DLE)(DLE)001000000100000001000000010000(2)面向比特的同步协议(面向比特的同步协议(SDLC/HDLC)每次通信1帧(用帧头和帧尾标注1个帧),每帧若干个字位。(1)标志场:01111110,称标志场。(2)地址场A和控制场C。地址场A用来规定与之通信的次站的地址。控制场C可规定若干个命令。(3)信息场I。I场包含有要传送的数据。并不是每一帧都必须有信息场。即数据场可以为0,当它为0时,则这一帧主要是控制命令。(4)帧校验场FC。紧跟在信息场之后的是两字节的帧校验场。16位循环冗余校验码CRC,经计算获得。除了标志场和自动插入的“0”以外,所有的信息都参加CRC计算。实际应用时的两个技术问题:(1)“0”位插入/删除。协议规定以01111110为标志,但在信息场中也完全有可能有同一种模式的字符,为了把它与标志区分开来,所以采取了“0”位插入和删除技术:发送端在发送所有信息(除标志字节外)时,只要遇到连续5个“1”,就自动插入一个“0”。接收端在接收数据时(除标志字节)如果连续收到5个“1”,就自动将其后的一个“0”删除,以恢复信息的原有形式。这种“0”位的插入和删除过程是由硬件自动完成的。实际应用时的两个技术问题:(1)“0”位插入/删除。(2)异常结束。若在发送过程中出现错误,则协议常用异常结束字符使本帧作废。在HDLC中,7个连续的“1”被作为失效字符。在SDLC中,8个连续的“1”被作为失效字符。在两帧之间,发送器可以连续输出标志字符序列,也可以输出连续的高电平,它被称为空闲(Idle)信号。6.2 串行通信串行通信RS系列总线标准及其接口系列总线标准及其接口6.2.1 RS-232C标准接口总线标准接口总线 机械标准:控制信号线的定义。电气标准:-5V-15V规定为“1”+5V+15V规定为“0”。6.2.3 单片机与单片机与PC机之间的通信机之间的通信 单片机内部的串行口可以作为通信接口,利用该串行口与PC机的COM口进行串行通信:将单片机采集的数据传送到PC机中,由PC机的高级语言或数据库语言对数据进行整理及统计等复杂处理就能满足实际的应用需要。1、硬件连接 PC机的COM口,输入输出为RS-232C电平,而51单片机串行口的输入输出均为TTL电平,必须进行电平转换。2、软件设计 初始化 PC机和单片机在进行通信时,首先分别对各自的串行口进行初始化、确定串行口工作方式、设定波特率(两者应设置一致)、传输数据长度等。数据传输。1)PC机通信软件的设计机通信软件的设计 在Windows环境下提供了完备的API应用程序接口函数,程序员通过这些函数与通信硬件接口。初始化 通信 通信函数是中断驱动的:发送数据时,先将其放入缓存区,串口准备好后,就将其发送出去;传来的数据迅速申请中断,使Windows接收它并将其存入缓冲区,以供读取。接收 查询方式时:CPU要不断测试串口是否有数据,以防接收串口数据时出现错误、效率低;中断方式:一旦有数据传至,CPU终止当前任务,由中断服务程序完成操作。因此,中断方式具有效率高、接收准确、编程简单等特点。(1)打开串口。可使用CreateFile()函数,其格式如下:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,DWORD LPSECURITY_ ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribute,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );(1)打开串口。可使用CreateFile()函数,其格式如下:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,DWORD LPSECURITY_ ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribute,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );(2)设置串口。设置串口可以分两步完成。首先用BuildCommDCB()函数修改DCB(串行通信设备控制块)结构,然后用SetCommState()函数将DCB结构写到打开的串口,便完成了串口的设置。(1)打开串口。可使用CreateFile()函数,其格式如下:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,DWORD LPSECURITY_ ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribute,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );(2)设置串口。设置串口可以分两步完成。首先用BuildCommDCB()函数修改DCB(串行通信设备控制块)结构,然后用SetCommState()函数将DCB结构写到打开的串口,便完成了串口的设置。BuildCommDCB()函数使用格式如下:BOOL BuildCommDCB(LPCTSTR lpDef,LPDCB lpDCB );如果该函数调用成功,则返回值为TRUE;否则返回值为FALSE。(1)打开串口。可使用CreateFile()函数,其格式如下:HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwSharedMode,DWORD LPSECURITY_ ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribute,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile );(2)设置串口。设置串口可以分两步完成。首先用BuildCommDCB()函数修改DCB(串行通信设备控制块)结构,然后用SetCommState()函数将DCB结构写到打开的串口,便完成了串口的设置。BuildCommDCB()函数使用格式如下:BOOL BuildCommDCB(LPCTSTR lpDef,LPDCB lpDCB );如果该函数调用成功,则返回值为TRUE;否则返回值为FALSE。SetCommState()函数使用格式如下:BOOL SetCommState(HANDL EhFile,LPDCB lpDCB );(3)设置缓冲区大小。如果程序需要重新分配发送和接收缓冲区,则使用SetupComm()函数。(4)清除缓冲区。可使用PurgeComm()函数。(5)从串口接收数据。可使用ReadFile()函数。(6)从串口发送数据。可使用WriteFile()函数。(7)关闭串口。可使用CloseHandle()函数。编写Win32 串行通信程序的基本步骤是:使用CreateFile()函数获得串口句柄;使用BuildCommDCB()和SetCommState()函数设置串口工作状态;可根据需要选择相应的结构和函数进行其它设置。如重新设置发送接收缓冲区可使用SetupComm()函数;设置超时则可修改COMMTIMEOUTS结构并使用SetCommTimeouts()函数等;使用ReadFile()和WriteFile()函数读写串口;串行通信结束时,使用CloseHandle()函数关闭串口以释放控制权,使串口可以被其它的程序使用。2.单片机收发软件设计单片机收发软件设计 设计单片机的通信软件,实际上是对单片机的串行口的设计,通常采用汇编语言来设计。首先必须设置串行通信方式(SCON)和波特率(PCON)。汇编程序如下所示:(1)发送程序的设计。TRT:MOV SCON,#50H ;初始化方式1,波特率为F/32 MOV PCON,#80H MOV R0,#50H MOV R7,#10H ;发送16个字节LOOP:MOV A,R0 MOV C,P ;发送的第9数据位 MOV TB8,C MOV SBUF,A ;数据给SBUF,启动发送WAIT:JBC TI,CONT ;判断发送中断标志 SJMP WAITCONT:INC R0 DJNZ R7,LOOP RET (2)接收程序的设计。RVE:MOV TMOD,#20H ;初始化定时器T1方式2 MOV TH1,#0F4H ;定时器T1赋初值 MOV TL1,#0F4H SETB TR1 MOV R0,#50H MOV R7,#10H ;接收长度16个字节 MOV SCON,#0D0H ;串行口化方式3,接收 MOV PCON,#00H ;置SMOD=0WAIT0:JBC RI,PRI SJMP WAIT0PRI:MOV A,SBUF JNB P,PNP JNB RB8,ERROR ;转出错处理 SJMP RIGHTPNP:JB RB8,ERROR ;转出错处理RIGHT:MOV R0,A ;数据到缓冲器 INC R0 DJNZ R7,WAIT0 ;判断数据是否接收结束 CLR REN ;清接收标志 RETERROR:(略)6.2.4 PC机与多个单片机间的通信机与多个单片机间的通信 1.PC机与多个单片机通信电路 PC机与多个单片机通信,不能采用点对点的RS-232C标准,要采用一点对多点的RS-485标准等,要将PC机RS-232C接口转换成RS-485接口:2.PC机与多个单片机通信协议 要保证串行通信的可靠进行要保证串行通信的可靠进行,在相互通信时在相互通信时,必须有一套严格的必须有一套严格的通信协议。一般称为应用层通信协议。一般包含:通信协议。一般称为应用层通信协议。一般包含:帧头标志;地址:主机/从机地址、广播地址;命令:点对点命令和广播命令两大类。长度;数据;校验;帧尾标志。2.PC机与多个单片机通信协议 要保证串行通信的可靠进行要保证串行通信的可靠进行,在相互通信时在相互通信时,必须有一套严格的必须有一套严格的通信协议。一般称为应用层通信协议。一般包含:通信协议。一般称为应用层通信协议。一般包含:帧头标志;地址:主机/从机地址、广播地址;命令:点对点命令和广播命令两大类。点对点命令主要是数据和命令传输;广播命令主要是参数设置,广播招故障等。广播招故障命令一般是有故障的节点应答,无故障的节点不应答,设计时应注意采用举手排队机制应答;否则,多节点同时应答就会有冲突,这一点应特别注意。长度;数据;校验;帧尾标志。2.PC机与多个单片机通信协议 要保证串行通信的可靠进行要保证串行通信的可靠进行,在相互通信时在相互通信时,必须有一套严格的必须有一套严格的通信协议。一般称为应用层通信协议。一般包含:通信协议。一般称为应用层通信协议。一般包含:帧头标志;地址:主机/从机地址、广播地址;命令:点对点命令和广播命令两大类。点对点命令主要是数据和命令传输;广播命令主要是参数设置,广播招故障等。广播招故障命令一般是有故障的节点应答,无故障的节点不应答,设计时应注意采用举手排队机制应答;否则,多节点同时应答就会有冲突,这一点应特别注意。长度;数据;校验;帧尾标志。通信分为三个阶段:呼叫、握手阶段,发送通信分为三个阶段:呼叫、握手阶段,发送/接收阶段,结束接收阶段,结束阶段。阶段。3.上位机软件设计 实现PC机的串行通信通常有以下几种方法,一是利用嵌入式汇编语言编写串行口读写函数,在通信程序中直接调用这些函数,这种方法的优点是代码效率高,通信速度快,但需要掌握较深的汇编语言知识;3.上位机软件设计 实现PC机的串行通信通常有以下几种方法,一是利用嵌入式汇编语言编写串行口读写函数,在通信程序中直接调用这些函数,这种方法的优点是代码效率高,通信速度快,但需要掌握较深的汇编语言知识;二是利用Windows 提供的API函数完成与硬件接口的通信,优点是可以开发出各种通信软件,但编程复杂,需要掌握大量的通信知识;3.上位机软件设计 实现PC机的串行通信通常有以下几种方法,一是利用嵌入式汇编语言编写串行口读写函数,在通信程序中直接调用这些函数,这种方法的优点是代码效率高,通信速度快,但需要掌握较深的汇编语言知识;二是利用Windows 提供的API函数完成与硬件接口的通信,优点是可以开发出各种通信软件,但编程复杂,需要掌握大量的通信知识;三是利用第三方串口通信控件来实现,如免费的SPComm 控件、Visual Basic 中的MSComm 控件、TurboPower 公司的APRO 通信组件等,优点是使用方便简单,可以加快应用程序的开发,但如果不提供组件的源代码,功能难以扩展。4.单片机软件设计 (1)设置通信方式和波特率。MOV SCON,#50H ;初始化串口设为方式1MOV TMOD,#20H ;利用定时器利用定时器1为波特率发生器并设为模式为波特率发生器并设为模式2MOV PCON,#XXH ;设置SMOD值MOV TH1,#XXH ;设置定时器初始值SETB TR1 ;启动定时器1 4.单片机软件设计 (1)设置通信方式和波特率。MOV SCON,#50H ;初始化串口设为方式1MOV TMOD,#20H ;利用定时器利用定时器1为波特率发生器并设为模式为波特率发生器并设为模式2MOV PCON,#XXH ;设置SMOD值MOV TH1,#XXH ;设置定时器初始值SETB TR1 ;启动定时器1 (2)单片机通信协议处理程序设计。单片机等待接收PC机发来的信号帧并按通信协议作出相应响应。(2)单片机通信协议处理程序设计。单片机等待接收PC机发来的信号帧并按通信协议作出相应响应。例如:6.3.1 SPI总线简介总线简介 通信结构如图:通信结构如图:通信中有一个主机(Master),多个从机(Slave)。SPI总线是一种三线同步总线:1、MISO(Data line):Master Input Slave Output 6.3.1 SPI总线简介总线简介 通信结构如图:通信结构如图:通信中有一个主机(Master),多个从机(Slave)。SPI总线是一种三线同步总线:1、MISO(Data line):Master Input Slave Output 2、MOSI(Data line):Master Output Slave Input 6.3.1 SPI总线简介总线简介 通信结构如图:通信结构如图:通信中有一个主机(Master),多个从机(Slave)。SPI总线是一种三线同步总线:1、MISO(Data line):Master Input Slave Output 2、MOSI(Data line):Master Output Slave Input 3、SCK(Clock line):Master Output Slave Input 主机在主机在SCK的上升沿,从的上升沿,从MO线输出数据;线输出数据;从机在从机在SCK的下降沿,从的下降沿,从SI线采样(输入)数据;线采样(输入)数据;SCK/SCKMOSI 从机在从机在SCK的上升沿,从的上升沿,从SO线输出数据;线输出数据;主机在主机在SCK的下降沿,从的下降沿,从MI线采样(输入)数据;线采样(输入)数据;主机在主机在SCK的上升沿,从的上升沿,从MO线输出数据;线输出数据;从机在从机在SCK的下降沿,从的下降沿,从SI线采样(输入)数据;线采样(输入)数据;SCK/SCKMISOSCK/SCKMOSI6.4 I2C总线I2C简介 I2C总线用于IC器件之间的通信,它由两根线构成:1、SDA(串行数据线)2、SCL(串行时钟线)I2C总线接口均为开漏或开集电极输出,因此需要为总线增加上拉电阻Rp。I2C总线时序 在数据传送过程中,必须确认数据传送的开始和结束,这通过起始和结束信号识别。起始信号结束信号SDASCLSPI2C总线时序 I2C总线数据传送时,每传送一个字节数据后接收方都必须有应答信号(A=0)。主控器接收数据时,如果要结束通信时,将在停止位之前发送非应答信号(=1)应答:发送器每发送完一个字节,将数据线应答:发送器每发送完一个字节,将数据线SDA拉高,由主控制拉高,由主控制器产生第器产生第9个脉冲,个脉冲,接收器将接收器将SDA拉低,以此作为接收器对发送器拉低,以此作为接收器对发送器的应答。的应答。发送器在第发送器在第9个脉冲探测个脉冲探测SDA为低,表明接收器已成功接为低,表明接收器已成功接收到发送器发送的一个字节,可以继续进行后面的通信。收到发送器发送的一个字节,可以继续进行后面的通信。8D791D0SDA .SCL 规定每次发送到规定每次发送到SDA上的数据必须是一个字节,每次发送的字节上的数据必须是一个字节,每次发送的字节数量不限。数量不限。每发送一个字节后,每发送一个字节后,收方必须回一个应答。收方必须回一个应答。如果从器件接收一字节后需要时间对当前数进行处理,如果从器件接收一字节后需要时间对当前数进行处理,从器件将从器件将保持保持SCL为低电平。从器件释放时钟线为低电平。从器件释放时钟线SCL后后,主器件才可以继续,主器件才可以继续发数据。(此步可有可无)发数据。(此步可有可无)8D791D0SDA .SCL S从器件地址 R/W第一字节 发送起始信号后传送的第一字节数据具有特别的意义,其中前七位为从机地址,最后一位为读写方向位(0表示写,1表示读)。P1.0P1.1SDASCL主方发送(设P1.0,P1.1原输出为1)SDA bit P1.0 SCL bit P1.1CLR SDANOPCLR SCLMOV R7,#8LOOP:RLC AMOV SDA,CSETB SCLNOPCLR SCLDJNZ R7,LOOP SETB SDASETB SCLNOPJB SDA,ERRORCLR SCL.CLR SDASETB SCLSETB SDA8D791D0SDA(P1.0).SCL(P1.1)P1.0P1.1SDASCL 单片机为从方接收SDA bit P1.0 SCL bit P1.1 MOV R7,#8L1:JNB SCL,$JNB SDA,L1LB:JNB SDA,L2 JNB SCL,L1SJMP LBL2:JB SCL,$JNB SCL,$MOV C,SDARLC ADJNZ R7,L2 CLR SDAJNB SCL,$JB PSCL,$SETB P1.0.8D791D0SDA(P1.0).SCL(P1.1)P1.0P1.1SDASCL 单片机为从方接收SDA bit P1.0 SCL bit P1.1 MOV R7,#8L1:JNB SCL,$JNB SDA,L1LB:JNB SDA,L2 JNB SCL,L1SJMP LBL2:JB SCL,$JNB SCL,$MOV C,SDARLC ADJNZ R7,L2 CLR SDAJNB SCL,$JB PSCL,$SETB P1.0.8D791D0SDA(P1.0).SCL(P1.1)2.I2C E2PROM芯片24C02 (1)概述。串行EEPROM,相关的操作有字节写、页写、现行地址读、随机读和序列读等方式。实现字节写的时序为:S 1 0 1 0 A2 A1 A0 0 A addr A data A PS起始信号;1010为器件型号地址;A2A1A0页地址(器件地址);0为写操作;A应答信号:肯定时应答信号为低电平,否定时应答信号为高平;addr地址字节,指定片内操作单元地址。Data为数据字节,由主节点出发,从节点接收;P停止信号 S 1 0 1 0 A2 A1 A0 0 A addr A data A PS起始信号;1010为器件型号地址;A2A1A0页地址(器件地址);0为写操作;A应答信号:肯定时应答信号为低电平,否定时应答信号为高平;addr地址字节,指定片内操作单元地址。Data为数据字节,由主节点出发,从节点接收;P停止信号 如将数据#55H写入20H单元的时序为:随机读是按指定地址读出一个单元的数据,其时序为:如将30H单元中的数(#10H)读出的时序为:为为0时时的的写写模模式式为为0时时的的读读模模式式写写周周期期用用ACK轮轮询询流流程程(2)程序设计。/*/*头文件调用*/#pragma code debug small#include#include#include#include/*/*参数定义*/#define uchar unsigned char#define uint unsigned intsbit SCL=P16;/*SCL=P1.6*/sbit SDA=P17;/*SDA=1.7*/sbit K0=P13;/*K0=P1.3*/uchar E24_State;void sdelay()/*延时函数*/uint x=200;while(-x);void sdelay1()/*延时函数1*/uint x=1;while(-x);void time10ms(char num)/*延时10ms函数*/uint lp;uchar i;for(i=0;i=num;i+)lp=200;while(-lp);/*开始条件函数*/void start()SCL=0;SDA=1;SCL=1;sdelay1();SDA=0;sdelay1();SCL=0;/*结束条件函数*/void endd()SCL=0;SDA=0;SCL=1;sdelay1();SDA=1;sdelay1();SCL=0;主器件读/*读8bit函数*/char rbyte(char ask_flag)uchar x,lp;x=0;for(lp=0;lp8;lp+)SCL=0;SDA=1;/*输入前先将SDA置“1”*/sdelay1();SCL=1;x=(x1)|SDA;SCL=0;if(ask_flag)SDA=0;/*master ask */else SDA=1;/*master no ask*/SCL=1;return(x);SDA(P1.0).SCL(P1.1)8D791D0/*写8bit函数*/void wbyte(char p)uchar i;for(i=0;i8;i+)SCL=0;SDA=p&0 x80;p=1;SCL=1;SCL=0;/*extra 9th pulse*/SDA=1;/*set SDA input */SCL=1;i=255;while(SDA&-i)/*等待从机应答*/if(!i)E24_State|=0 x1;/*从机无应答,置标识*/SCL=0;8D791D0SDA(P1.0).SCL(P1.1)char read_byte(char adr)/*读1个字节函数*/uchar x;start();wbyte(0 xa0);wbyte(adr);start();wbyte(0 xa1);x=rbyte(0);endd();return(x);读读1个字节函数个字节函数void write_byte(char adr,char num)/*写1个字节函数*/start();wbyte(0 xa0);wbyte(adr);wbyte(num);endd();time10ms(0);写写1个字节函数个字节函数