資料介紹
本文將介紹在MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用。
UART單線半雙工簡介
在使用數(shù)字舵機(jī)通訊時(shí)所用到的通信方式為UART通信,但舵機(jī)只有三根接線,除去VCC和GND,只有一條通信線,也就是說要實(shí)現(xiàn)雙向通信,只能使用單線半雙工模式。在單線半雙工模式下,TX 和 RX 引腳在芯片內(nèi)部互連。
01 配置流程
單線半雙工模式是通過設(shè)置UART_SCR寄存器的HDSEL位,在這個(gè)模式里UART_SCR 寄存器的SCEN位必須保持清零狀態(tài)。
在單線半雙工模式下,TX和RX引腳在芯片內(nèi)部互聯(lián),使用控制位”HALF DUPLEX SEL”(UART_SCR 中的 HDSEL 位) 選擇半雙工和全雙工通信。
注意
當(dāng)選擇單線半雙工模式時(shí)RX 不再被使用,當(dāng)有數(shù)據(jù)需要發(fā)送的時(shí)候IO才會(huì)被UART驅(qū)動(dòng),沒有數(shù)據(jù)傳輸時(shí)TX總是被釋放,所以使用單線半雙工需要外部加上拉。
除此之外通訊上和正常的UART模式類似。由于是單線半雙工同一時(shí)刻總線上只能有一個(gè)節(jié)點(diǎn)發(fā)送,所以需要軟件協(xié)議層去管理線上沖突防止多個(gè)設(shè)備同時(shí)發(fā)送,當(dāng) TXEN 位被設(shè)置時(shí),只要數(shù)據(jù)一寫到數(shù)據(jù)寄存器上,發(fā)送就繼續(xù)。
02 UART_SCR寄存器描述
配置UART_SCR 的HDSEL為1
UART_SCR 寄存器的SCEN位清零
初始化UART1
從官網(wǎng)上下載MM32F013x例程,里面有UART普通模式的配置,在這個(gè)基礎(chǔ)上我們直接調(diào)用UART_HalfDuplexCmd(UART1,ENABLE);函數(shù)接口將串口配置成單線半雙工模式,然后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); }
功能驗(yàn)證測試
UART單線半雙工功能測試我們現(xiàn)在拿兩個(gè)MM32F0133的板子一個(gè)做主機(jī)一個(gè)做從機(jī)進(jìn)行單線收發(fā)測試,主機(jī)先發(fā)送一包數(shù)據(jù)給從節(jié)點(diǎn),當(dāng)從節(jié)點(diǎn)收到這包數(shù)據(jù)后再把這包數(shù)據(jù)發(fā)回給主機(jī),然后主機(jī)和從機(jī)兩個(gè)板子PA9短接到一起,外部在加一個(gè)4.7K上拉電阻。
主機(jī)函數(shù)處理:
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主機(jī)UART的中斷服務(wù)函數(shù)里面,將接從機(jī)發(fā)送的數(shù)據(jù)存放在Rx_buff里面,當(dāng)收到一包數(shù)據(jù)后通過printf打印到串口,和原始發(fā)送的數(shù)據(jù)進(jìn)行對(duì)比。
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; } } }從機(jī)函數(shù)處理:
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)//收到一包數(shù)據(jù) { gUartRxSta = 0; UART1_Send_Group(Rx_buff,10); memset(Rx_buff,0x00,10); } } //return 0; }從機(jī)UART的中斷服務(wù)函數(shù)里面,將接主機(jī)發(fā)送的數(shù)據(jù)存放在Rx_buff里面,當(dāng)收到一包數(shù)據(jù)后通過單線半雙工這個(gè)串口發(fā)送回去。
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; } } }觀察測試結(jié)果:
然后我們通過主機(jī)UART2 的printf打印可以看到主機(jī)TX Data 和從機(jī)返回的RX Data數(shù)據(jù)是一樣的。
再看看下圖邏輯分析儀抓取的邏輯波形,可以也可以看到主機(jī)發(fā)送的波形和從機(jī)返回的波形數(shù)據(jù)是一樣的。
- MM32F013x——ADC任意通道工作模式
- MM32F013x——RTC鬧鐘定時(shí)喚醒
- MM32F013x——移植EasyLogger組件
- MM32F013x——UART 多處理器通信
- MM32F013x——UART 極性取反通信
- MM32F013x——UART 單線半雙工通信
- MM32F013x——UART ISO7816-3協(xié)議的應(yīng)用
- MM32F013x——ADC任意通道工作模式
- MM32F013x——萬年歷
- MM32F013x——移植EasyFlash組件
- MM32F013x——移植EasyLogger組件
- MM32F013x——Event Recorder使用方法
- 基于ARM Cortex M0的微控制器MM32F013x 22次下載
- MM32F013x——UART 極性取反通信
- MM32F013x——UART 多處理器通信
- UART通信協(xié)議介紹和數(shù)據(jù)傳輸工作流程 880次閱讀
- 單工、半雙工和全雙工傳輸模式的區(qū)別 1304次閱讀
- 節(jié)省IO的小技巧:GD32 MCU如何使用一個(gè)GPIO實(shí)現(xiàn)串口半雙工收發(fā) 1935次閱讀
- RS-485適配器將數(shù)據(jù)線從全雙工轉(zhuǎn)換為半雙工 3915次閱讀
- UART串口通信協(xié)議詳解 7434次閱讀
- STM32F407入門開發(fā): 串口配置 1w次閱讀
- 基于半雙工機(jī)制實(shí)現(xiàn)3線制雙向SPI模塊的設(shè)計(jì)與應(yīng)用 4560次閱讀
- 巧用網(wǎng)卡的半雙工模式解決網(wǎng)絡(luò)連接故障 4123次閱讀
- 全雙工和半雙工的區(qū)別 1.8w次閱讀
- 基于FPGA芯片的UART接口電路設(shè)計(jì) 2150次閱讀
- 基于STM32F4單片機(jī)USART寄存器控制的設(shè)計(jì) 2625次閱讀
- 半雙工RF收發(fā)器CC900主要技術(shù)特點(diǎn) 1423次閱讀
- 【科普】常見的兩種串口通信 7414次閱讀
- 移動(dòng)通信技術(shù)的TDD與FDD雙工技術(shù)對(duì)比 4354次閱讀
- 支持單線SPI接口的燒錄技術(shù)實(shí)現(xiàn) 5142次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
- 0.70 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21548次下載 | 免費(fèi)
- 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183278次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多