资料介绍
本文将介绍在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数据是一样的。
再看看下图逻辑分析仪抓取的逻辑波形,可以也可以看到主机发送的波形和从机返回的波形数据是一样的。
- MM32F013x——ADC任意通道工作模式
- MM32F013x——RTC闹钟定时唤醒
- MM32F013x——移植EasyLogger组件
- MM32F013x——UART 多处理器通信
- MM32F013x——UART 极性取反通信
- MM32F013x——UART 单线半双工通信
- MM32F013x——UART ISO7816-3协议的应用
- MM32F013x——ADC任意通道工作模式
- MM32F013x——万年历
- MM32F013x——移植EasyFlash组件
- MM32F013x——移植EasyLogger组件
- MM32F013x——Event Recorder使用方法
- 基于ARM Cortex M0的微控制器MM32F013x 22次下载
- MM32F013x——UART 极性取反通信
- MM32F013x——UART 多处理器通信
- UART通信协议介绍和数据传输工作流程 880次阅读
- 单工、半双工和全双工传输模式的区别 1304次阅读
- 节省IO的小技巧:GD32 MCU如何使用一个GPIO实现串口半双工收发 1935次阅读
- RS-485适配器将数据线从全双工转换为半双工 3915次阅读
- UART串口通信协议详解 7434次阅读
- STM32F407入门开发: 串口配置 1w次阅读
- 基于半双工机制实现3线制双向SPI模块的设计与应用 4560次阅读
- 巧用网卡的半双工模式解决网络连接故障 4123次阅读
- 全双工和半双工的区别 1.8w次阅读
- 基于FPGA芯片的UART接口电路设计 2150次阅读
- 基于STM32F4单片机USART寄存器控制的设计 2625次阅读
- 半双工RF收发器CC900主要技术特点 1423次阅读
- 【科普】常见的两种串口通信 7414次阅读
- 移动通信技术的TDD与FDD双工技术对比 4354次阅读
- 支持单线SPI接口的烧录技术实现 5142次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多