0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在MM32F013x上實(shí)現(xiàn)UART單線半雙工的功能應(yīng)用

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2022-02-21 10:49 ? 次閱讀

本文將介紹在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才會被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)行對比。

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ù)是一樣的。

轉(zhuǎn)自:靈動(dòng)微電子

審核編輯:何安

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1242

    瀏覽量

    101535
  • 靈動(dòng)微電子
    +關(guān)注

    關(guān)注

    7

    文章

    122

    瀏覽量

    19658
收藏 人收藏

    評論

    相關(guān)推薦

    SN65HVD3083EDGSR半雙工時(shí)怎么接線?

    請問ti工程師SN65HVD3083EDGSR 這顆芯片半雙工時(shí)怎么接線?
    發(fā)表于 01-01 08:12

    使用TM4C129x 微控制器為 TMP1826實(shí)現(xiàn)單線枚舉功能應(yīng)用說明

    電子發(fā)燒友網(wǎng)站提供《使用TM4C129x 微控制器為 TMP1826實(shí)現(xiàn)單線枚舉功能應(yīng)用說明.pdf》資料免費(fèi)下載
    發(fā)表于 09-12 11:10 ?0次下載
    使用TM4C129<b class='flag-5'>x</b> 微控制器為 TMP1826<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>單線</b>枚舉<b class='flag-5'>功能</b>應(yīng)用說明

    ISO308x隔離式5V全雙工半雙工RS-485收發(fā)器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《ISO308x隔離式5V全雙工半雙工RS-485收發(fā)器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 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收發(fā)器數(shù)據(jù)表

    單工、半雙工和全雙工傳輸模式的區(qū)別

    傳輸模式主要分為單工(Simplex)、半雙工(Half-Duplex)和全雙工(Full-Duplex)。這三種模式在數(shù)據(jù)傳輸能力、通信效率和應(yīng)用場景等方面存在顯著差異。
    的頭像 發(fā)表于 08-07 14:32 ?1290次閱讀

    esp32 wroom 32d是半雙工還是全雙工的?

    我的疑問有幾個(gè): 1. esp32 wroom 32d是半雙工還是全雙工的? 2. 鏈路層狀態(tài)機(jī)切換的時(shí)候,比如在廣播態(tài)發(fā)廣播包的時(shí)候,一個(gè)廣播事件還沒結(jié)束,狀態(tài)機(jī)能切換到掃描態(tài)嗎? 3. 一個(gè)
    發(fā)表于 06-18 06:15

    雙工半雙工技術(shù)解析

    隨著信息技術(shù)的迅猛發(fā)展,通信系統(tǒng)的性能要求日益提高。在數(shù)據(jù)傳輸中,雙工模式的選擇對于提高系統(tǒng)效率、降低通信延遲具有重要意義。 一、全雙工模式 全雙工模式允許數(shù)據(jù)通信鏈路的兩個(gè)方向上同
    的頭像 發(fā)表于 06-16 10:18 ?806次閱讀

    請問如何取消UART的GPIO映射?

    我想實(shí)現(xiàn)單線半雙工的串口,收發(fā)時(shí)需要切換收和發(fā)的GPIO,涉及到esp_rom_gpio_connect_in_signal和esp_rom_gpio_connect_out_sig
    發(fā)表于 06-07 06:08

    PSoC5 UART半雙工模式UART_LoadTxConfig() 之后傳輸數(shù)據(jù)時(shí)的疑問求解

    我目前正在嘗試使用內(nèi)置的 UART 組件傳輸數(shù)據(jù) CY8C5888LTI-LP097。UART配置為半雙工模式,速率為 9600 Bd,數(shù)據(jù)位為 8,偶校驗(yàn)。我的代碼如下所示
    發(fā)表于 05-31 10:13

    當(dāng)XMC1400配置為半雙工SPI主站時(shí),SPI_MASTER_Receive功能能否正常工作?

    由所有的 1 組成。 作為臨時(shí)解決辦法,我將 XMC1400 配置為全雙工,并將 MOSI 和 MISO 引腳連接在一起。 現(xiàn)在的問題是,當(dāng) XMC1400 配置為半雙工 SPI 主站時(shí),SPI_MASTER_Receive功能
    發(fā)表于 05-23 06:44

    雙工半雙工技術(shù)解析及其應(yīng)用場景

    隨著信息技術(shù)的迅猛發(fā)展,通信系統(tǒng)的性能要求日益提高。在數(shù)據(jù)傳輸中,雙工模式的選擇對于提高系統(tǒng)效率、降低通信延遲具有重要意義。本文將對全雙工半雙工兩種雙工模式進(jìn)行詳細(xì)解析,并探討它們各
    的頭像 發(fā)表于 05-11 15:29 ?1427次閱讀

    做一個(gè)STM8 UART半雙工,測試發(fā)現(xiàn)數(shù)據(jù)發(fā)送和回發(fā)不穩(wěn)定,怎么解決?

    各位大俠: 最近做一個(gè)STM8 UART半雙工,發(fā)送自定義協(xié)議控制下位控制器,控制器正常有答復(fù),測試發(fā)現(xiàn)數(shù)據(jù)發(fā)送和回發(fā)不穩(wěn)定, 考慮綜合利用TXE和TC標(biāo)志位,下面中斷處理程序,大家看看是否有
    發(fā)表于 04-30 06:45

    使用STM32F072 USART單線半雙工模式通信,只要打開IDLE中斷就會一直觸發(fā)IDLE中斷怎么解決?

    使用STM32F072 USART單線半雙工模式通信,想要利用DMA+IDLE方式接收不定長數(shù)據(jù),發(fā)現(xiàn)只要打開IDLE中斷,就會一直觸發(fā)IDLE中斷。有沒有高手遇到過?怎么解決?
    發(fā)表于 04-22 06:18

    工業(yè)控制設(shè)備可使用CN485A-E半雙工的收發(fā)機(jī)

    工業(yè)控制設(shè)備可使用CN485A-E半雙工的收發(fā)機(jī)
    的頭像 發(fā)表于 03-29 10:27 ?388次閱讀
    工業(yè)控制設(shè)備可使用CN485A-E<b class='flag-5'>半雙工</b>的收發(fā)機(jī)

    節(jié)省IO的小技巧:GD32 MCU如何使用一個(gè)GPIO實(shí)現(xiàn)串口半雙工收發(fā)

    一般情況串口的接受和發(fā)送分別需要使用TX和RX兩個(gè)引腳來實(shí)現(xiàn),但在一些UART的實(shí)際應(yīng)用中,通信雙方身份為主機(jī)和從機(jī),數(shù)據(jù)流是半雙工的,那么當(dāng)IO口資源緊張時(shí)可以使用半雙工模式通過一個(gè)
    的頭像 發(fā)表于 03-15 09:39 ?1929次閱讀
    節(jié)省IO的小技巧:GD32 MCU如何使用一個(gè)GPIO<b class='flag-5'>實(shí)現(xiàn)</b>串口<b class='flag-5'>半雙工</b>收發(fā)

    IIC總線為什么是半雙工?

    IIC(Inter-Integrated Circuit)總線是一種半雙工的串行通信接口。I2C總線上,主設(shè)備和從設(shè)備之間的數(shù)據(jù)傳輸是采用半雙工模式進(jìn)行的。這意味著主設(shè)備和從設(shè)備
    的頭像 發(fā)表于 02-02 16:37 ?4738次閱讀
    IIC總線為什么是<b class='flag-5'>半雙工</b>?