0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L083的UART单线半双工模式介绍

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-10-24 17:49 次阅读

一、简介

半双工即Half duplex Communication,是指在通信过程的任意时刻,信息既可由A传到B,又能由B传A,但同时只有一个方向上的传输存在。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。半双工方式适用于终端与终端之间的会话式通信。

二、实际操作(以CW32L083为例)

设置 UARTx_CR2.SIGNAL 为 1 使 UART 工作于单线半双工工作模式。在该模式下,使用 UARTx_TXD 引脚进行数据的发送和接收,不占用 UARTx_RXD 引脚(UARTx_RXD 可作通用 IO 使用)。写数据到 UARTx_TDR 寄存器后,UARTx_TXD 引脚立即进入发送状态,输出 UARTx_TDR 寄存器中的数据。数据 发送完成后,UARTx_TXD 引脚恢复到常态的接收状态。没有发送数据时,UARTx_TXD 引脚处于接收状态,数据接收完成后,接收完成标志位 UARTx_ISR.RC 会被硬件置 位,此时应尽快读取 UARTx_RDR 寄存器,并清除 UARTx_ISR.RC 标志位。

wKgZomUDxzaAEMaEAAB2fxGkwrI184.png

UART工作在单线半双工模式时,UARTx_TXD引脚需要配置为开漏输出。另外用户应采取适当的应用层保护机制,以确保不会出现多主机同时向总线发送数据。

三、UART单线半双工通信示例

硬件采用CW32L083VxTx StartKit单板,用杜邦线连接PA08和PA06引脚。

UARTy查询方式发送TxBuffer1缓冲区中的数据,UARTz查询方式接收数据,并存储到RxBuffer2缓冲区。

UARTz查询方式发送TxBuffer2缓冲区中的数据,UARTy查询方式接收数据,并存储到RxBuffer1缓冲区。

比较TxBuffer1和RxBuffer2、TxBuffer2和RxBuffer1,如果数据一致,则LED1亮,否则LED2亮。

1、配置RCC

voidRCC_Configuration(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV6);//SYSCLK=HSI=8MHz=HCLK=PCLK
RCC_AHBPeriphClk_Enable(UARTy_GPIO_CLK|UARTz_GPIO_CLK|
RCC_AHB_PERIPH_GPIOC,ENABLE);//外设时钟使能
UARTy_APBClkENx(UARTy_CLK,ENABLE);
UARTz_APBClkENx(UARTz_CLK,ENABLE);
}

2、配置GPIO

voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure={0};
UARTy_AFTX;//UARTTX复用
UARTz_AFTX;U
ARTy_TXPUR;//UARTTXPUR
UARTz_TXPUR;
GPIO_InitStructure.Pins=UARTy_TxPin;
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;//开漏输出
GPIO_Init(UARTy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=UARTz_TxPin;
GPIO_Init(UARTz_GPIO, GPIO_InitStructure);

GPIO_InitStructure.Pins=GPIO_PIN_3|GPIO_PIN_2;//PC3LED1/PC2LED2
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, GPIO_InitStructure);P
C03_SETLOW();//LED灭
PC02_SETLOW();
}

3、配置UART

voidUART_Configuration(void)
{
UART_InitTypeDefUART_InitStructure={0};

UART_InitStructure.UART_BaudRate=UARTyz_BaudRate;//波特率
UART_InitStructure.UART_Over=UART_Over_16;//采样方式
UART_InitStructure.UART_Source=UART_Source_PCLK;//传输时钟源
UCLKUART_InitStructure.UART_UclkFreq=UARTyz_UclkFreq;//传输时钟UCLK频率
UART_InitStructure.UART_StartBit=UART_StartBit_FE;//起始位判定方式
UART_InitStructure.UART_StopBits=UART_StopBits_1;//停止位长度
UART_InitStructure.UART_Parity=UART_Parity_No;//校验方式
UART_InitStructure.UART_HardwareFlowControl=UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode=UART_Mode_Rx|UART_Mode_Tx;//发送/接收使能
UART_Init(UARTy, UART_InitStructure);
UART_Init(UARTz, UART_InitStructure);
}

4、定义变量

//UARTy
#defineUARTyCW_UART1
#defineUARTy_CLKRCC_APB2_PERIPH_UART1
#defineUARTy_APBClkENxRCC_APBPeriphClk_Enable2
#defineUARTy_GPIO_CLKRCC_AHB_PERIPH_GPIOA
#defineUARTy_GPIOCW_GPIOA
#defineUARTy_TxPinGPIO_PIN_8
#defineUARTy_AFTXPA08_AFx_UART1TXD()
#defineUARTy_TXPURPA08_PUR_ENABLE();

//UARTz
#defineUARTzCW_UART2
#defineUARTz_CLKRCC_APB1_PERIPH_UART2
#defineUARTz_APBClkENxRCC_APBPeriphClk_Enable1
#defineUARTz_GPIO_CLKRCC_AHB_PERIPH_GPIOA
#defineUARTz_GPIOCW_GPIOA
#defineUARTz_TxPinGPIO_PIN_6
#defineUARTz_AFTXPA06_AFx_UART2TXD()
#defineUARTz_TXPURPA06_PUR_ENABLE()
#defineUARTyz_BaudRate9600
#defineUARTyz_UclkFreq8000000
#defineTxBufferSize1(ARRAY_SZ(TxBuffer1)-1)
#defineTxBufferSize2(ARRAY_SZ(TxBuffer2)-1)
typedefenum{FAILED=0,PASSED=!FAILED}TestStatus;
TestStatusBuffercmp(uint8_t*pBuffer1,uint8_t*pBuffer2,uint16_tBufferLength);
uint8_tTxBuffer1[]="rnCW32L083UARTHalfDuplex:UARTy->UARTzrn";
uint8_tTxBuffer2[]="rnCW32L083UARTHalfDuplex:UARTz->UARTyrn";
uint8_tRxBuffer1[TxBufferSize2];uint8_tRxBuffer2[TxBufferSize1];
uint32_tNbrOfDataToRead1=TxBufferSize2;
uint32_tNbrOfDataToRead2=TxBufferSize1;
uint8_tTxCounter1=0,RxCounter1=0;
uint8_tTxCounter2=0,RxCounter2=0;
volatileTestStatusTransferStatus1=FAILED,TransferStatus2=FAILED;

5、主程序

int32_tmain(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
UART_Configuration();//配置UART
UART_HalfDuplexCmd(UARTy,ENABLE);//单线半双工UARTy
UART_HalfDuplexCmd(UARTz,ENABLE);//单线半双工UARTz
while(NbrOfDataToRead2--)//UARTy->UARTz
{
//UARTy发送一个字节数据
UART_SendData_8bit(UARTy,TxBuffer1[TxCounter1++]);
while(UART_GetFlagStatus(UARTy,UART_FLAG_TXE)==RESET);
//UARTz等待RC
while(UART_GetFlagStatus(UARTz,UART_FLAG_RC)==RESET);
UART_ClearFlag(UARTz,UART_FLAG_RC);
RxBuffer2[RxCounter2++]=UART_ReceiveData_8bit(UARTz);
}
while(NbrOfDataToRead1--)//UARTz->UARTy
{
//UARTz发送一个字节数据
UART_SendData_8bit(UARTz,TxBuffer2[TxCounter2++]);
while(UART_GetFlagStatus(UARTz,UART_FLAG_TXE)==RESET);
//UARTy等待RC
while(UART_GetFlagStatus(UARTy,UART_FLAG_RC)==RESET);
UART_ClearFlag(UARTy,UART_FLAG_RC);
RxBuffer1[RxCounter1++]=UART_ReceiveData_8bit(UARTy);
}
//检查收发数据一致性
TransferStatus1=Buffercmp(TxBuffer1,RxBuffer2,TxBufferSize1);
TransferStatus2=Buffercmp(TxBuffer2,RxBuffer1,TxBufferSize2);
if(TransferStatus1==PASSED  TransferStatus2==PASSED)//PASSED
{
//LED1亮
PC03_SETHIGH();
}
else//FAILED
{
PC02_SETHIGH();//LED2亮
}
while(1)
{
}
}

6、测试结果:UART半双工通信方式工作正常, LED1亮。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 半双工
    +关注

    关注

    0

    文章

    13

    浏览量

    9040
  • uart
    +关注

    关注

    22

    文章

    1235

    浏览量

    101383
  • 单线
    +关注

    关注

    0

    文章

    6

    浏览量

    8944
收藏 人收藏

    评论

    相关推荐

    请问可以关闭FPD-LINKIII的全双工模式,只实现data stream的传输吗?

    为了测试 DS90UB903Q的tJIND&tJINR参数,需要将FPD-LINKIII上的控制信号去掉。如果不去掉,ROUT接口的波形是控制信号和数据信号的叠加。 请问可以关闭FPD-LINKIII的全双工模式,只实现data stream的传输吗?
    发表于 12-26 06:26

    CW32L010demo

    双工、同步半双工单线半双工模式,支持硬件数据流控和多机通信,还支持 LIN(局域互连网络);可编程数据帧结构,可以通过小数波特率发生器提供宽范围的波特率选择。内置定时器模块,支持等
    发表于 12-25 17:41

    以太网端口双工模式是什么意思

    以太网端口双工模式是指以太网端口在数据传输过程中,能够同时发送和接收数据的能力或方式。双工模式对于网络性能和数据传输效率具有重要影响。以下是关于以太网端口双工模式的详细介绍,包括其定义
    的头像 发表于 10-08 10:14 809次阅读

    单工、半双工和全双工传输模式的区别

    传输模式主要分为单工(Simplex)、半双工(Half-Duplex)和全双工(Full-Duplex)。这三种模式在数据传输能力、通信效率和应用场景等方面存在显著差异。
    的头像 发表于 08-07 14:32 1130次阅读

    esp32-s3全双工需要两个iis组合,这样全双工模式下两个iis使用的引脚是否可以配置成一样呢?

    api参考说单个iis只能半双工,全双工需要两个iis组合,这样全双工模式下两个iis使用的引脚是否可以配置成一样呢? 另lcd外设会占用iis么
    发表于 06-19 07:58

    双工半双工技术解析

    随着信息技术的迅猛发展,通信系统的性能要求日益提高。在数据传输中,双工模式的选择对于提高系统效率、降低通信延迟具有重要意义。 一、全双工模式双工模式允许数据在通信链路的两个方向上同时进行传输,即
    的头像 发表于 06-16 10:18 751次阅读

    PSoC5 UART半双工模式UART_LoadTxConfig() 之后传输数据时的疑问求解

    我目前正在尝试使用内置的 UART 组件传输数据 CY8C5888LTI-LP097。UART配置为半双工模式,速率为 9600 Bd,数据位为 8,偶校验。我的代码如下所示
    发表于 05-31 10:13

    双工半双工技术解析及其应用场景

    随着信息技术的迅猛发展,通信系统的性能要求日益提高。在数据传输中,双工模式的选择对于提高系统效率、降低通信延迟具有重要意义。本文将对全双工半双工两种双工模式进行详细解析,并探讨它们各
    的头像 发表于 05-11 15:29 1318次阅读

    使用STM32F072 USART单线半双工模式通信,只要打开IDLE中断就会一直触发IDLE中断怎么解决?

    使用STM32F072 USART单线半双工模式通信,想要利用DMA+IDLE方式接收不定长数据,发现只要打开IDLE中断,就会一直触发IDLE中断。有没有高手遇到过?怎么解决?
    发表于 04-22 06:18

    节省IO的小技巧:GD32 MCU如何使用一个GPIO实现串口半双工收发

    一般情况串口的接受和发送分别需要使用TX和RX两个引脚来实现,但在一些UART的实际应用中,通信双方身份为主机和从机,数据流是半双工的,那么当IO口资源紧张时可以使用半双工模式通过一个引脚实现数据的发送和接受,同时又保证数据不出
    的头像 发表于 03-15 09:39 1878次阅读
    节省IO的小技巧:GD32 MCU如何使用一个GPIO实现串口<b class='flag-5'>半双工</b>收发

    IIC总线为什么是半双工

    IIC(Inter-Integrated Circuit)总线是一种半双工的串行通信接口。在I2C总线上,主设备和从设备之间的数据传输是采用半双工模式进行的。这意味着主设备和从设备在不同的时间段内交替发送和接收数据。
    的头像 发表于 02-02 16:37 4648次阅读
    IIC总线为什么是<b class='flag-5'>半双工</b>?

    SPI全双工模式下数据接收异常的一个原因

    前面给小伙伴讲过串口发送和接收异常的可能原因,今天我们讲下SPI全双工模式下数据接收异常的一个原因。
    的头像 发表于 01-23 09:31 1346次阅读
    SPI全<b class='flag-5'>双工模式</b>下数据接收异常的一个原因

    请问如何优化CW32L083微控制器的功耗?

    在进行低功耗设计时,如何优化CW32L083系列微控制器的功耗?
    发表于 01-17 07:16

    CW32L083系列微控制器的ADC和DAC模块要如何使用?怎么配置?

    如何配置和使用CW32L083系列微控制器的ADC和DAC模块?
    发表于 01-17 06:08

    半双工和全双工通信模式的比较

    半双工和全双工通信模式的比较  半双工和全双工是两种不同的通信模式,在不同的通信需求下,它们各有
    的头像 发表于 01-09 14:00 1770次阅读