首页 > 其他分享 >STM32 - UART、IIC、SPI通信协议

STM32 - UART、IIC、SPI通信协议

时间:2023-03-19 23:34:29浏览次数:57  
标签:发送 UART 主机 通信协议 STM32 SPI 信号 数据 时钟

目录

1. 基本概念

1.1 总线

详细可参考该Blog:https://zhuanlan.zhihu.com/p/425510158

1.2 电平标准

常用的逻辑电平包括:TTL、CMOS、LVTTL、ECL、PECL、GTL;RS232、RS422、LVDS 等

  • TTL按照典型电压可分为:5V、3.3V、2.5V、1.8V 系列
  • CMOS按照典型电压可分为:5V、3.3V、2.5V、1.8V 系列
  • 5V 为通用逻辑电平
  • 3.3V、2.5V和1.8V称为低压逻辑电平,即 LVTTL (Low Voltage TTL)
  • ECL/PECL和LVDS是差分输入输出
  • RS-422/485和RS-232是串口的接口标准,RS-422/485是差分输入输出,RS-232是单端输入输出

1)TTL电平

TTL:(Transistor-Transistor Logic gate,晶体管-晶体管逻辑门),三极管结构,目前被广泛使用,其原因是:采用二进制来表示数据,而且规定 +5V表示逻辑 “1”; 0V表示逻辑“0”

TTL VS CMOS

1)TTL电路是电流控制器件,而coms电路是电压控制器件。
2)TTL电路的速度快,传输延迟时间短(5-10ns),但是功耗大;
COMS电路的速度慢,传输延迟时间长(25-50ns),但功耗低。

无论TTL还是CMOS,都存在一个缺点:单线传输信号(Rx、Tx),很容易受到外界的干扰
如5V TTL,外界干扰当大于5V时候,会将高电平拉低

为此,我们可以采用两根线传输信号,取两者的差值。

2)差分电平

LVDS(Low Voltage Differential Signal)即低电压差分信号,LVDS接口又称RS644总线接口。
它的传输机制是把TTL逻辑电平转换成低电压差分信号,以便于高速传输

3)RS232

RS232:Recommended standard 推荐标准

严格来说,RS232/R485并不是通信协议,而是建立在串口通信UART基础上的电气接口.
其电平值如下:

  • 逻辑1:-3~-15V
  • 逻辑0:+3~+15V

其接口形如下:

引脚定义如下:

1.3 通信方向

详细可参见:https://www.shouxicto.com/article/6214.html

通信根据传输的方法分为单方向通信,即 单工;和双向通信,即双工.

  • 单工:即数据传输只在一个方向上传输,方向是固定的,不能实现双向通信。比如收音机和广播。

  • 半双工:传输方向可以切换,允许数据在两个方向上传输。但是某个时刻,只允许数据在一个方向上传输,可以基本双向通信。

收发数据使用同一条线,比如单行道,根据时间切换行进的方向
RS485属于半双工通讯。

  • 全双工:允许数据同时在两个方向传输,发送和接收完全独立,在发送的同时可以接收信号,或者在接收的同时可以发送。它要求发送和接收设备都要有独立的发送和接收能力。

收发各一条线,好比双车道。
比如RS232、RS422就属于全双工通讯。
c

1.4 串并行

  • 串行就是数据是一位一位的发送
  • 并行就是数据一组一组的发送


并行 VS 串行:

1)速率

并行总线由于是多个数据同时传输,需要考虑数据的协同性,这就导致了并行传输的频率不能做的很高
串行总线只有一条链路,就可以把频率做的很高,提高传输速度

2)抗干扰

并行总线两根相邻的链路其数据是同时传输的,这就会导致它们彼此之间会产生严重干扰,并行的链路越多,干扰越强;

并行的链路越多,干扰越强。因此并行总线需要加强抗干扰的能力,否则传输过程中数据就可能被损坏。如果传输过程中数据故障了,就需要重新对齐数据再传输

串行总线如果一个数据出错了,只需要重新传输一次就好了,由于串行总线频率高,很快就可以把错误数据重新传输过去

3)线路针脚

并行总线是多链路一块传输数据,就需要很多线,接口需要很多针脚
串行总线只需要很少的几个针脚即可

2. UART

UART:Universal Asynchronous Receiver-Transmitter, 通用异步收发器

  • 串口:嵌入式里指的是UART口,常用TTL电平即3.3V或者5.0V;
  • COM口:台式机上常用的口,DB9那种接口,接口协议只有两种RS232和RS485;

UART口、COM口指的是物理接口形式;TTL、RS232和RS485指的是电平逻辑标准

2.1 硬件结构

UART是串口总线,但无时钟信号,所以称为异步串行总线

也正是由于其无时钟信号,使得收发双方无一个统一的时钟标准,以各自的时钟为准,为了防止偏移的累计误差,使得每次发送数据的位数不超过8bit

在嵌入式系统中,UART可用于板内通信(芯片和芯片间),也可用于板间通信,由于其结构简单、传输距离相对长,因此被广泛使用;

1)板内通信


接线方式为:A---------B

  • TX --> RX
  • RX <-- TX
  • RTS ---> CTS
  • CTS <--- RTS

CTS/RTS用于硬流控,协调双方收发,保证数据不丢失

芯片A通过UART发送数据,当芯片B拉高RTS时,A就会暂停发送,当芯片B拉低RTS时,A又会继续发送。

2)板间通信

板间通信一般情况下只用 Rx、Tx、GND 三条线

注意:板间通信时必须接上GND

2.2 通信协议

UART因为是串行总线,数据是一位一位的传输,其通信协议格式如下:

数据包由起始位、数据帧、奇偶校验位和停止位组成。

  • 起始位:空闲时处于高电平,当开始发送数据时,发出逻辑‘0’的信号,表示开始传输数据
  • 数据位:紧随起始位,位数一般是5-8bit,最低位优先发送
  • 奇偶校验位:检验数据位中‘1’的个数为奇数(奇校验为1,偶检验为0)/偶数(奇校验为0,偶检验为1),一般不使用该校验
  • 停止位:表示数据传输结束,电平变为高,由1-2bit组成,通常使用1bit

2.3 工作流程

UART一般具备:发送/接收缓冲区,发送/接收移位寄存器。

  • 发送/接收缓冲区:用于缓存发送/接收的数据,通常为FIFO(First In First Out)
  • 发送/接收移位寄存器:将发送/接收的数据按位排列后(先低位后高位),开始发送/接收

数据传输流程

  1. 发送数据之前,收发双方必须协商好发送的波特率,帧格式,否则无法完成数据的正确接收。

  2. 发送设备上的 UART从 CPU(微处理器或微控制器)接收并行数据,并将其放入到缓冲区中

  3. UART把缓冲区中的数据,放到移位寄存器中,即:将并行数据转换为串行数据

  4. 该串行数据被传输到接收设备上的 UART

  5. 接收 UART 在接收到串行数据后,将其转换回并行数据(通过接收移位寄存器)

  6. 将数据放置到缓冲区中,提供给 CPU。

3. IIC

如果不想看文字,可直接看 IIC的B站视频

IIC(Inter-Integrated Circuit)总线,开发公司NXP(被Philips收购),两线式的串行总线,用于连接微控制器和其外围设备。

半双工传输方式,即发送时不能接收,接收时不能发送!

传输距离较短,速率可达到400Kbps左右。

由于其结构简单,被广泛使用在CPU和IC、IC和IC连接上。

3.1 硬件链接

IIC通信线只有只有 · 两根:

  • 数据线SDA:高低电平传输二进制数据
  • 时钟线SCL:通过方波信号提供时钟节拍

IIC上可以挂载多个设备,每个设备都可以作为主机,也可以作为从机(但一般MCU/CPU作为主机),IIC支持多个主控

每个设备都具备自己的器件地址,地址通常在IC出厂时已经被厂家固定了,使用者不可更改(类似于MAC地址);少数IC厂商固定了前几位的厂商地址,留给用户定义剩余的地址。

一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控

使用IIC通信的IC器件有很多,如:陀螺仪、IMU、EEPROM存储等,通过IIC总线,可以与单片机之间进行数据传输。

3.2 通信流程

3.2.1 名词解释

在介绍通信流程前,我们必须明确几个名词术语

1)主机、从机

  • 主机:负责整个系统的任务协调与分配,一般为CPU或MCU

  • 从机:通过接收主机的指令从而完成某些特定的任务

  • 发送端:发送数据的IC器件,注意,发送端不一定为主机

  • 接收端:接收数据的IC器件

2)信号类型

  • 空闲状态:SDA和SCL同时为高时,为IIC总线的空闲状态

  • 起始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

  • 停止信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

  • 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据

接收端收到有效数据后向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。

  • 当SDA是低电平为有效应答(ACK),表示对方接收成功;
  • 当SDA是高电平为无效应答(NACK),表示对方没有接收成功(可能原因为从机忙/接收错误等)。

3.2.2 数据有效性

I2C总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位

时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定

只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化

因为当SCL是高电平时,数据线SDA的变化被规定为控制命令(START或STOP,也就是前面的起始信号和停止信号)

3.2.3 工作流程

1)注意事项

注意事项:

  • SDA线上的数据在SCL时钟“高”期间必须是稳定的

  • 只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变

  • 输出到SDA线上的每个字节必须是8位

  • 数据传送时,先传送最高位(MSB)

  • 每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成

如果一段时间内没有收到从机的应答信号,则停止发送,结束本次通信。


2)发送数据

  • IIC的IC设备的地址一般为 7

八位设备地址 = 7位从机地址 + 方向(0:write;1:Read)

  • IIC每帧数据由 9 bit 组成

如果是 发送数据,则包含 8bit数据+1bit ACK,
如果是设备 地址数据,则8bit包含7bit设备地址 1bit方向

主机向从机写数据流程:

  1. 主机首先产生START信号

  2. 发送一个从机地址,这个地址共有7位,第8位是数据方向位(R/W),0表示主机发送数据(写),1表示主机接收数据(读)

  3. 主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,则认为自己正在被主机寻址

  4. 主机等待从机的应答信号(A)

  5. 主机接收到应答:发送欲写入的寄存器地址(8bit),并等待从机应答

    • 当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号
    • 当主机未收到应答信号,说明接收端未收到数据(地址不存在或设备忙)或者无法解析该数据,由master决定来如何处理(stop 或者 repeat send)
  1. 主机产生停止信号,结束传送过程。

3)接收数据

主机读数据流程:

  1. 主机首先产生START信号

  2. 主机发送一个从机地址,注意此时该地址的第8位为0,因为后面一帧要写寄存器地址,这时候主机等待从机的应答信号(ACK)

  3. 当主机收到应答信号时,写欲读取的寄存器地址(8bit)

  4. 当收到应答时,再次发送一个起始信号

  5. 再次发送从机地址,注意此时第8位为1,表示读取数据

  6. 等待从机响应

  7. 开始发送数据,每8bit数据一组,每组都需要接收方的应答信号

  8. 当接收完成后,主机若不应答,表示不在接收数据;否则应答后继续接收数据

  9. 接收完成后,主机进产生停止信号,结束传送过程。

4. SPI

如果不想看文字,可直接看 SPI的B站视频

    SPI(Serial Peripheral interface,串行外围设备接口),是美国摩托罗拉公司(Motorola)最先推出的一种同步串行传输规范。它是一种单片机外设芯片串行扩展接口,是一种 高速、全双工、同步通信 总线,主要应用在 EEPROM、FLASH、RTC,ADC/DAC,DSP等设备之间.

4.1 组成结构

   SPI有主、从两种模式,通常由一个主模块和一个或多个从模块组成(SPI不支持多主机). 主模块选择一个从模块进行同步通信,从而完成数据的交换。提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave),SPI接口的读写操作,都是由主设备发起,当存在多个从设备时,通过各自的片选信号进行管理。

一主一从连接

一主多从连接

SPI由四根线组成:

  • MISO( Master Input Slave Output):主设备数据输入,从设备数据输出;
  • MOSI(Master Output Slave Input):主设备数据输出,从设备数据输入;
  • SCLK(Serial Clock):时钟信号,由主设备产生;
  • CS/SS(Chip Select/Slave Select):从设备使能信号,由主设备控制,一主多从时,CS/SS是从芯片是否被主芯片选中的控制信号,只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效

4.2 通信过程

SPI主设备和从设备都有一个 串行移位寄存器,主设备通过向它的SPI串行寄存器写入一个字节来发起一次传输。

SPI数据通信的流程可以分为以下几步:

  • 1、主设备发起信号,将CS/SS拉低(一般芯片的片选都是低电平有效,具体还要看slave的芯片手册),启动通信。

  • 2、主设备通过发送时钟信号,来告诉从设备进行写数据或者读数据操作(采集时机可能是时钟信号的上升沿或下降沿。

  • 3、主机(Master)将要发送的数据写到发送数据缓存区(Menory),缓存区经过移位寄存器(缓存长度不一定,看单片机配置),串行移位寄存器通过MOSI信号线将字节一位一位的移出去传送给从机,同时MISO接口接收到的数据经过移位寄存器一位一位的移到接收缓存区。

  • 4、从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换。

看文字太枯燥,举个栗子:

4.2.1 设备选择

  • 当SPI主设备读/写从设备时,它首先拉低从设备对应的SS线(注意,SS只有主设备可以操控)。
  • 接着开始发送工作脉冲到时钟线上,
  • 在相应的脉冲时间上,主设备把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。

数据的发送和接收,都是从最高位MSB → 最低位LSB

4.2.2 设备时钟

SPI时钟特点主要包括:时钟速率、时钟极性和时钟相位三方面。

1)时钟频率

SPI总线上的主设备必须在通信开始时候配置并生成相应的时钟信号。

理论上讲,时钟频率可以无限大,但受限于主控所能提供的最大时钟频率(晶振的频率都是有限的)和SPI所能承受的最大传输速率。

2)时钟极性

时钟极性通常写为CKP或CPOL。
时钟极性和相位共同决定读取数据的方式,比如信号上升沿读取数据还是信号下降沿读取数据。

CKP可以配置为1或0。这意味着你可以根据需要将时钟的默认状态(IDLE)设置为高或低。极性反转可以通过简单的逻辑逆变器实现。你必须参考设备的数据手册才能正确设置CKP和CKE。

  • CKP = 0:时钟空闲IDLE为低电平 0;
  • CKP = 1:时钟空闲IDLE为高电平1。

3)时钟相位

时钟相位通常写为CKE或CPHA。顾名思义,时钟相位/边沿,也就是采集数据时是在时钟信号的具体相位或者边沿;

  • CKE = 0:在时钟信号SCK的第一个跳变沿采样;
  • CKE = 1:在时钟信号SCK的第二个跳变沿采样。

4.2.3 四种模式

根据SPI的时钟极性和时钟相位特性可以设置4种不同的SPI通信操作模式,它们的区别是定义了在时钟脉冲的哪条边沿转换(toggles)输出信号,哪条边沿采样输入信号,还有时钟脉冲的稳定电平值(就是时钟信号无效时是高还是低),详情如下所示:

  • Mode0:CKP=0,CKE =0:当空闲态时,SCK处于低电平,数据采样是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。

  • Mode1:CKP=0,CKE=1:当空闲态时,SCK处于低电平,数据发送是在第2个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

  • Mode2:CKP=1,CKE=0:当空闲态时,SCK处于高电平,数据采集是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

  • Mode3:CKP=1,CKE=1:当空闲态时,SCK处于高电平,数据发送是在第2个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

举个例子,下图是SPI Mode0读/写时序,可以看出SCK空闲状态为低电平,主机数据在第一个跳变沿被从机采样,数据输出同理。

4.3 SPI优缺点

- 优点

  • 无起始位和停止位,因此数据位可以连续传输而不会被中断;

  • 没有像I2C这样复杂的从设备寻址系统;

  • 数据传输速率比I2C更高(几乎快两倍);

  • 分离的MISO和MOSI信号线,因此可以同时发送和接收数据;

  • 极其灵活的数据传输,不限于8位,它可以是任意大小的字;

  • 非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

- 缺点

  • 使用四根信号线(I2C和UART使用两根信号线);

  • 无法确认是否已成功接收数据(I2C拥有此功能);

  • 没有任何形式的错误检查,如UART中的奇偶校验位;

  • 只允许一个主设备;

  • 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);

  • 没有定义硬件级别的错误检查协议;

  • 与RS-232和CAN总线相比,只能支持非常短的距离;

5. UART、SPI、IIC 对比

标签:发送,UART,主机,通信协议,STM32,SPI,信号,数据,时钟
From: https://www.cnblogs.com/Jimmy1988/p/17207174.html

相关文章

  • STM32F407 学习 (0) 各种外设功能
      本文对正点原子STM32F4探索者的基本功能及外设作最基本的介绍,随笔者本人的学习进程(基本按照正点原子)而不定时更新,起到总结的作用。一、HAL库编写程序的运行逻辑  ......
  • STM32+ESP8ESP8266+SoftAP一键配网接入物联网平台
       Wi-Fi配网,指由外部向Wi-Fi设备提供SSID和密码(PSW),让Wi-Fi设备可以连接指定的热点或路由器,并加入后者所建立的Wi-Fi网络。   对于具备丰富人机界面包......
  • Quartus+Modelsim联合仿真
     软件版本:QuartusII18.1StandardEdition+ModelSimSE-6410.1 1、Quartus选项设置选择tool—》options—》General—》EDAToolOptions,在ModelSim一栏填写Mode......
  • STM32 HAL库学习 (3) 中断!
    一、EXTI的HAL库驱动前面讲解HAL_GPIO_Init函数的时候有提到过:HAL库的EXTI外部中断的设置功能整合到HAL_GPIO_Init函数里面,而不是单独独立一个文件。所以我们......
  • [linux][uart] open uart error
    questionExitcode2-cannotopendevice/dev/ttyUSB0microcom-s115200-p/dev/ttyUSB0Usage:microcom[options][options]include:-p,--port=<devfil......
  • STM32 HAL库学习 (2) USART实验
    使用STM32F407串口:PA9、PA10(利用CH340G驱动)1.stm32f4xx_hal_uart.c函数说明HAL_UART_Init函数要使用一个外设首先要对它进行初始化,所以先看串口的初始化函数,其声明......
  • STM32 HAL库学习(F407ZGT6) (1)-晶振/时钟树
    对于STM32F4系列的芯片,正常工作的主频可以达到168Mhz,但并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十Khz的时钟即可。同一个电路,时钟越快......
  • stm32F0中断系列详解
    1、中断的概念 概念:程序执行过程中CPU会遇到一些特殊情况,是正在执行的程序被“中断”,cpu中止原来正在执行的程序,转到处理异常情况或特殊事件的程序去执行,结束后再返......
  • Quartz组件的搭建及实现任务调度demo
    1.基本环境配置<dependency>​<groupId>org.slf4j</groupId>​<artifactId>slf4j-log4j12</artifactId>​<version>1.7.25</version>​</dependency><d......
  • keil在线调试STM32,点三次运行才能跑到main的问题
    遇到的问题是,在include了,并调用对象的pushback()函数,就会出现需要点击3次才能全速运行。目前解决的办法是勾选microlib选项,但会出现警告说microlib不支持C++暂不清楚这......