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

    文章

    1235

    浏览量

    101378
  • 灵动微电子
    +关注

    关注

    7

    文章

    121

    浏览量

    19639
收藏 人收藏

    评论

    相关推荐

    使用TM4C129x 微控制器为 TMP1826实现单线枚举功能应用说明

    电子发烧友网站提供《使用TM4C129x 微控制器为 TMP1826实现单线枚举功能应用说明.pdf》资料免费下载
    发表于 09-12 11:10 0次下载
    使用TM4C129<b class='flag-5'>x</b> 微控制器为 TMP1826<b class='flag-5'>实现</b><b class='flag-5'>单线</b>枚举<b class='flag-5'>功能</b>应用说明

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

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

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

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

    esp32 wroom 32d是半双工还是全双工的?

    我的疑问有几个: 1. esp32 wroom 32d是半双工还是全双工的? 2. 链路层状态机切换的时候,比如在广播态发广播包的时候,一个广播事件还没结束,状态机能切换到扫描态吗? 3. 一个
    发表于 06-18 06:15

    双工半双工技术解析

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

    请问如何取消UART的GPIO映射?

    我想实现单线半双工的串口,收发时需要切换收和发的GPIO,涉及到esp_rom_gpio_connect_in_signal和esp_rom_gpio_connect_out_sig
    发表于 06-07 06:08

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

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

    当XMC1400配置为半双工SPI主站时,SPI_MASTER_Receive功能能否正常工作?

    由所有的 1 组成。 作为临时解决办法,我将 XMC1400 配置为全双工,并将 MOSI 和 MISO 引脚连接在一起。 现在的问题是,当 XMC1400 配置为半双工 SPI 主站时,SPI_MASTER_Receive功能
    发表于 05-23 06:44

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

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

    做一个STM8 UART半双工,测试发现数据发送和回发不稳定,怎么解决?

    各位大侠: 最近做一个STM8 UART半双工,发送自定义协议控制下位控制器,控制器正常有答复,测试发现数据发送和回发不稳定, 考虑综合利用TXE和TC标志位,下面中断处理程序,大家看看是否有
    发表于 04-30 06:45

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

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

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

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

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

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

    IIC总线为什么是半双工

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

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

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