> 技术文档 > 单片机——通信_单片机阻塞发送和队列发送的区别

单片机——通信_单片机阻塞发送和队列发送的区别


一、通信基础知识

1.时钟信号划分

同步通信:通信双方根据同步信号通信,比如双方有一个共同的时钟信号

发送数据的时候会出现阻塞状态,需要等待数据传输完毕,程序才会执行到下一行

异步通信:通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步(UART)

发送数据的时候没有阻塞状态,执行发送数据语句后直接执行下一行语句

波特率(115200 9600 34800)

2、通信方式划分

串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

串行传输:数据一位一位串起来,逐个传输,数据按位顺序传输。

优点:占用引脚资源少

缺点:速度相对较慢

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行

并行传输:使用多根线同时传输一个字的多个位,如 8 根线一次传输 8 个位。

优点:速度快

缺点:占用引脚资源多

3、通信方向划分

单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机

一根信号线只能单向发送或单向接收

半双工:可以收,可以发,但是不能同时收发, 比如对讲机

一根信号线可以接收数据也可以发送数据,但是两者不能同时进行

全双工:可以在同一时刻既接收,又发送。 手机

两根信号线,一根发送数据,另一根接收数据,真正实现同时收发数据,速度快

二、串口通信

一、UART(通用异步收发器)、USART(通用同步/异步收发器)

1)协议特点:

①异步、全双工、串行通信。异步:没有时钟线;全双工且串行:有两条数据线!

串口通信是低位先行!

2)串口通信协议:

①停止位为1.5位:‌‌是时间概念,停止位的“位”指‌时间单位‌而非物理位数。例如波特率为9600bps时,1位时间≈104μs,此时1.5停止位对应约156μs的高电平信号‌。

3)实际串口通信协议:

①在串口通信协议中,‌空闲状态的电平必须为高电平‌(逻辑1);

②接收双方必须配置相同的波特率(异步通信);

③不使用奇偶校验的原因:串口通信使用在较近的情况下,一般不会出错!

4)USART的结构框图

发送流程

○ CPU 将数据写入 TDR。(软件)

硬件自动将 TDR 数据复制到移位寄存器。(硬件)

○ 移位寄存器逐位将数据发送到 TX 引脚---引脚的复用功能(输出)。

接收流程

○ 数据到达 RX 引脚

○ 移位寄存器逐位收集数据。

○ 数据完整后硬件自动转移至 RDR

二、实现(串口发送和接收)

1.函数重定向:将原本输入到stdin/stdout的输出到TDR/RDR

①printf()

②scanf():发送时需要\\n来刷新行缓存

2.HAL库函数

HAL_StatusTypeDef

HAL_UART_Transmit(UART_HandleTypeDef *huart,constuint8_t*pData,uint16_t Size,uint32_t Timeout)

功能:以阻塞模式通过串口发送数据

参数:UART_HandleTypeDef * huart 设备的句柄(用的是哪个串口)

uint8_t* pData 要输出的缓存区首地址 要发送的内容的地址)

uint16_t Size 发送的数据量 (发送多少个字节的数据)

uint32_t Timeout 超时时间(在一段时间内如果没有发送,就超时不会再发送)

返回值:成功1,失败0

一个中文占两个字符

HAL_StatusTypeDef

HAL_UART_Receive(UART_HandleTypeDef *huart,uint8_t*pData,uint16_t Size,uint32_t Timeout)

功能:以阻塞模式通过串口接收数据

参数:UART_HandleTypeDef * huart 设备的句柄

uint8_t* pData 输入缓存区首地址

uint16_t Size 接收的数据量

uint32_t Timeout 超时时间(会等待这些时间来接收数据)

返回值:接收状态

三、SPI通信

一、SPI通信

SPI是一种同步串行通信协议,以其全双工高速率简单硬件结构优于UART。它包括MISO、MOSI、SCLK和SS四条线,通过时钟极性和相位配置实现不同模式的通讯SPI支持多从机模式,如多NSS或菊花链连接,但缺乏硬件级别的错误检查协议,并且通常仅支持一个主设备。在STM32等微控制器中,通过HAL库可以方便地实现SPI编程。

二、SPI通信的特点:

1. 一主多从

2. 每一个从设备都有一个独立控制的片选线

3. 主设备可以发送数据到从设备,从设备也可以发送数据到主设备。可以全双工通信。

4. 只有主机才能发送时钟信号

三、SPI的总线协议:

起始信号: NSS信号线由高变低 (NSS是片选信号,使能信号)

结束信号:NSS信号由低变高,是SPI通讯的停止信号

数据传输:SPI通信以字节为单位进行数据传输,每个字节的最高有效位(MSB)先传输,然后是次高有效位,依此类推,直到最低有效位(LSB)传输完毕(高位传输)。在数据传输过程中,每次接收到的数据必须在下次数据传输前被采样,否则可能会导致数据丢失或SPI模块失效。

触发:是主机把信号发送到MOSI的信号线上,

采样:是从机从MOSI的信号线上去获取数据。

四、SPI的四种工作模式:

由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,因此通常主机要按照从机支持的模式去设置

  • 时钟极性(CPOL)和时钟相位(CPHA)

时钟极性CPOL : 设置时钟空闲时的电平

当CPOL = 0 ,SCK引脚在空闲状态保持低电平;

当CPOL = 1 ,SCK引脚在空闲状态保持高电平。

时钟相位CPHA :设置数据采样时的时钟沿

当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样

当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样

SPI中时钟的极性和相位的作用是什么?

1)SPI的时钟极性用来表示时钟信号在空闲时是高电平还是低电平。

2)SPI的相位决定何时进行信号采样,在第一个跳变沿还是第二个跳变沿。

  • 主机跟随从机设置始终极性和时钟相位

采样时时钟线边沿:当数据线稳定时用于采样,看时钟线的边沿是奇数边沿还是偶数边沿!

五、实现控制数码管的小实验

  • 14脚:DS(SER),串行数据输入引脚
  • 13脚:OE,输出使能控制脚,它是低电才使能输出,所以接GND
  • 12引脚:存储寄存器时钟输入引脚,上升沿的将移位寄存器的数据转移到存储寄存器中;

  • 11引脚:移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从SER输入);移走的是最早输入的高位
  • 9引脚:串行数据出口引脚。当移位寄存器中的数据多于8bit时,会把已有的bit“挤出去”,就是从这里出去的。用于595的级联
  • 将高位的挤走并进入U6的14引脚,来控制选哪个数码管!!

选哪个数码管:QA置1选择第一位数码管;QB置1选择第二位数码管;QC置1选择第三位数码管;QD置1选择第四位数码管;

四、I2C通信

一、I2C通信协议

IIC(Inter-Integrated Circuit)是一个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线,属于半双工同步传输类型总线。IIC总线是非常常见的数据总线,仅仅使用两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA。不同的器件,都是并联接在这两条线上,I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。

多主从的同步串行半双工

1、 当主机没有选择任何从机时,每个从机的SDA口都是输入模式

2、 当主机选择完从机,即发送完了地址和操作位时,此时所有未被选中的从机的SDA口配置为高阻态,被选择的从机在读取数据时为输入模式,在发送确认位或者数据时SDA口为输出模式。

3、 当主机结束通信,所有的从机的SDA口配置为输入模式。

I2C的特点:

通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(控制SCL的电平高低变换)谁就是主设备。

● IIC主设备功能:主要产生时钟,产生起始信号和停止信号

● IIC从设备功能:可编程的IIC地址检测,停止位检测

● IIC的一个优点是它支持多主控(multimastering),其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

● 支持不同速率的通讯速度,标准速度(最高速度100kHZ), 快速(最高400kHZ),比uart高,比spi低

● SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。

● IIC是半双工,而不是全双工 ,同一时间只可以单向通信,IIC协议首先是发送从机硬件地址,然后发送命令,再发送数据/寄存器编号或者读取数据。IIC协议可以多字节连续读写数据。

● 各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。

iic的发送长度不可以变化,规定好了!8+1(主设备发送八位,从设备发送一位应答位)

为什么使用上拉电阻?

答:总线空闲的时候,SDA和SCL都是高电平。当其中一个设备拉低总线,整条线就全是低电平,器件与器件之间变为\"与\"关系。

为了避免总线信号收到从设备的干扰,各设备连接到总线的输出端时必须是漏极开路(OD)输出,即高阻态,无法主动输出高电平,需要外部上拉电阻才可以获得高电平。

二、时序图

(一)基本概念:

当SCL时钟线为高电平时:SDA由高电平变成低电平(起始)

当SCL时钟线为高电平时:SDA由低电平变成高电平(结束)

发送数据时:

当SCL时钟线为高电平时:SDA的电平应该保持不变,这样也就是发送的0/1

当SCL时钟线为低电平时:SDA可以改变成发送数据。

(二)四种模式

1.从机寻址:

①主机从从机中一个字节的数据

②主机从从机中读取多个字节的数据

③主机从从机中读取一个字节的数据

④主机从从机中读取多个字节的数据

五、总结

串口通讯:

点对点通讯,异步,全双工,串行,传送数据低位先行,传输速度在112kb左右

SPI通讯:

一对多,同步,串行,全双工,传输数据高位先行,传输速度在几M到几十M之间,占用引脚多,每增加一个从机都增加一个片选线。

IIC通讯:

多主从,同步,串行,半双工,传输数据高位先行,传输速度一个是100kb,最快400kb