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

    文章

    16

    浏览量

    9239
  • uart
    +关注

    关注

    22

    文章

    1277

    浏览量

    104213
  • 单线
    +关注

    关注

    0

    文章

    6

    浏览量

    9078
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    求助,关于半双工模式下的Uart问题求解

    ,该引脚被配置为具有内部推挽的输入。为了传输,它被配置为推/拉。 我没有在 usic 应用说明或参考手册中看到任何关于需要此功能的信息。然而,这种重新编程会导致传输线出现故障。 我的问题是: 对于半双工模式,运行时是否必须对 tx/rx 引脚进行重新编程? 当需要时如何防止这些故障?
    发表于 07-30 07:00

    双工不匹配如何修复它

    ,确保所有相关设备的双工模式一致,例如都设置为全双工半双工。 启用自动协商功能:推荐在所有端口启用自协商功能,以便设备能够自动匹配最佳的双工模式和速度。现代设备通常支持智能匹配,可以
    的头像 发表于 07-02 09:46 ?143次阅读

    基于CW32L010的高性能温控器方案

    Cortex-M0+内核、超低功耗特性以及丰富的外设接口,为温控器设计提供了理想的解决方案。 本文将介绍无锡梓轩电子基于武汉芯源半导体低功耗CW32L010单片机开发的温控器方案,功能全面,性价比突出。 图
    发表于 07-02 09:46

    武汉芯源半导体CW32L010在两轮车仪表的应用介绍

    介绍的两轮车仪表方案是无锡梓轩电子基于武汉芯源半导体 CW32L010F8P6开发,适用于小规格电动车仪表方案,实现车辆速度、累计里程、单次里程、模式状态、故障状态显示等功能。 电动车仪表盘能够及时
    发表于 05-13 14:06

    带耦合器的大规模物联网半双工前端模块 skyworksinc

    电子发烧友网为你提供()带耦合器的大规模物联网半双工前端模块相关产品参数、数据手册,更有带耦合器的大规模物联网半双工前端模块的引脚图、接线图、封装手册、中文资料、英文资料,带耦合器的大规模物联网半双工前端模块真值表,带耦合器的大
    发表于 05-09 18:35
    带耦合器的大规模物联网<b class='flag-5'>半双工</b>前端模块 skyworksinc

    双工分轨语音数据集:让AI实现无缝对话

    双工语音交互是一种允许设备在接收语音的同时并行处理和响应的技术。在传统半双工模式下,用户需要说完一句话后等待系统响应,交互效率低且体验不自然;而全双工交互支持边听边说、实时打断和无效语音拒识等。
    的头像 发表于 04-10 09:39 ?311次阅读
    全<b class='flag-5'>双工</b>分轨语音数据集:让AI实现无缝对话

    SN65HVD3083EDGSR半双工时怎么接线?

    请问ti工程师SN65HVD3083EDGSR 这颗芯片半双工时怎么接线?
    发表于 01-01 08:12

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

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

    CW32L010demo

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

    方案介绍|CW32L010安全低功耗MCU:驱动高速风筒新力量

    芯源半导体CW32L010系列MCU可支持低成本、高性能、低功耗、高度集成的高速风筒方案,以满足市场对高效、安全、智能的高速风筒需求。 本文将介绍武汉芯源半导体CW32L010系列单片机在高速风筒
    发表于 12-10 09:57

    CW32L010学习笔记

    记录CW32L010学习过程
    的头像 发表于 11-15 17:40 ?3418次阅读
    <b class='flag-5'>CW32L</b>010学习笔记

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

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

    ISOx5隔离式3.3V半双工和全双工RS-485收发器数据表

    电子发烧友网站提供《ISOx5隔离式3.3V半双工和全双工RS-485收发器数据表.pdf》资料免费下载
    发表于 08-16 11:29 ?1次下载
    ISOx5隔离式3.3V<b class='flag-5'>半双工</b>和全<b class='flag-5'>双工</b>RS-485收发器数据表

    ISO308x隔离式5V全双工半双工RS-485收发器数据表

    电子发烧友网站提供《ISO308x隔离式5V全双工半双工RS-485收发器数据表.pdf》资料免费下载
    发表于 08-15 09:38 ?0次下载
    ISO308x隔离式5V全<b class='flag-5'>双工</b>和<b class='flag-5'>半双工</b>RS-485收发器数据表

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

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