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

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

3天内不再提示

在MM32F013x上实现UART单线半双工的功能应用

电子设计 来源:电子设计 作者:电子设计 2022-02-21 10:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文将介绍在MM32F013x上实现UART单线半双工的功能应用。

UART单线半双工简介

在使用数字舵机通讯时所用到的通信方式为UART通信,但舵机只有三根接线,除去VCC和GND,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式。在单线半双工模式下,TX 和 RX 引脚在芯片内部互连。

01 配置流程

单线半双工模式是通过设置UART_SCR寄存器的HDSEL位,在这个模式里UART_SCR 寄存器的SCEN位必须保持清零状态。

在单线半双工模式下,TX和RX引脚在芯片内部互联,使用控制位”HALF DUPLEX SEL”(UART_SCR 中的 HDSEL 位) 选择半双工和全双工通信。

注意

当选择单线半双工模式时RX 不再被使用,当有数据需要发送的时候IO才会被UART驱动,没有数据传输时TX总是被释放,所以使用单线半双工需要外部加上拉。

除此之外通讯上和正常的UART模式类似。由于是单线半双工同一时刻总线上只能有一个节点发送,所以需要软件协议层去管理线上冲突防止多个设备同时发送,当 TXEN 位被设置时,只要数据一写到数据寄存器上,发送就继续。

02 UART_SCR寄存器描述

配置UART_SCR 的HDSEL为1

UART_SCR 寄存器的SCEN位清零

初始化UART1

从官网上下载MM32F013x例程,里面有UART普通模式的配置,在这个基础上我们直接调用UART_HalfDuplexCmd(UART1,ENABLE);函数接口将串口配置成单线半双工模式,然后IO口初始化只需要配置PA9 TX即可,如下:

void UART1_NVIC_Init(u32 baudrate

{

UART_InitTypeDef UART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_UART1, ENABLE);

RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);

//UART1 NVIC

NVIC_InitStructure.NVIC_IRQChannel = UART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//Baud rate

UART_StructInit(&UART_InitStructure);

UART_InitStructure.BaudRate = baudrate;

//The word length is in 8-bit data format.

UART_InitStructure.WordLength = UART_WordLength_8b;

UART_InitStructure.StopBits = UART_StopBits_1;

//No even check bit.

UART_InitStructure.Parity = UART_Parity_No;

//No hardware data flow control.

UART_InitStructure.HWFlowControl = UART_HWFlowControl_None;

UART_InitStructure.Mode = UART_Mode_Rx | UART_Mode_Tx;

UART_Init(UART1, &UART_InitStructure);

UART_HalfDuplexCmd(UART1,ENABLE); //Half Duplex Enable

UART_ITConfig(UART1, UART_IT_RXIEN, ENABLE);

UART_Cmd(UART1, ENABLE);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);

//UART1_TX GPIOA.9

GPIO_StructInit(&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

功能验证测试

UART单线半双工功能测试我们现在拿两个MM32F0133的板子一个做主机一个做从机进行单线收发测试,主机先发送一包数据给从节点,当从节点收到这包数据后再把这包数据发回给主机,然后主机和从机两个板子PA9短接到一起,外部在加一个4.7K上拉电阻

主机函数处理:

uint8_t txbuff[10]= {0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA};

s32 main(void)

{

CONSOLE_Init(115200);//UART2 printf打印

UART1_NVIC_Init(115200);

printf(“UART Half Duplex TX Test /r/n”);

UART1_Send_Group(txbuff,sizeof(txbuff));

printf(“TX Data: ”);

for(index=0;index

主机UART的中断服务函数里面,将接从机发送的数据存放在Rx_buff里面,当收到一包数据后通过printf打印到串口,和原始发送的数据进行对比。

void UART1_IRQHandler(void)

{

u8 recvbyte;

// Send packet

if (UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET)

{

UART_ClearITPendingBit(UART1, UART_IT_TXIEN);

}

// Recv packet

if (UART_GetITStatus(UART1, UART_ISR_RX) != RESET)

{

UART_ClearITPendingBit(UART1, UART_ISR_RX);

recvbyte = UART_ReceiveData(UART1);

Rx_buff[rx_cnt] = recvbyte;

rx_cnt++;

if(rx_cnt == 10)

{

gUartRxSta = 1;

rx_cnt = 0;

}

}

}

从机函数处理:

s32 main(void)

{

CONSOLE_Init(115200);//UART2 printf打印

UART1_NVIC_Init(115200);

printf(“UART Half Duplex RX Test/r/n”);

while(1)

{

if(gUartRxSta == 1)//收到一包数据

{

gUartRxSta = 0;

UART1_Send_Group(Rx_buff,10);

memset(Rx_buff,0x00,10);

}

}

//return 0;

}

从机UART的中断服务函数里面,将接主机发送的数据存放在Rx_buff里面,当收到一包数据后通过单线半双工这个串口发送回去。

void UART1_IRQHandler(void)

{

u8 recvbyte;

// Send packet

if (UART_GetITStatus(UART1, UART_IT_TXIEN) != RESET)

{

UART_ClearITPendingBit(UART1, UART_IT_TXIEN);

}

// Recv packet

if (UART_GetITStatus(UART1, UART_ISR_RX) != RESET)

{

UART_ClearITPendingBit(UART1, UART_ISR_RX);

recvbyte = UART_ReceiveData(UART1);

Rx_buff[rx_cnt] = recvbyte;

rx_cnt++;

if(rx_cnt == 10)

{

gUartRxSta = 1;

rx_cnt = 0;

}

}

}

观察测试结果:

然后我们通过主机UART2 的printf打印可以看到主机TX Data 和从机返回的RX Data数据是一样的。

再看看下图逻辑分析仪抓取的逻辑波形,可以也可以看到主机发送的波形和从机返回的波形数据是一样的。

转自:灵动微电子

审核编辑:何安

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

    关注

    22

    文章

    1319

    浏览量

    106963
  • 灵动微电子
    +关注

    关注

    7

    文章

    137

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    高速全双工通信:数据世界的“双向快车道”

    一、什么是高速全双工通信?高速全双工通信是一种允许数据同一时间、同一信道上双向同时传输的通信方式。它不仅实现了收发并行,还支持高速率与连续传输,打破了传统
    发表于 03-17 16:15

    为什么叫“全双工”和“半双工”?

    今天聊个通信里的基础概念——全双工半双工!简单吧,简单到"UART、RS-232 和 RS-485 是全双工还是半双工?"我差点都答不上来
    的头像 发表于 02-12 11:28 639次阅读

    双工半双工光模块:核心差异及应用解析

    光通信系统的构建与日常运维工作中,光模块作为不可或缺的核心传输器件,其传输模式的合理选择,对系统数据交互的效率以及整体运行性能起着决定性作用。全双工光模块与半双工光模块作为该领域内两类关键的传输
    的头像 发表于 02-10 19:14 340次阅读

    双工光模块与半双工光模块的区别?

    光通信系统的构建与运维过程中,光模块作为核心传输组件,其传输模式的选择直接影响系统的数据交互效率与整体性能。全双工光模块与半双工光模块作为两类关键的传输模式,二者的核心差异集中体现在数据传输同步性
    的头像 发表于 02-06 18:59 284次阅读

    CW32 UART单线半双工模式

    完成后,接收完成标志位 UARTx_ISR.RC 会被硬件置 位,此时应尽快读取 UARTx_RDR 寄存器,并清除 UARTx_ISR.RC 标志位。 UART工作单线半双工模式时
    发表于 01-05 06:24

    SN65HVD485E半双工RS - 485收发器:电子工程师的理想选择

    SN65HVD485E半双工RS - 485收发器:电子工程师的理想选择 电子设计领域,找到一款性能优越、可靠性高的收发器至关重要。今天,我们就来深入探讨德州仪器(TI)的SN65HVD485E
    的头像 发表于 12-29 16:45 554次阅读

    ISOx5隔离式3.3 - V半双工和全双工RS - 485收发器技术全解析

    ISOx5隔离式3.3 - V半双工和全双工RS - 485收发器技术全解析 工业自动化、网络通信等众多领域,可靠的数据传输是系统稳定运行的关键,RS - 485接口凭借其出色的电气特性,成为
    的头像 发表于 12-25 16:45 572次阅读

    THVD1454:灵活的半双工 RS - 485 收发器设计解析

    THVD1454:灵活的半双工 RS - 485 收发器设计解析 工业自动化、楼宇控制等众多领域,RS - 485 通信标准凭借其长距离传输、多点通信等优势得到了广泛应用。今天我们要深入探讨
    的头像 发表于 12-16 10:45 477次阅读

    SPI 支持单线半双工通信模式

    SPI 支持单线半双工通信模式,该模式下,主机和从机通过一条双向数据线进行数据通信,主机使用 MOSI,从机使用 MISO,未使用的其他 SPI 信号线可供其它功能使用。设置控制寄存
    发表于 12-12 07:52

    CW32F030 UART的主要特性

    CW32F030 内部集成 3 个通用异步收发器 (UART),支持异步全双工、同步半双工单线半双工
    发表于 12-11 08:07

    CW32L010的串口输出功能

    今天和大家分享一下CW32L010的串口输出功能: CW32L010 内部集成2个通用异步收发器(UART),支持异步全双工、同步半双工单线
    发表于 11-26 06:04

    Texas Instruments THVD1454半双工RS-485收发器数据手册

    Texas Instrument THVD1454半双工RS-485收发器是一款适用于工业应用的灵活半双工RS-485收发器。该器件具有片120Ω 终端电阻和驱动器输出压摆率控制等功能
    的头像 发表于 08-04 15:23 1272次阅读
    Texas Instruments THVD1454<b class='flag-5'>半双工</b>RS-485收发器数据手册

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

    目标是 2 个 XMC1404 启动套件运行半双工通信。为此使用了DAVE™ 。 通信配置为使用 p2.0 的 usic0 通道 0。为了使其工作,我必须重新编程 TX/RX 引
    发表于 07-30 07:00

    Texas Instruments THVD24x9半双工RS-485收发器数据手册

    Texas Instruments THVD24x9半双工RS-485收发器通过标准8引脚SOIC和小型10引脚VSON封装中集成瞬态电压抑制器 (TVS) 二极管,实现了集成浪涌保
    的头像 发表于 07-23 10:25 1027次阅读
    Texas Instruments THVD24<b class='flag-5'>x</b>9<b class='flag-5'>半双工</b>RS-485收发器数据手册

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

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