通信协议的基本概念
通信协议不难理解,就是两个(或多个)设备之间进行通信,必须要遵循的一种协议。通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
通讯方式分类
1、按照数据的传送方式划分
串行通讯与并行通讯
串行通讯:指设备之间通过少量数据信号线(一般是 8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。
并行通讯:指使用 8、16、32 及 64 根或更多的数据线进行传输的通讯方式,同时传输多个数据位的数据。
两者比较:在数据传输速率相同时,并行效率更高,可以传输更多数据量;而串行通讯节省成本。并行传输对同步要求较高,且随着通讯速率的提高,信号干扰的问题会显著影响通讯性能。比较如下:
2、按数据通讯方向划分
全双工、半双工、单工通讯
3、按照数据通讯的同步方式/是否使用时钟信号进行划分
同步通讯和异步通讯
同步通讯:收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样
异步通讯:不使用时钟信号进行数据同步,直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,某些通讯中还需要双方约定数据的传输速率,以便更好地同步。
两者比较:在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。
4、按照通讯速率
比特率和波特率
比特率(Bitrate):每秒钟传输的二进制位数,单位为比特每秒(bit/s)。
波特率(Baudrate):表示每秒钟传输了多少个码元
三、串口协议
USART——串口通讯
包括RS232、RS499、RS423、RS422和RS485等接口规范和标准规范
串口通讯协议的物理层及协议层:
1、物理层:串口通讯的物理层有很多标准及变种,主要有RS-232标准,一般只使用 RXD、TXD 以及 GND 三条信号线,直接传输数据信号。
2、协议层:串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据
数据校验
奇校验:有效数据和校验位中“1”的个数为奇数;
偶校验:有效数据和校验位中“1”的个数为偶数;
3、USART——通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)
RX、TX
串行通信:以帧格式传输数据,即是一帧一帧的传输,每帧包含有起始信号、数据信息、停止信息,可能还有校验信息。
字符帧:一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的 8 位或 9 位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。
I2C通讯协议
I2C通讯协议(Inter-Integrated Circuit):由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
1、物理层:双向串行数据线(SDA),串行时钟线(SCL)
(1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。
(2) 一个 I2C 总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
(3) 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
(4) 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
(5) 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线。
2、协议层:定义了通讯的起始和停止信号、数据有效性、响应、仲裁时钟同步和地址广播等环节
S:传输开始信号;SLAVE_ADDRESS:从机地址;R/W:传输方向选择位,1为读,0为写
A/A:应答(ACK)或非应答(NACK)信号;P:停止传输信号
通讯过程:起始信号产生后,所有从机就开始等待主机紧接下来广播 的从机地址信号(SLAVE_ADDRESS)。在 I2C 总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据 I2C协议,这个从机地址可以是 7位或 10位。在地址位之后,是传输方向的选择位,该位为 0 时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1时,则相反,即主机由从机读数据。从机接收到匹配的地址后,主机或从机会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。
读和写数据:I2C通讯更常用的是复合格式,该传输过程有两次起始信号(S)。一般在第一次传输中,主机通过 SLAVE_ADDRESS 寻找到从设备后,发送一段“数据”,这段数据通常用于表示从设备内部的寄存器或存储器地址(注意区分它与 SLAVE_ADDRESS 的区别);在第二次的传输中,对该地址的内容进行读或写。第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。
(2)通讯的起始和停止信号:起始和停止信号一般由主机产生
起始信号:SCL为高,SDA 高 —》低;
停止信号:SCL为高,SDA 低 —》高;
数据有效性:传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。
3、I2C特性及架构
软件模拟协议:直接控制芯片的两个 GPIO 引脚,分别用作 SCL 及 SDA,按照上述信号的时序要求,直接控制引脚的输出(若是接收数据时则读取 SDA 电平),就可以实现 I2C 通讯。由直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态。
硬件协议:STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。
SPI通讯协议
SPI(Serial Peripheral Interface):串行外围设备接口,是一种高速全双工的通信总线。
1、SPI物理层:3条总线及片选线(SCK、MOSI、MISO、片选线共4根)
(1)片选线:从设备选择信号线,当有多个 SPI 从设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI及 MISO同时并联到相同的 SPI总线上,即无论有多少个从设备,都共同只使用这 3 条总线;而每个从设备都有独立的这一条 NSS 信号线,本信号线独占主机的一个引脚,即有多少个从设备,就有多少条片选信号线。I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯;而 SPI 协议中没有设备地址,它使用 NSS 信号线来寻址,当主机要选择从设备时,把该从设备的 NSS 信号线设置为低电平,该从设备即被选中片选有效,接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI通讯以 NSS 线置低电平为开始信号,以 NSS 线被拉高作为结束信号。
(3) MOSI(Master Output,Slave Input):主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,即这条线上数据的方向为主机到从机。
(4) MISO(Master Input,Slave Output):主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,即在这条线上数据的方向为从机到主机。
2、协议层:SPI 协议定义了通讯的起始和停止信号、数据有效性、时钟同步等环节。
SPI通讯时序:
(1)通讯的起始和停止信号:
起始信号:NSS 信号线由高变低,是 SPI 通讯的起始信号。NSS 是每个从机各自独占的信号线,当从机在自己的 NSS 线检测到起始信号后,就知道自己被主机选中了,开始准备与主机通讯。
停止信号:NSS 信号由低变高,是 SPI 通讯的停止信号,表示本次通讯结束,从机的选中状态被取消。
(2)数据有效性:SPI 使用 MOSI 及 MISO 信号线来传输数据,使用 SCK 信号线进行数据同步。MOSI及 MISO 数据线在 SCK 的每个时钟周期传输一位数据,且数据输入输出是同时进行的。MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出,在 SCK的下降沿时被采样。即在 SCK的下降沿时刻,MOSI及 MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及 MISO为下一次表示数据做准备。SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制。
DMA——直接存储器存取
DMA(Direct Memory Access):是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候,CPU 可以干其他的事情,好像是多线程一样。数据传输支持从外设到存储器或者存储器到存储器
1、DMA请求:如果外设要想通过 DMA 来传输数据,必须先给 DMA 控制器发送 DMA 请求,DMA收到请求信号之后,控制器会给外设一个应答信号,当外设应答后且 DMA 控制器收到应答信号之后,就会启动 DMA的传输,直到传输完毕。
2、通道:DMA 具有 12 个独立可编程的通道,其中 DMA1 有 7 个通道,DMA2 有 5 个通道,每个通道对应不同的外设的 DMA 请求。虽然每个通道可以接收多个外设的请求,但是同一
时间只能接收一个,不能同时接收多个。
3、仲裁器:当发生多个 DMA 通道请求时,就意味着有先后响应处理的顺序问题,这个就由仲裁器理。
4、DMA 数据配置:DMA 传输数据的方向有三个——从外设到存储器,从存储器到外设,从存储器到存储器。
USART/I2C/SPI比较
1、通信速率比较:
SPI 》 I2C 》 UART
(1)同步通信》异步通信;
(2)同步通信时必须有一根时钟线连接传输的两端;
(3)都是串行通信方式,并行通信用于内部存储间的通信,如flash;
(4)适合传输的距离和通信速率成反比关系;
2、连线方式:
SPI:2数据线、1时钟线、1CS(设备片选线),串行同步通信全双工;
I2C:1数据线、1时钟线,串行同步通信半双工,传输距离比UART短;
UART:2数据线、1地线,串行异步通信全双工,传输距离比I2C长些;
(I2C接口是“器件间”接口,是在一块板子之内传输数据)
(UART是 “设备间”接口,更多的是用于两台设备之间传输数据)
审核编辑:彭静欢迎分享,转载请注明来源:内存溢出
评论列表(0条)