硬件串口通信协议学习(UART、IIC、SPI、CAN)

0.前言

学习资料江协科技的个人空间-江协科技个人主页-哔哩哔哩视频

  1. 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统
  2. 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发

  1. 全双工:通信双方能够同时进行双向通信,一般有两根数据线。比如TX和RX,MOSI和MISO,发送和接收互不影响。
  2. 半双工:只有一条数据线(IIC、CAN和USB),
  3. 时钟信号:高速接收方什么时候需要采集数据,分为同步和异步。IIC和SPI有单独的时钟线,所以他们是同步的,接收方可以在时钟信号的指引下进行采样。剩下的串口,CAN和USB没有时钟线,所以需要双方约定一个采样频率,为异步通信。

CAN协议使用两条差分信号线进行通信,其中一条线是CAN高线,另一条线是CAN低线。这两条线通过电压的差异来表示数据的0和1。CAN协议的物理层只有这两条差分线,因此在一个时刻只能表示一个信号,所以CAN通信是半双工的,即在同一时刻只能有一个节点发送信号,其他节点只能接收信号

USB协议,数据传输方向,D+只能接另外一个设备的D+,D-接D-,一根数据线为半双工。

USART中的“S”表示同步,只支持时钟输出,不支持时钟输入,是为了兼容别的协议或特殊用途而设计的,并不支持两个USART之间进行同步通信,所以这个功能几乎不会用到,一般更常使用的是UART异步收发器。

一、UART协议

1.1  UART协议简介

  1. UART是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)的缩写,它是一种常见的串口通信接口。
  2. 使用差分信号可以抑制共模噪声,可以极大的提高信号的抗干扰特性,所以一般差分信号的传输速度和传输距离都非常高。

  1. TX与RX要交叉连接
  2. 当只需单向的数据传输时,可以只接一根通信线
  3. 当电平标准不一致时,需要加电平转换芯片

电平标准:

  1. TTL电平:+3.3V或+5V表示1,0V表示0
  2. RS232电平:-3~-15V表示1,+3~+15V表示0
  3. RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

串口参数及时序:

  1. 波特率:串口通信的速率(bit/s)
  2. 起始位:标志一个数据帧的开始,固定为低电平
  3. 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
  4. 校验位(选填):用于数据验证,根据数据位计算得来
  5. 停止位:用于数据帧间隔,固定为高电平

无校验位:

 有校验位:

 1.2 串口通信时序图

串口时序:低位先行,先发送B0(先转换为二进制,然后先画低位波形)

发送一个字节的数据0x55(0101 0101):8位数据+1位停止位,无校验位

起始位低电平,停止位高电平

 偶校验位(低电平0):

 二、IIC协议

2.1 IIC协议简介

  1. I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  2. 两根通信线:SCL(Serial Clock)、SDA(Serial Data
  3. 同步,半双工
  4. 带数据应答
  5. 支持总线挂载多设备(一主多从、多主多从)

硬件电路:

  1. 所有I2C设备的SCL连在一起,SDA连在一起
  2. 设备的SCL和SDA均要配置成开漏输出模式
  3. SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

 

  1. 从机的权利比较小,对于SCL线,在任何时刻都只能被动的读取,从机不允许控制SCL线。
  2. 对于SDA数据线,从机不允许主动发起对SDA的控制。只有在主机发送读取从机的命令后,或者从机应答的时候,从机才能短暂地获取SDA的控制权

主机的SDA引脚在发送的时候是输出模式,在接收的时候是输入模式。为了避免总线没协调好,导致电源短路的问题。IIC的设计是禁止所有设备输出强上拉的高电平

设计为弱上拉电阻(4.7K)加开漏输出的模式

这个模式具有“线与”的功能,只要总线上有一个输出低电平,总线就处于低电平。只有所有设备都输出高电平,总线才输出高电平。

2.2 IIC时序基本单元

起始和终止信号均由主机产生,从机不允许产生起始和终止信号,所以在总线空闲状态时,从机必须始终放手。

  1. 起始条件:SCL高电平期间,SDA从高电平切换到低电平。下降沿,触发起始条件。
  2. 终止条件:SCL高电平期间,SDA从低电平切换到高电平。上升沿,触发终止条件,回到最初的空闲状态(SDA和SCL均为高电平)
  3. 除了起始和终止条件,每个时序单元的SCL都是以低电平开始,低电平结束

  • 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行,先发送B7)然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

  • SCL低电平期间:允许SDA的电平发生变化,如果发送1就为高电平,发送0为低电平。
  • SCL高电平期间:不允许SDA的电平发生变化。
  • 一般在SCL上升沿的时刻,从机就已经读取完成了。从机在上升沿时立刻把数据读走。主机在放手SCL一段时间后(高电平),就可以继续拉低SCL,传输下一位了
  • 主机也需要在SCL下降沿之后,尽快把数据放在SDA上。
  • 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA,即高电平

  1. 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据数据0表示应答,数据1表示非应答
  2. 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA
  •  
    • 接收应答:主机发送完毕后,需要立刻调用接收应答的时序(在SCL低电平期间,SDA切换为高电平)

 2.3 IIC通信时序参考图

  • 指定地址写
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

空闲状态,SDA、SCL均为高电平。

然后主机需要给从机写入数据时,SCL高电平期间,拉低SDA,产生起始条件。

发送一个字节的数据(字节的内容:从机地址7位+1位读写位)

读写位:0表示之后的时序主机要进行写入操作,1表示之后的时序主机要进行读出操作。

应答位RA(Receive ACK, RA):根据IIC协议的规定,在这个时刻,主机要释放SDA

SCL低电平期间,SDA可以变换数据

SCL高电平期间,SDA保持不变,从机读取数据

  • 当前地址读
  • 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

  • 指定地址读
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)

三、SPI协议

3.1 SPI协议简介

  1. SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  2. 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)从机选择线,有几个从机,需要几根从机线,一人一根
  3. 同步,全双工(两根数据线,一根发送,一根接收,设备双方可以同时进行数据通信)
  4. 支持总线挂载多设备(一主多从)

SPI通信的基础是交换一个字节:有了交换一个字节,就可以实现发送一个字节接收一个字节,和发送同时接收一个字节,这三种功能。

硬件电路:

  1. 所有SPI设备的SCK、MOSI、MISO分别连在一起
  2. 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  3. 输出引脚配置为推挽输出输入引脚配置为浮空或上拉输入

从机SS引脚,输入低电平代表被选中进行数据通信,如果只有一个从机设备,SS引脚可以直接接地。

  1. 从机设备的DI:相当于MOSI引脚
  2. 从机设备的DO:相当于MISO引脚
  3. CS片选:其实就是SS

移位示意图:高位先行,每来一个时钟,移位寄存器都会向左进行移动一位。

原理:在波特率发生器时钟的上升沿,所有移位寄存器向左移动一位,移出的位放到引脚上。波特率发生器的下降沿,引脚上的位,采样输入到移位寄存器的最低位。

在波特率发生器的上升沿:移出一位放到引脚上:

 

 在波特率发生器的下降沿:主机和从机都会进行数据采样输入:

 8个时钟后,完成一个字节的交换:一般在接收的时候,主机会统一发送0x00或0xFF,去跟从机换数据。

 3.2 SPI时序基本单元

  1. 起始条件:SS从高电平切换到低电平
  2. 终止条件:SS从低电平切换到高电平
  3. 在通信期间:SS始终保持在低电平,在从机SS未被选中时,从机的MISO引脚必须关断输出,也就是设置为高阻态。

CPOL::Clock Polarity,时钟极性

CPHA:Clock Phase,时钟相位

每一位可以配置为1或0,总共组合起来,共有4种模式。在实际使用中,只需要其中的一种即可。

注意:CHPA表示的是时钟相位,决定第一个时钟采样移入还是第二个时钟采样移入。并不能单独决定上升沿采样还是下降沿采样。

3.3 交换一个字节的时序图

  1. 交换一个字节(模式0)
  2. CPOL=0:空闲状态时,SCK为低电平
  3. CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

  1. 交换一个字节(模式1),常用
  2. CPOL=0:空闲状态时,SCK为低电平
  3. CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

通讯原理:

  1. SS高电平时,从机未被选中,MISO用一条中间的线表示高阻态。
  2. SS下降沿之后,从机的MISO被允许开启输出,SS上升沿之后,从机的MISO必须置回高阻态
  3. 移位传输的操作:因为CPHA = 1,所以SCK第一个边沿移出数据(所以在SCK第一个上升沿,主机和从机同时移出数据)。主机通过MOSI移出最高位B7,从机通过MISO移出最高位B7。
  4. 时钟运行,产生下降沿,此时主机和从机同时移入数据,也就是进行数据采样。主机移出的B7进入从机移位寄存器的最低位B0。从机移出的B7进入主机移位寄存器的最低位。这样一个时钟脉冲产生完毕,一个数据位传输完毕。

通过上述步骤可以完成一个字节的交换。在SS的上升沿,MOSI还可以再变化一次,将MOSI置到一个默认的高电平或低电平,当然也可以不管他。MISO从机必须得置回高阻态,此时如果主机的MISO为上拉输入,那MISO引脚的电平为高电平。如果主机MISO为浮空输入,此时MISO引脚的电平不确定。

  1. 交换一个字节(模式2)
  2. CPOL=1:空闲状态时,SCK为高电平
  3. CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据

  1. 交换一个字节(模式3)
  2. CPOL=1:空闲状态时,SCK为高电平
  3. CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

 3.4 模式1完整时序图

向SS指定从机设备,发送指令0x06

四、CAN协议 

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UARTIICSPI,CAN都是常见的串行通信协议,它们有以下区别: 1. 通信方式:UART(Universal Asynchronous Receiver/Transmitter)是异步串口通信,只有一对数据线(TX和RX)。IIC(Inter-Integrated Circuit)是双线制的串行总线,包括SCL(时钟线)和SDA(数据线)。SPI(Serial Peripheral Interface)是四线制的串行总线,包括SCK(时钟线)、MISO(Master In Slave Out)、MOSI(Master Out Slave In)和CS(片选线)。CAN(Controller Area Network)是CAN总线通信,一般是在电气层面上实现的。 2. 数据传输速率:UART通信速率较低,一般在1Mbps以下,而IICSPI和CAN的通信速率较高,可以达到几Mbps甚至更高。 3. 通信距离:UART通信距离较短,一般在数米以内,而IICSPI的通信距离也比较短,一般在几十厘米以内。CAN可以实现较远的通信距离,达到数百米甚至几千米。 4. 设备连接数量:UART通信是一对一的通信方式,即一个发送器连接一个接收器。IICSPI可以实现多个设备的连接,通过地址或片选信号进行选择通信对象。CAN总线可以连接多台设备,形成一个网络结构。 5. 硬件复杂度:UART通信硬件简单,适用于简单的串行通信。IICSPI通信需要更复杂的硬件支持,例如时钟同步和数据线的动态切换等。CAN通信硬件较为复杂,需要专用的CAN控制器和收发器。 总的来说,UART适用于短距离低速率的通信,IIC适用于简单的多设备通信,SPI适用于高速数据传输,CAN适用于远距离和高可靠性的通信。不同的应用场景下,可以选择合适的串行通信协议

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值