单片机——通信_单片机阻塞发送和队列发送的区别
一、通信基础知识
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