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

    文章

    1159

    浏览量

    99961
  • 灵动微电子
    +关注

    关注

    7

    文章

    108

    浏览量

    19555
收藏 人收藏

    评论

    相关推荐

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

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

    工业控制设备可使用CN485A-E半双工的收发机

    工业控制设备可使用CN485A-E半双工的收发机
    的头像 发表于 03-29 10:27 80次阅读
    工业控制设备可使用CN485A-E<b class='flag-5'>半双工</b>的收发机

    IIC总线为什么是半双工

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

    XMC1402串口半双工接收异常,导致数据丢帧的原因?

    一、 测试环境/硬件/软件描述 1. 型号 XMC1402 ,开发环境 :DAVETMIAR 2. 客户使用XMC1402 USIC1 ,将TXD/RXD管脚分别串电阻及拉电阻后进行半双工通讯
    发表于 02-01 08:11

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

    半双工和全双工通信模式的比较  半双工和全双工是两种不同的通信模式,在不同的通信需求下,它们各有优劣。下面,我将详细介绍半双工和全
    的头像 发表于 01-09 14:00 740次阅读

    网络传输单工、半双工、全双工的解读

    在网络传输中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。
    的头像 发表于 11-24 16:33 1130次阅读
    网络传输单工、<b class='flag-5'>半双工</b>、全<b class='flag-5'>双工</b>的解读

    芯片设计中半双工和全双工数据传输的区别

    在现代通信技术中,半双工和全双工数据传输是两种常见的数据传输方式。本文将为大家详细解析这两种传输方式在芯片设计中的应用和区别,帮助大家更好地理解芯片设计中的通信原理。
    发表于 11-19 11:31 406次阅读

    AT32F4xx SPI使用半双工模式通讯

    AT32F4xx SPI使用半双工模式通讯演示AT32F403Axx SPI使用半双工模式通讯,其余系列的使用方式与此类似
    发表于 10-27 06:22

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

    CW32L083的UART单线半双工模式介绍
    的头像 发表于 10-24 17:49 467次阅读
    CW32L083的<b class='flag-5'>UART</b><b class='flag-5'>单线</b><b class='flag-5'>半双工</b>模式介绍

    RS422是全双工通信还是半双工通信?

    RS422到底是全双工还是半双工
    发表于 10-12 06:15

    如何使用UART TX和RX短路模拟单线通信传输

    应用程序:使用 UART TX 和 RX 短路模拟单线通信传输 BSP 版本: M480系列 BSP CMSIS v3.03.001 硬件: NuMaker-PFM-M487 v3.0 这个
    发表于 08-22 07:46

    NUC131的M0芯片UART能用半双工模式吗?

    新塘NUC131的M0的芯片,请问各路大神,串口能实现半双工模式吗?软件怎么实现,底层如何配置?有事例代码否?急求!!!!
    发表于 06-14 11:04

    TTL半双工消息驱动上拉Rx引脚,要怎么操作?

    我正在做一个项目来驱动一个发送 TTL 半双工消息的炉子。 所以我有附加电路。不幸的是,esp8266(Wemos D1 mini 或 NodeMCU Lolin v3)Rx 引脚上的拉电阻使我
    发表于 05-25 08:32

    半双工传输应用需要注意什么?

    前文我们讲解了半双工传输技术的原理、优缺点及物联网应用的内容,本文就着重介绍一下半双工传输技术的应用实现需要考虑那些内容:如下所示: 一、半双工传输技术中数据接收和发送的处理 在
    的头像 发表于 05-16 14:55 378次阅读

    可以Processor Expert使用LPSPI组件进行半双工SPI吗?

    我需要 S32K142 处理器的 3 线 SPI 配置,我使用 S32 Design Studio v2.2 当前的 SDK(RTM 3.0.0) 是否适用于半双工通信? 我可以 Processor Expert 使用 LP
    发表于 05-09 08:46