USART串口全双工与SPI全双工通信的区别!

目录

 

1.背景知识

2.SPI的全双工同通信

3.串口USART的全双工通信


背景知识

首先我们先来区分一下单工、半双工、全双工模式。

单工:数据传输只支持数据在一个方向上传输

半双工:允许数据传输在两个方向传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。

全双工:允许数据同时在两个方向上传输,它要求发送设备和接收设备都有独立的接收和发送能力;在同一时间可以同时接受和发                 送信息,实现双向通信。

 

现在我们进入今天的主题:串口的全双工与SPI的全双工有什么区别?

SPI的全双工同通信

SPI内部结构

仔细观察上图,可以看到

一个SPI接口中只有一个移位寄存器 

SPI通信双方

由于一个SPI接口只有一个移位寄存器的原因,主机在将移位寄存器的数据一位位传输到从机的移位寄存器的同时,从机也将自己移位寄存器里的数据一位位传输到主机的移位寄存器中。这就是一个全双工模式的数据传输过程,主要原因就是因为一个SPI中只有一个移位寄存器(你传输的数据进入从机的移位寄存器,将它的数据一位位“挤”了出来)。

串口USART的全双工通信

单片机的串口是有全双工模式的,但是,注意了(敲黑板了)!

单片机的串口的全双工模式并不是真正意义上的全双工,它的串口不能同时实现双向的数据传输,但它的通信双方的连线同全双工是一样的(你的RX—我的TX,我的TX—你的RX)。这类似与可切换传输方向的半双工通信

造成这种现象的原因是什么呢?

串口内部结构

 

仔细观察图片,我们可以看到

一个串口接口中有2个移位寄存器:发送移位寄存器和接收移位寄存器。

 有两个单独的移位寄存器,数据就不会同时双向的传递了。A发送的数据通过自己的发送移位寄存器传输给B的接受移位寄存器,由于B的发送与接受移位寄存器是独立的,所以B就不会把自己发送移位寄存器的数据传输给A的接受移位寄存器。

我们上面说过,SPI全双工传输的主要原因是因为它的内部只有一个移位寄存器(发送与接受共用一个移位寄存器,所以就会出现“挤”的过程)。

  • 14
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
您可以使用STM32G0系列的GPIO和USART功能来实现SPI通信串口打印接收的数据。下面是一个简单的示例代码,可以帮助您理解如何实现这一功能: ```c #include "stm32g0xx.h" void SPI_Init(void); void USART_Init(void); void USART_Print(char *msg); int main(void) { // 初始化SPIUSART SPI_Init(); USART_Init(); while (1) { // 发送SPI数据 // ... // 接收SPI数据 // ... // 将接收到的数据通过串口打印出来 char msg[32]; sprintf(msg, "Received data: %d\r\n", receivedData); // 假设接收到的数据为整数类型 USART_Print(msg); // 延时一段时间 for (volatile int i = 0; i < 100000; i++); } } void SPI_Init(void) { // 使能SPI时钟 RCC->APBENR2 |= RCC_APBENR2_SPI1EN; // 配置SPI引脚 // ... // 配置SPI寄存器 SPI1->CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1; // 设置SPI时钟分频,这里选择PCLK/8 SPI1->CR1 |= SPI_CR1_SPE; // 使能SPI } void USART_Init(void) { // 使能USART时钟 RCC->APBENR2 |= RCC_APBENR2_USART1EN; // 配置USART引脚 // ... // 配置USART寄存器 USART1->BRR = 16000000 / 115200; // 设置波特率为115200 USART1->CR1 |= USART_CR1_TE; // 使能发送 USART1->CR1 |= USART_CR1_RE; // 使能接收 USART1->CR1 |= USART_CR1_UE; // 使能USART } void USART_Print(char *msg) { // 等待发送缓冲区为空 while (!(USART1->ISR & USART_ISR_TXE)); // 发送数据 while (*msg) { USART1->TDR = *msg++; while (!(USART1->ISR & USART_ISR_TXE)); } } ``` 请注意,在以上代码中,您需要根据实际情况配置SPIUSART的引脚。另外,需要根据您的具体需求来编写SPI发送和接收数据的代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值