那曲檬骨新材料有限公司

電子發(fā)燒友App

硬聲App

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

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

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>MM32F013x——UART 單線半雙工通信

MM32F013x——UART 單線半雙工通信

2021-03-10 | pdf | 249.91KB | 次下載 | 5積分

資料介紹

本文將介紹在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ù)是一樣的。


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

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1TC358743XBG評(píng)估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開關(guān)電源基礎(chǔ)知識(shí)
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 6基于FPGA的C8051F單片機(jī)開發(fā)板設(shè)計(jì)
  12. 0.70 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21548次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183278次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
百家乐官网是个什么样的游戏 | 澳门百家乐官网网址| 菲彩百家乐官网的玩法技巧和规则| 百家乐翻天下载| 百家乐官网视频游戏界面| 百家乐打闲赢机会多| 百家乐官网哪条路好| 百家乐庄闲筹码| 百家乐官网能战胜吗| 澳门百家乐游戏| 石景山区| 澳门百家乐走势图怎么看| 常宁市| 百家乐打立了| 真让百家乐官网游戏开户| 百家乐游戏大小| 德州百家乐官网赌博规则| 路劲太阳城金旭园| 百家乐官网扑克筹码| 大发888怎么提款| 新澳门百家乐官网的玩法技巧和规则| 棋牌游戏平台哪个好| 百家乐正网开户| 百家乐官网视频软件| 网上百家乐哪家较安全| 百家乐官网代理商博彩e族| 葡京百家乐的玩法技巧和规则| 百家乐官网游戏网站| 大发888官方游戏平台| 百家乐官网怎么玩请指教| 龙州县| 金花百家乐的玩法技巧和规则| 百家乐官网网盛世三国| 顶级赌场连环夺宝下载| 百家乐官网平注资讯| 长丰县| 鸟巢百家乐的玩法技巧和规则| 百家乐官网牌九| 真人888| 大三巴百家乐的玩法技巧和规则| 百家乐官网澳门赌|