当前位置:首页 >> 信息与通信 >>

SPI、I2C、UART串行总线协议


串口通讯通信协议........................................................................................................................... 2 串口通信.....................................................

.............................................................................. 7 RS-232 ...................................................................................................................................... 8

串口通讯通信协议
所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送 步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此, 也叫做通信控制规程, 或称传输控制规程, 它属于 ISO'S OSI 七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以 及面向字节计数三种。其中,面向字节计数的同步协议主要用于 DEC 公司的网络体系结构 中。 一、物理接口标准 1.串行通信接口的基本任务 (1)实现数据格式化:因为来自 CPU 的是普通的并行数据,所以,接口电路应具有实现不 同串行通信方式下的数据格式化的任务。 在异步通信方式下, 接口自动生成起止式的帧数据 格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。 (2)进行串-并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行 数据。 所以当数据由计算机送至数据发送器时, 首先把串行数据转换为并行数才能送入计算 机处理。因此串并转换是串行接口电路的重要任务。 (3)控制数据传输速率:串行通信接口电路应具有对数据传输速率——波特率进行选择和 控制的能力。 (4)进行错误检测:在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验 码。在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。 (5)进行 TTL 与 EIA 电平转换:CPU 和终端均采用 TTL 电平及正逻辑,它们与 EIA 采用 的电平及负逻辑不兼容,需在接口电路中进行转换。 (6)提供 EIA-RS-232C 接口标准所要求的信号线:远距离通信采用 MODEM 时,需要 9 根信号线;近距离零 MODEM 方式,只需要 3 根信号线。这些信号线由接口电路提供,以 便与 MODEM 或终端进行联络与控制。 2、串行通信接口电路的组成 为了完成上述串行接口的任务, 串行通信接口电路一般由可编程的串行接口芯片、 波特率发 生器、EIA 与 TTL 电平转换器以及地址译码电路组成。其中,串行接口芯片,随着大规模 继承电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,如下表 所示。 它们的基本功能是类似的, 都能实现上面提出的串行通信接口基本任务的大部分工作, 且都是可编程的。 才用这些芯片作为串行通信接口电路的核心芯片, 会使电路结构比较简单。 同步(USRT) 传输速率 b/s 异步(UART)(起止 芯片 面向字 HDLC 式) 同步 异步 符 INS8250 56K MC6850 1M MC6852 1.5M MC6854 Int8251A Int8273 Z-80 SIO 3.有关串行通信的物理标准 1.5M 64K 64K 800K 19.2K

为使计算机、电话以及其他通信设备互相沟通,现在,已经对串行通信建立了几个一致的概 念和标准,这些概念和标准属于三个方面:传输率,电特性,信号名称和接口标准。 1、传输率:所谓传输率就是指每秒传输多少位,传输率也常叫波特率。国际上规定了一个 标准波特率系列, 标准波特率也是最常用的波特率, 标准波特率系列为 110、 300、 600、 1200、 4800、 9600 和 19200。 大多数 CRT 终端都能够按 110 到 9600 范围中的任何一种波特率工作。 打印机由于机械速度比较慢而使传输波特率受到限制,所以,一般的串行打印机工作在 110 波特率,点针式打印机由于其内部有较大的行缓冲区,所以可以按高达 2400 波特的速度接 收打印信息。大多数接口的接收波特率和发送波特率可以分别设置,而且,可以通过编程来 指定。 2、RS-232-C 标准:RS-232-C 标准对两个方面作了规定,即信号电平标准和控制信号线的 定义。 RS-232-C 采用负逻辑规定逻辑电平, 信号电平与通常的 TTL 电平也不兼容, RS-232-C 将-5V~-15V 规定为“1”,+5V~+15V 规定为“0”。图 1 是 TTL 标准和 RS-232-C 标准之间的 电平转换。

图1 二、软件协议 1.OSI 协议和 TCP/IP 协议

图2 (1)OSI 协议 OSI 七层参考模型不是通讯标准,它只给出一个不会由于技术发展而必须修改的稳定模型,

使有关标准和协议能在模型定义的范围内开发和相互配合。 一般的通讯协议只符合 OSI 七层模型的某几层,如: EIA-RS-232-C:实现了物理层。 IBM 的 SDLC(同步数据链路控制规程) :数据链路层。ANSI 的 ADCCP(先进数据通讯规程) : 数据链路层 IBM 的 BSC (二进制同步通讯协议) : 数据链路层。 应用层的电子邮件协议 SMTP 只负责寄信、POP3 只负责收信。 (2)TCP/IP 协议 实现了五层协议。 (1)物理层:对应 OSI 的物理层。 (2)网络接口层:类似于 OSI 的数据链路层。 (3)Internet 层:OSI 模型在 Internet 网使用前提出,未考虑网间连接。 (4)传输层:对应 OSI 的传输层。 (5)应用层:对应 OSI 的表示层和应用层。 2.串行通信协议 串行通信协议分同步协议和异步协议。 (1)异步通信协议的实例——起止式异步协议

图3 特点与格式: 起止式异步协议的特点是一个字符一个字符传输, 并且传送一个字符总是以起始位开始, 以 停止位结束,字符之间没有固定的时间间隔要求。其格式如图 3 所示。每一个字符的前面都 有一位起始位(低电平,逻辑值 0) ,字符本身有 5~7 位数据位组成,接着字符后面是一位 校验位(也可以没有校验位) ,最后是一位,或意味半,或二位停止位,停止位后面是不定 长度的空闲位。停止位和空闲位都规定为高电平(逻辑值) ,这样就保证起始位开始处一定 有一个下跳沿。 从图中可以看出, 这种格式是靠起始位和停止位来实现字符的界定或同步的, 故称为起始式 协议。传送时,数据的低位在前,高位在后,图 4 表示了传送一个字符 E 的 ASCAII 码的波 形 1010001。当把它的最低有效位写到右边时,就是 E 的 ASCII 码 1000101=45H。

图4 起/止位的作用:起始位实际上是作为联络信号附加进来的,当它变为低电平时,告诉收方 传送开始。它的到来,表示下面接着是数据位来了,要准备接收。而停止位标志一个字符的 结束,它的出现,表示一个字符传送完毕。这样就为通信双方提供了何时开始收发,何时结

束的标志。传送开始前,发收双方把所采用的起止式格式(包括字符的数据位长度,停止位 位数,有无校验位以及是奇校验还是偶校验等)和数据传输速率作统一规定。传送开始后, 接收设备不断地检测传输线,看是否有起始位到来。当收到一系列的“1”(停止位或空闲位) 之后,检测到一个下跳沿,说明起始位出现,起始位经确认后,就开始接收所规定的数据位 和奇偶校验位以及停止位。经过处理将停止位去掉,把数据位拼装成一个并行字节,并且经 校验后,无奇偶错才算正确的接收一个字符。一个字符接收完毕,接收设备有继续测试传输 线,监视“0”电平的到来和下一个字符的开始,直到全部数据传送完毕。 由上述工作过程可看到,异步通信是按字符传输的,每传输一个字符,就用起始位来通知收 方,以此来重新核对收发双方同步。若接收设备和发送设备两者的时钟频率略有偏差,这也 不会因偏差的累积而导致错位, 加之字符之间的空闲位也为这种偏差提供一种缓冲, 所以异 步串行通信的可靠性高。但由于要在每个字符的前后加上起始位和停止位这样一些附加位, 使得传输效率变低了,只有约 80%。因此,起止协议一般用在数据速率较慢的场合(小于 19.2kbit/s) 。在高速传送时,一般要采用同步协议。 (2)面向字符的同步协议 特点与格式:这种协议的典型代表是 IBM 公司的二进制同步通信协议(BSC) 。它的特点是 一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了 10 个字符作为这 个数据块的开头与结束标志以及整个传输过程的控制信息, 它们也叫做通信控制字。 由于被 传送的数据块是由字符组成,故被称作面向字符的协议。 特定字符 (控制字符) 的定义: 由上面的格式可以看出, 数据块的前后都加了几个特定字符。 SYN 是同步字符(synchronous Character) , 每一帧开始处都有 SYN, 加一个 SYN 的称单同步, 加两个 SYN 的称双同步设置同步字符是起联络作用,传送数据时,接收端不断检测,一旦出现 同步字符,就知道是一帧开始了。接着的 SOH 是序始字符(Start Of Header) ,它表示标题的 开始。标题中包括院地址、目的地址和路由指示等信息。STX 是文始字符(Start Of Text) , 它标志着传送的正文(数据块)开始。数据块就是被传送的正文内容,由多个字符组成。数 据块后面是组终字符 ETB(End Of Transmission Block)或文终字符 ETX(End Of Text),其中 ETB 用在正文很长、需要分成若干个分数据块、分别在不同帧中发送的场合,这时在每个 分数据块后面用文终字符 ETX。一帧的最后是校验码,它对从 SOH 开始到 ETX(或 ETB) 字段进行校验,校验方式可以是纵横奇偶校验或 CRC。另外,在面向字符协议中还采用了 一些其他通信控制字,它们的名称如下表所示: ASCII EBCDIC 名 称 0000001 00000001 序始(SOH) 0000010 00000010 文始(STX) 0010111 00100110 组终(ETB) 0000011 00000011 文终(ETX) 0010110 00110010 同步(SYN) 0000100 00110111 送毕(EOT) 0000101 00101101 询问(ENQ) 0000110 00101110 确认(ACK) 0010101 00111101 否认(NAK) 0010000 00010000 转义(DLE) 数据透明的实现:面向字符的同步协议,不象异步起止协议那样,需要在每个字符前后附加 起始和停止位,因此,传输效率提高了。同时,由于采用了一些传输控制字,故增强了通信 控制能力和校验功能。但也存在一些问题,例如,如何区别数据字符代码和特定字符代码的 问题,因为在数据块中完全有可能出现与特定字符代码相同的数据字符,这就会发生误解。

比如正文有个与文终字符 ETX 的代码相同的数据字符,接收端就不会把它当作为普通数据 处理,而误认为是正文结束,因而产生差错。因此,协议应具有将特定字符作为普通数据处 理的能力, 这种能力叫做“数据透明”。 为此, 协议中设置了转移字符 DLE(Data Link Escape)。 当把一个特定字符看成数据时,在它前面要加一个 DLE,这样接收器收到一个 DLE 就可预 知下一个字符是数据字符,而不会把它当作控制字符来处理了。DLE 本身也是特定字符, 当它出现在数据块中时,也要在它前面加上另一个 DLE。这种方法叫字符填充。字符填充 实现起来相当麻烦,且依赖于字符的编码。正是由于以上的缺点,故又产生了新的面向比特 的同步协议。 (3)面向比特的同步协议 特点与格式:面向比特的协议中最具有代表性的是 IBM 的同步数据链路控制规程 SDLC (Synchronous Data Link Control),国际标准化组织 ISO(International Standard Organization) 的 高级数据链路控制规程 HDLC(High Level Data link Control),美国国家标准协会(Americal National Standard Institute)的先进数据通信规程 ADCCP(Advanced Data Communication Control Procedure)。这些协议的特点是所传输的一帧数据可以是任意位,而且它是靠约定的 位组合模式,而不是靠特定字符来标志帧的开始和结束,故称“面向比特”的协议。这中协议 的一般帧格式如图 5 所示:

图5 帧信息的分段:由图 5 可见,SDLC/HDLC 的一帧信息包括以下几个场(Filed) ,所有场都是 从有效位开始传送。 (1)SDLC/HDLC 标志字符:SDLC/HDLC 协议规定,所有信息传输必须以一个标志字符 开始,且以同一个字符结束。这个标志字符是 01111110,称标志场(F)。从开始标志到结束 标志之间构成一个完整的信息单位,称为一帧(Frame)。所有的信息是以帧的形传输的,而 标志字符提供了每一帧的边界。接收端可以通过搜索“01111110”来探知帧的开头和结束,以 此建立帧同步。 (2)地址场和控制场:在标志场之后,可以有一个地址场 A(Address)和一个控制场 C(Control)。地址场用来规定与之通信的次站的地址。控制场可规定若干个命令。SDLC 规 定 A 场和 C 场的宽度为 8 位或 16 位。接收方必须检查每个地址字节的第一位,如果为“0”, 则后面跟着另一个地址字节;若为“1”,则该字节就是最后一个地址字节。同理,如果控制 场第一个字节的第一位为为“0”,则还有第二个控制场字节,否则就只有一个字节。 (3)信息场:跟在控制场之后的是信息场 I(Information)。I 场包含有要传送的数据,并不 是每一帧都必须有信息场。即数据场可以为 0,当它为 0 时,则这一帧主要是控制命令。 (4)帧校验信息:紧跟在信息场之后的是两字节的争校验,帧校验场称为 FC(Frame Check) 场或称为帧校验序列 FCS(Frame check Squence)。SDLC/HDLC 均采用 16 位循环冗余校验码 CRC(Cyclic Redundancy Code)。 除了标志场和自动插入的“0”以外, 所有的信息都参加 CRC 计算。 实际应用时的两个技术问题: (1)“0”位插入/删除:如上所述,SDLC/HDLC 协议规定以 01111110 为标志字节,但在信 息场中也完全有可能有同一种模式的字符,为了把它与标志区分开来,所以采取了“0”位插 入和删除技术。具体作法是发送端在发送所有信息(除标志字节外)时,只要遇到连续 5

个“1”,就自动插入一个“0”,当接收端在接收数据时(除标志字节)如果连续收到 5 个“1”, 就自动将其后的一个“0”删除是,以恢复信息的原有形式。这种“0”位的插入和删除过程是由 硬件自动完成的。 (2)SDLC/HDLC 异常结束:若在发送过程中出现错误,则 SDLC/HDLC 协议常用异常结 束(Abort)字符,或称为失效序列使本帧作废。在 HDLC 规程中,7 个连续的“1”被作为失效 字符,而在 SDLC 中失效字符是 8 个连续的“1”。当然在试销序列中不使用“0”位插入/删除 技术。SDLC/HDLC 协议规定,在一帧之内不允许出现数据间隔。在两帧之间,发送器可以 连续输出标志字符序列,也可以输出连续的高电平,它被称为空闲(Idle)信号。

串口通信
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行 通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 Universal SerialBus 或者 USB 混淆) 。大多数计算机包含两个基于 RS232 的串口。串口同时也是仪器仪表设备 通用的通信协议;很多 GPIB 兼容的设备也带有 RS-232 口。同时,串口通信协议也可以用 于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行 通信慢, 但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 它很简单并且能 够实现远距离通信。比如 IEEE488 定义并行通行状态时,规定设备线总长不得超过 20 米, 并且任意两个设备间的长度不得超过 2 米;而对于串口而言,长度可达 1200 米。 典型地,串口用于 ASCII 码字符的传输。通信使用 3 根线完成: (1)地线, (2)发送, (3) 接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。 其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇 偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的 bit 的个数。例如 300 波特 表示每秒钟发送 300 个 bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要 4800 波特率,那么时钟是 4800Hz。这意味着串口通信在数据线上的采样率为 4800Hz。通 常电话线的波特率为 14400,28800 和 36600。波特率可以远远大于这些值,但是波特率和 距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是 GPIB 设备的 通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不 会是 8 位的, 标准的值是 5、 7 和 8 位。 如何设置取决于你想传送的信息。 比如, 标准的 ASCII 码是 0~127(7 位) 。扩展的 ASCII 码是 0~255(8 位) 。如果数据使用简单的文本(标准 ASCII 码) ,那么每个数据包使用 7 位数据。每个包是指一个字节,包括开始/停止位,数据 位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。 c,停止位:用于表示单个包的最后一位。典型的值为 1,1.5 和 2 位。由于数据是在传输线 上定时的, 并且每一个设备有其自己的时钟, 很可能在通信中两台设备间出现了小小的不同 步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停 止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。 当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一 位) ,用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是 011,那么对

于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位 1,这样就 有 3 个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使 得接收设备能够知道一个位的状态, 有机会判断是否有噪声干扰了通信或者是否传输和接收 数据是否不同步。

RS-232
RS-232(ANSI/EIA-232 标准)是 IBM-PC 及其兼容机上的串行连接标准。可用于许多 用途,比如连接鼠标、打印机或者 Modem,同时也可以接工业仪器仪表。用于驱动和连线 的改进,实际应用中 RS-232 的传输长度或者速度常常超过标准的值。RS-232 只限于 PC 串 口和设备间点对点的通信。RS-232 串口通信最远距离是 50 英尺。 DB-9 针连接头 ------------\12345/ \6789/ ------从计算机连出的线的截面。 RS-232 针脚的功能: 数据: TXD(pin 3) :串口数据输出(Transmit Data) RXD(pin 2) :串口数据输入(Receive Data) 握手: RTS(pin 7) :发送数据请求(Request to Send) CTS(pin 8) :清除发送(Clear to Send) DSR(pin 6) :数据发送就绪(Data Send Ready) DCD(pin 1) :数据载波检测(Data Carrier Detect) DTR(pin 4) :数据终端就绪(Data Terminal Ready) 地线: GND(pin 5) :地线 其他 RI(pin 9) :铃声指示 RS-422 RS-422 (EIA RS-422-AStandard) 是 Apple 的 Macintosh 计算机的串口连接标准。 RS-422 使用差分信号,RS-232 使用非平衡参考地的信号。差分传输使用两根线发送和接收信号, 对比 RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远 的传输距离是一个很大的优点。

RS-485
RS-485(EIA-485 标准)是 RS-422 的改进,因为它增加了设备的个数,从 10 个增加到 32 个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个 设备的能力,你可以使用一个单个 RS-422 口建立设备网络。出色抗噪和多设备能力,在工 业应用中建立连向 PC 机的分布式设备网络、其他数据收集控制器、HMI 或者其他操作时, 串行连接会选择 RS-485。 RS-485 是 RS-422 的超集, 因此所有的 RS-422 设备可以被 RS-485 控制。RS-485 可以用超过 4000 英尺的线进行串行通行。 DB-9 引脚连接 -------------

\12345/ \6789/ ------从计算机连出的线的截面。 RS-485 的引脚的功能 数据:1(DATA-) 2(DATA+) 地线:5 握手 RS-232 通行方式允许简单连接三线:Tx、Rx 和地线。但是对于数据传输,双方必须对 数据定时采用使用相同的波特率。 尽管这种方法对于大多数应用已经足够, 但是对于接收方 过载的情况这种使用受到限制。这时需要串口的握手功能。在这一部分,我们讨论三种最常 用的 RS-232 握手形式:软件握手、硬件握手和 Xmodem。 a,软件握手:我们讨论的 第一种握手是软件握手。通常用在实际数据是控制字符的情况,类似于 GPIB 使用命令字符 串的方式。必须的线仍然是三根:Tx,Rx 和地线,因为控制字符在传输线上和普通字符没 有区别,函数 SetXModem 允许用户使用或者禁止用户使用两个控制字符 XON 和 XOFF。 这些字符在通信中由接收方发送,使发送方暂停。 例如:假设发送方以高波特率发送 数据。在传输中,接收方发现由于 CPU 忙于其他工作,输入 buffer 已经满了。为了暂时停 止传输,接收方发送 XOFF,典型的值是十进制 19,即十六进制 13,直到输入 buffer 空了。 一旦接收方准备好接收,它发送 XON,典型的值是十进制 17,即十六进制 11,继续通信。 输入 buffer 半满时,LabWindows 发送 XOFF。此外,如果 XOFF 传输被打断,LabWindows 会在 buffer 达到 75%和 90%时发送 XOFF。显然,发送方必须遵循此守则以保证传输继续。 b,硬件握手:第二种是使用硬件线握手。和 Tx 和 Rx 线一样,RTS/CTS 和 DTR/DSR 一起 工作,一个作为输出,另一个作为输入。第一组线是 RTS(Request to Send)和 CTS(Clear toSend) 。当接收方准备好接收数据,它置高 RTS 线表示它准备好了,如果发送方也就绪, 它置高 CTS,表示它即将发送数据。另一组线是 DTR(DataTerminal Ready)和 DSR(Data SetReady) 。这些现主要用于 Modem 通信。使得串口和 Modem 通信他们的状态。例如:当 Modem 已经准备好接收来自 PC 的数据,它置高 DTR 线,表示和电话线的连接已经建立。 读取 DSR 线置高,PC 机开始发送数据。一个简单的规则是 DTR/DSR 用于表示系统通信就 绪,而 RTS/CTS 用于单个数据包的传输。 在 LabWindows,函数 SetCTSMode 使能或 者禁止使用硬件握手。如果 CTS 模式使能,LabWindows 使用如下规则: 当 PC 发送 数据: RS-232 库必须检测 CTS 线高后才能发送数据。 当 PC 接收数据: 如 果端口打开, 且输入队列有空接收数据, 库函数置高 RTS 和 DTR。 如果输入队列 90% 满,库函数置低 RTS,但使 DTR 维持高电平。 如果端口队列近乎空了,库函数置高 RTS, 但使 DRT 维持高电平。 如果端口关闭, 库函数置低 RTS 和 DTR。 c, XModem 握手:最后讨论的握手叫做 XModem 文件传输协议。这个协议在 Modem 通信中非常通用。 尽管它通常使用在 Modem 通信中,XModem 协议能够直接在其他遵循这个协议的设备通信 中使用。在 LabWindows 中,实际的 XModem 应用对用户隐藏了。只要 PC 和其他设备使用 XModem 协议, 在文件传输中就使用 LabWindows 的 XModem 函数。 函数是 XModemConfig, XModemSend 和 XModemReceive。 XModem 使用介于如下参数的协议:start_of_data、end_of_data、neg_ack、wait_delay、 start_delay、max_tries、packet_size。这些参数需要通信双方认定,标准的 XModem 有一个 标准的定义:然而,可以通过 XModemConfig 函数修改,以满足具体需要。这些参数的使 用方法由接收方发送的字符 neg_ack 确定。 这通知发送方其准备接收数据。 它开始尝试发送, 有一个超时参数 start_delay;当超时的尝试超过 max_ties 次数,或者收到接收方发送的 start_of_data,发送方停止尝试。如果从发送方收到 start_of_data,接收方将读取后继信息数

据包。 包中含有包的数目、 包数目的补码作为错误校验、 packet_size 字节大小的实际数据包, 和进一步错误检查的求和校验值。在读取数据后,接收方会调用 wait_delay,然后想发送方 发送响应。如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次 数的最大值 max_tries。如果一直没有收到响应,发送方通知用户传输数据失败。 由于 数据必须以 pack_size 个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个 数据包, 后面会填充 ASCII 码 NULL (0) 字节。 这导致接收的数据比原数据多。 在 XModem 情况下一定不要使用 XON/XOFF,因为 XModem 发送方发出包的数目很可能增加到 XON/OFF 控制字符的值,从而导致通信故障。

SPI 总线协议
SPI,是英语 Serial Peripheral Interface 的缩写,顾名思义就是串行外围设备接口。SPI, 是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片 的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越 来越多的芯片集成了这种通信协议。 SPI 是一个环形总线结构,由 ss(cs)、sck、sdi、sdo 构成,其时序其实很简单,主要是在 sck 的控制下,两个双向移位寄存器进行数据交换。 上升沿发送、下降沿接收、高位先发送。 上升沿到来的时候,sdo 上的电平将被发送到从设备的寄存器中。 下降沿到来的时候,sdi 上的电平将被接收到主设备的寄存器中。 假设主机和从机初始化就绪:并且主机的 sbuff=0xaa (10101010),从机的 sbuff=0x55 (01010101), 下面将分步对 spi 的 8 个时钟周期的数据情况演示一遍(假设上升沿发送数据)。 --------------------------------------------------脉冲 主机 sbuff 从机 sbuff sdi sdo --------------------------------------------------0 00-0 10101010 01010101 0 0 --------------------------------------------------1 0--1 0101010x 10101011 0 1 1 1--0 01010100 10101011 0 1 --------------------------------------------------2 0--1 1010100x 01010110 1 0 2 1--0 10101001 01010110 1 0 --------------------------------------------------3 0--1 0101001x 10101101 0 1 3 1--0 01010010 10101101 0 1 --------------------------------------------------4 0--1 1010010x 01011010 1 0 4 1--0 10100101 01011010 1 0 --------------------------------------------------5 0--1 0100101x 10110101 0 1 5 1--0 01001010 10110101 0 1

--------------------------------------------------6 0--1 1001010x 01101010 1 0 6 1--0 10010101 01101010 1 0 --------------------------------------------------7 0--1 0010101x 11010101 0 1 7 1--0 00101010 11010101 0 1 --------------------------------------------------8 0--1 0101010x 10101010 1 0 8 1--0 01010101 10101010 1 0 --------------------------------------------------这 样就完成了两个寄存器 8 位的交换,上面的 0--1 表示上升沿、1--0 表示下降沿,sdi、 sdo 相对于主机而言的。根据以上分析,一个完整的传送周期是 16 位,即两个字节,因为, 首先主机要发送命令过去,然后从机根据主机的名准备数据,主机在 下一个 8 位时钟周期 才把数据读回来。 SPI 总线是 Motorola 公司推出的三线同步接口,同步串行 3 线方式进行通信:一条时钟线 SCK,一条数据输入线 MOSI,一条数据输出线 MISO; 用于 CPU 与各种外围器件进行全双工、 同步串行通讯。SPI 主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作; 提供频率可编程时钟;发送结束 中断标志;写冲突保护;总线竞争保护等。 SPI 总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是 SPI0 和 SPI3 方 式。 SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相 位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果 CPOL=0,串行同步时 钟的空闲状态为低电平; 如果 CPOL=1, 串行同步时钟的空闲状态为高电平。 时钟相位(CPHA) 能够配置用于选择两种不同的传 输协议之一进行数据传输。 如果 CPHA=0, 在串行同步时钟 的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿 (上升或下降)数据被采样。 SPI 主模块和与之通信的外设音时钟相位和极性应该一致。 SPI 时序图详解-SPI 接口在模式 0 下输出第一位数据的时刻 SPI 接口在模式 0 下输出第一位数据的时刻 SPI 接口有四种不同的数据传输时序,取决于 CPOL 和 CPHL 这两位的组合。图 1 中表现了这 四种时序, 时序与 CPOL、CPHL 的关系也可以从图中看出。

图1 CPOL 是用来决定 SCK 时钟信号空闲时的电平,CPOL=0,空闲电平为低电平,CPOL=1 时, 空闲电平为高电平。CPHA 是用来决定采样时刻的,CPHA=0,在每个周期的第一个时钟 沿采样, CPHA=1,在每个周期的第二个时钟沿采样。 由于我使用的器件工作在模式 0 这种时序(CPOL=0,CPHA=0),所以将图 1 简化为图 2, 只关注模式 0 的时序。

图2 我们来关注 SCK 的第一个时钟周期,在时钟的前沿采样数据(上升沿,第一个时钟沿), 在时钟的后沿输出数据 (下降沿, 第二个时钟沿) 。 首先来看主器件, 主器件的输出口 (MOSI) 输出的数据 bit1, 在时钟的前沿被从器件采样,那主器件是在何时刻输出 bit1 的呢?bit1 的输出时刻实际上 在 SCK 信号有效以前, 比 SCK 的上升沿还要早半个时钟周期。 bit1 的输出时刻与 SSEL 信号没有关系。 再来看从器

件, 主器件的输入口 MISO 同样是在时钟的前沿采样从器件输出的 bit1 的, 那从器件又是在何时 刻输出 bit1 的呢。 从器件是在 SSEL 信号有效后,立即输出 bit1,尽管此时 SCK 信号还没有起效。关于上面的 主器件 和从器件输出 bit1 位的时刻,可以从图 3、4 中得到验证。

图3 注意图 3 中,CS 信号有效后(低电平有效,注意 CS 下降沿后发生的情况),故意用延时程 序 延时了一段时间,之后再向数据寄存器写入了要发送的数据,来观察主器件输出 bit1 的情 况(MOSI)。 可以看出,bit1(值为 1)是在 SCK 信号有效之前的半个时钟周期的时刻开始输出的(与 CS 信号无关), 到了 SCK 的第一个时钟周期的上升沿正好被从器件采样。

图4 图 4 中,注意看 CS 和 MISO 信号。我们可以看出,CS 信号有效后,从器件立刻输出了 bit1(值为 1)。 通常我们进行的 spi 操作都是 16 位的。图 5 记录了第一个字节和第二个字节间的相互 衔接的过程。 第一个字节的最后一位在 SCK 的上升沿被采样, 随后的 SCK 下降沿, 从器件就输出了第二个 字节的第一位。

SPI
区别一

I2C

UART 区别

个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTEL IC BUS:英特尔 IC 总线) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

区别二
区别在电气信号线上: SPI 总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。 SPI 总线可以实现 多个 SPI 设备互相连接。 提供 SPI 串行时钟的 SPI 设备为 SPI 主机或主设 备(Master),其他设备为 SPI 从机或从设备(Slave)。主从设备间可以实现全双工通信,当有 多个从设备时,还可以增加一条从设备选择线。 假如用通用 IO 口模仿 SPI 总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口 则视实现的设备类型而定,假如要实现主从设备,则需输入输出口,若只实现主设备,则需 输出口即可,若只实现从设备,则只需输入口即可。 I2C 总线是双向、两线(SCL、SDA)、串行、多主控(multi-master)接口标准,具有总线仲 裁机制,非常适合在器件之间进行近距离、非常常性的数据通信。在它的协议体系中,传输 数据时都会带上目的设备的设备地址,因此可以实现设备组网。 如果用通用 IO 口模仿 I2C 总线,并实现双向传输,则需一个输入口(SDA),另外还需一个 输出口(SCL)。 (注:I2C 资料了解得比较少,这里的描述可能很不完备) UART 总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生 器(产生的波特率等于传输波特率的 16 倍)、UART 接收器、UART 发送器组成,硬件上由两 根线,一根用于发送,一根用于接收。显然,如果用通用 IO 口模拟 UART 总线,则需一个 输入口,一个输出口。

区别三
从第二点明显可以看出,SPI 和 UART 可以实现全双工,但 I2C 不行; I2C 线更少,我觉得比 UART、SPI 更为强盛,但是技术上也更加麻烦些,因为 I2C 需要有 双向 IO 的支持,而且使用上拉电阻,我觉得抗干扰能力较弱,一般用于同一板卡上芯片之 间的通信,较少用于远距离通信。SPI 实现要简朴一些,UART 需要固定的波特率,就是说 两位数据的间隔要相等,而 SPI 则无所谓,因为它是有时钟的协议。 I2C 的速度比 SPI 慢一点,协议比 SPI 复杂一点,但是连线也比标准的 SPI 要少。 区别:SPI:高速同步串行口。3~4 线接口,收发独立、可同步进行 UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢 SPI:一种串行传输方式,三线制,网上可找到其通信协议和用法的 3 根线实现数据双向传输 串行外围接口 Serial peripheral interface UART:通用异步收发器 UART 是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了 RS-232C 数据 终端设备接口,这样计算机就可以和调制解调器或其它使用 RS-232C 接口的串行设备通信 了。作为接口的一部分,UART 还提供以下功能: 将由计算机内部传送过来的并行数据转换为输出的串行数据流。 将计算机外部来的串行数据 转换为字节, 供计算机内部使用并行数据的器件使用。 在输出的串行数据流中加入奇偶校验 位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据 流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠票也是串行设备) 。可以 处理计算机与外部串行设备的同步管理问题。有一些比较高档的 UART 还提供输入输出数 据的缓冲区,现在比较新的 UART 是 16550,它可以在计算机需要处理数据前在其缓冲区内 存储 16 字节数据,而通常的 UART 是 8250。现在如果您购买一个内置的调制解调器,此调 制解调器内部通常就会有 16550 UART。 I2C:能用于替代标准的并行总线,能连接的各种集成电路和功能模块。I2C 是多主控总线, 所以任何一个设备都能像主控器一样工作, 并控制总线。 总线上每一个设备都有一个独一无 二的地址,根据设备它们自己的能力,它们可以作为发射器或接收器工作。多路微控制器能 在同一个 I2C 总线上共存。

SPI、I2C、UART 三种串行总线协议的区别
SPI(Serial Peripheral Interface:串行外设接口) I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器)

SPI
The SPI includes these distinctive features: ? Master mode and slave mode ? Bi-directional mode

? Slave select output ? Mode fault error flag with CPU interrupt capability ? Double-buffered data register ? Serial clock with programmable polarity and phase ? Control of SPI operation during wait mode SPI 有两种模式,Normal Mode and Bidirectional Mode,包括以下几根线: SS Slave Select SCK Serial Clock MOSI Master Output, Slave Input MISO Master Input, Slave Output MOMI Master Output, Master Input SISO Slave Input, Slave Output 其中前四根线用于 Normal Mode ,常用的也是 4 根线的 Normal Mode 。 MOSI This pin is used to transmit data out of the SPI module when it is configured as a Master and receive data when it is configured as Slave. MISO This pin is used to transmit data out of the SPI module when it is configured as a Slave and receive data when it is configured as Master. SS This pin is used to output the select signal from the SPI module to another peripheral with which a data transfer is to take place when its configured as a Masterand its used as an input to receive the slave select signal when the SPI is configured as Slave. SCK This pin is used to output the clock with respect to which the SPI transfers data or receive clock in case of Slave. SPI 是一种允许一个主设备启动一个与从设备的同步通讯的协议,从而完成数据的交换。也 就是 SPI 是一种规定好的通讯方式。这种通信方式的优点是占用端口较少,一般 4 根就够基 本通讯了。同时传输速度也很高。一般来说要求主设备要有 SPI 控制器(但可用模拟方式) , 就可以与基于 SPI 的芯片通讯了。 SPI 的通信原理很简单,它需要至少 4 根线,事实上 3 根也可以。也是所有基于 SPI 的 设备共有的,它们是 SDI(数据输入) ,SDO(数据输出) ,SCK(时钟) ,CS(片选) 。其中 CS 是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或 低电位) ,对此芯片的操作才有效。这就允许在同一总线上连接多个 SPI 设备成为可能。 接下来就负责通讯的 3 根线了。通讯是通过数据交换完成的,这里先要知道 SPI 是串行 通讯协议,也就是说数据是一位一位的传输的。这就是 SCK 时钟线存在的原因,由 SCK 提 供时钟脉冲,SDI,SDO 则基于此脉冲完成数据传输。数据输出通过 SDO 线,数据在时钟 上沿或下沿时改变,在紧接着的下沿或上沿被读取。完成一位数据传输,输入也使用同样原

理。这样,在至少 8 次时钟信号的改变(上沿和下沿为一次) ,就可以完成 8 位数据的传输。 要注意的是,SCK 信号线只由主设备控制,从设备不能控制信号线。同样,在一个基于 SPI 的设备中,至少有一个主控设备。 这样传输的特点:这样的传输方式有一个优点,与普通的串行通讯不同,普通的串行通 讯一次连续传送至少 8 位数据,而 SPI 允许数据一位一位的传送,甚至允许暂停,因为 SCK 时钟线由主控设备控制,当没有时钟跳变时,从设备不采集或传送数据。也就是说,主设备 通过对 SCK 时钟线的控制可以完成对通讯的控制。SPI 还是一个数据交换协议:因为 SPI 的数据输入和输出线独立,所以允许同时完成数据的输入和输出。不同的 SPI 设备的实现方 式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义, 具体请参考相关器件的文档。

I2C
? 只要求两条总线线路:一条串行数据线 SDA 一条串行时钟线 SCL ? 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设 定地址主机可以作为主机发送器或主机接收器 ? 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测 和仲裁,防止数据被破坏 ? 串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 3.4Mbit/s ? 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整 ? 连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制 UART UART 总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生 器(产生的波特率等于传输波特率的 16 倍)、UART 接收器、UART 发送器组成,硬件上由两 根线,一根用于发送,一根用于接收。 显然,如果用通用 IO 口模拟 UART 总线,则需一个输入口,一个输出口。 UART 常用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了 RS-232C 数据 终端设备接口,这样计算机就可以和调制解调器或其它使用 RS-232C 接口的串行设备通信 了。 明显可以看出,SPI 和 UART 可以实现全双工,但 I2C 不行;

串口通信
定义:串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于 RS232 的串口。 串口同时也是仪器仪表设备通用的通信协议; 很多 GPIB 兼容的设备也带有 RS-232 口。同时,串口通信协议也可以用于获取远程采集设备的数据。 原理:串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte) 的并行通信慢, 但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 它很简单 并且能够实现远距离通信。比如 IEEE488 定义并行通行状态时,规定设备线总长不得超过 20 米,并且任意两个设备间的长度不得超过 2 米;而对于串口而言,长度可达 1200 米。典

型地,串口用于 ASCII 码字符的传输。通信使用 3 根线完成: (1)地线, (2)发送, (3) 接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。 其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇 偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的 bit 的个数。例如 300 波特表示每秒钟发送 300 个 bit。当我们提到时钟周期时,我们就是指波特率例如如果协议 需要 4800 波特率,那么时钟是 4800Hz。这意味着串口通信在数据线上的采样率为 4800Hz。 通常电话线的波特率为 14400,28800 和 36600。波特率可以远远大于这些值,但是波特率 和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是 GPIB 设备 的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数 据不会是 8 位的,标准的值是 5、7 和 8 位。如何设置取决于你想传送的信息。比如,标准 的 ASCII 码是 0~127(7 位) 。扩展的 ASCII 码是 0~255(8 位) 。如果数据使用简单的文 本(标准 ASCII 码) ,那么每个数据包使用 7 位数据。每个包是指一个字节,包括开始/停 止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信 的情况。 c,停止位:用于表示单个包的最后一位。典型的值为 1,1.5 和 2 位。由于数据是在传 输线上定时的, 并且每一个设备有其自己的时钟, 很可能在通信中两台设备间出现了小小的 不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用 于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和 低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面 的一位) ,用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是 011,那 么对于偶校验,校验位为 0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位 1,这 样就有 3 个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这 样使得接收设备能够知道一个位的状态, 有机会判断是否有噪声干扰了通信或者是否传输和 接收数据是否不同步。 作用 RS-232(ANSI/EIA-232 标准)是 IBM-PC 及其兼容机上的串行连接标准。可用于许多 用途,比如连接鼠标、打印机或者 Modem,同时也可以接工业仪器仪表。用于驱动和连线 的改进,实际应用中 RS-232 的传输长度或者速度常常超过标准的值。RS-232 只限于 PC 串 口和设备间点对点的通信。RS-232 串口通信最远距离是 50 英尺。


相关文章:
SPI、I2C、UART三种串行总线协议的区别
SPII2CUART三种串行总线协议的区别_信息与通信_工程科技_专业资料。第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS...
SPI、I2C、UART三种串行总线的原理、区别及应用
SPII2CUART三种串行总线的原理、区别及应用_信息与通信_工程科技_专业资料。...网上可找到其通信协议和用法的 3 根线实现数据双向传输 串行外围接口 Serial ...
SPI、I2C、UART三种串行总线协议的区别
SPII2CUART 三种串行总线协议的区别 、、 第一个区别是名字: 第一个区别是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为 ...
SPI、I2C、UART串行总线协议
SPII2CUART串行总线协议_理学_高等教育_教育专区 暂无评价|0人阅读|0次下载|举报文档 SPII2CUART串行总线协议_理学_高等教育_教育专区。SPII2C、UART...
SPI、I2C、UART三种串行总线协议的区别
SPII2CUART 三种串行总线协议的区别第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS:意为 IC 之间总线) UART(...
I2C,SPI,USB,UART常见接口的原理简析_图文
I2C,SPI,USB,UART常见接口的原理简析 常见接口电路介绍一、 I2C 总线简介 1. ...什么是串口?串口是计算机上一种非常通用的设备通信的协议串口通信的概念非常...
SPI、I2C、UART串行总线协议_图文
SPII2CUART串行总线协议_电子/电路_工程科技_专业资料。SPI IIC UART 串口通讯通信协议 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、...
SPI、I2C、UART三种串行总线协议的区别
SPII2CUART三种串行总线协议的区别SPII2CUART三种串行总线协议的区别隐藏>> SPII2CSPII2CUART 三种串行总线协议的区 别第一个区别当然是名字: ...
SPI,UART,I2C的区别以及RS232与RS485的区别
有时钟的协议。 SPII2CUART 三种串行总线协议的区别 、、 SPI(Serial Peripheral Interface:串行外设接口 :串行外设接口) I2C(INTER IC BUS) UART(Universal ...
I2C和SPI,UART的区别
(注:I2C 资料了解得比较少,这里的描述可能很 不完备) UART 总线是异步串口,...B:I2C 的速度比 SPI 慢一点,协议SPI 复杂一点,但是连线也比标准的 SPI...
更多相关标签:
i2c spi uart 区别 | uart spi i2c | uart i2c spi jtag | i2c spi uart can | i2c串行总线 | spi串行总线 | i2c转uart | i2c uart |