国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

CW32L083的UART單線半雙工模式介紹

jf_pJlTbmA9 ? 來源:武漢芯源半導體 ? 作者:武漢芯源半導體 ? 2023-10-24 17:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、簡介

半雙工即Half duplex Communication,是指在通信過程的任意時刻,信息既可由A傳到B,又能由B傳A,但同時只有一個方向上的傳輸存在。由于這種方式要頻繁變換信道方向,故效率低,但可以節約傳輸線路。半雙工方式適用于終端與終端之間的會話式通信。

二、實際操作(以CW32L083為例)

設置 UARTx_CR2.SIGNAL 為 1 使 UART 工作于單線半雙工工作模式。在該模式下,使用 UARTx_TXD 引腳進行數據的發送和接收,不占用 UARTx_RXD 引腳(UARTx_RXD 可作通用 IO 使用)。寫數據到 UARTx_TDR 寄存器后,UARTx_TXD 引腳立即進入發送狀態,輸出 UARTx_TDR 寄存器中的數據。數據 發送完成后,UARTx_TXD 引腳恢復到常態的接收狀態。沒有發送數據時,UARTx_TXD 引腳處于接收狀態,數據接收完成后,接收完成標志位 UARTx_ISR.RC 會被硬件置 位,此時應盡快讀取 UARTx_RDR 寄存器,并清除 UARTx_ISR.RC 標志位。

wKgZomUDxzaAEMaEAAB2fxGkwrI184.png

UART工作在單線半雙工模式時,UARTx_TXD引腳需要配置為開漏輸出。另外用戶應采取適當的應用層保護機制,以確保不會出現多主機同時向總線發送數據。

三、UART單線半雙工通信示例

硬件采用CW32L083VxTx StartKit單板,用杜邦線連接PA08和PA06引腳。

UARTy查詢方式發送TxBuffer1緩沖區中的數據,UARTz查詢方式接收數據,并存儲到RxBuffer2緩沖區。

UARTz查詢方式發送TxBuffer2緩沖區中的數據,UARTy查詢方式接收數據,并存儲到RxBuffer1緩沖區。

比較TxBuffer1和RxBuffer2、TxBuffer2和RxBuffer1,如果數據一致,則LED1亮,否則LED2亮。

1、配置RCC

voidRCC_Configuration(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV6);//SYSCLK=HSI=8MHz=HCLK=PCLK
RCC_AHBPeriphClk_Enable(UARTy_GPIO_CLK|UARTz_GPIO_CLK|
RCC_AHB_PERIPH_GPIOC,ENABLE);//外設時鐘使能
UARTy_APBClkENx(UARTy_CLK,ENABLE);
UARTz_APBClkENx(UARTz_CLK,ENABLE);
}

2、配置GPIO

voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure={0};
UARTy_AFTX;//UARTTX復用
UARTz_AFTX;U
ARTy_TXPUR;//UARTTXPUR
UARTz_TXPUR;
GPIO_InitStructure.Pins=UARTy_TxPin;
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_OD;//開漏輸出
GPIO_Init(UARTy_GPIO, GPIO_InitStructure);
GPIO_InitStructure.Pins=UARTz_TxPin;
GPIO_Init(UARTz_GPIO, GPIO_InitStructure);

GPIO_InitStructure.Pins=GPIO_PIN_3|GPIO_PIN_2;//PC3LED1/PC2LED2
GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Init(CW_GPIOC, GPIO_InitStructure);P
C03_SETLOW();//LED滅
PC02_SETLOW();
}

3、配置UART

voidUART_Configuration(void)
{
UART_InitTypeDefUART_InitStructure={0};

UART_InitStructure.UART_BaudRate=UARTyz_BaudRate;//波特率
UART_InitStructure.UART_Over=UART_Over_16;//采樣方式
UART_InitStructure.UART_Source=UART_Source_PCLK;//傳輸時鐘源
UCLKUART_InitStructure.UART_UclkFreq=UARTyz_UclkFreq;//傳輸時鐘UCLK頻率
UART_InitStructure.UART_StartBit=UART_StartBit_FE;//起始位判定方式
UART_InitStructure.UART_StopBits=UART_StopBits_1;//停止位長度
UART_InitStructure.UART_Parity=UART_Parity_No;//校驗方式
UART_InitStructure.UART_HardwareFlowControl=UART_HardwareFlowControl_None;
UART_InitStructure.UART_Mode=UART_Mode_Rx|UART_Mode_Tx;//發送/接收使能
UART_Init(UARTy, UART_InitStructure);
UART_Init(UARTz, UART_InitStructure);
}

4、定義變量

//UARTy
#defineUARTyCW_UART1
#defineUARTy_CLKRCC_APB2_PERIPH_UART1
#defineUARTy_APBClkENxRCC_APBPeriphClk_Enable2
#defineUARTy_GPIO_CLKRCC_AHB_PERIPH_GPIOA
#defineUARTy_GPIOCW_GPIOA
#defineUARTy_TxPinGPIO_PIN_8
#defineUARTy_AFTXPA08_AFx_UART1TXD()
#defineUARTy_TXPURPA08_PUR_ENABLE();

//UARTz
#defineUARTzCW_UART2
#defineUARTz_CLKRCC_APB1_PERIPH_UART2
#defineUARTz_APBClkENxRCC_APBPeriphClk_Enable1
#defineUARTz_GPIO_CLKRCC_AHB_PERIPH_GPIOA
#defineUARTz_GPIOCW_GPIOA
#defineUARTz_TxPinGPIO_PIN_6
#defineUARTz_AFTXPA06_AFx_UART2TXD()
#defineUARTz_TXPURPA06_PUR_ENABLE()
#defineUARTyz_BaudRate9600
#defineUARTyz_UclkFreq8000000
#defineTxBufferSize1(ARRAY_SZ(TxBuffer1)-1)
#defineTxBufferSize2(ARRAY_SZ(TxBuffer2)-1)
typedefenum{FAILED=0,PASSED=!FAILED}TestStatus;
TestStatusBuffercmp(uint8_t*pBuffer1,uint8_t*pBuffer2,uint16_tBufferLength);
uint8_tTxBuffer1[]="rnCW32L083UARTHalfDuplex:UARTy->UARTzrn";
uint8_tTxBuffer2[]="rnCW32L083UARTHalfDuplex:UARTz->UARTyrn";
uint8_tRxBuffer1[TxBufferSize2];uint8_tRxBuffer2[TxBufferSize1];
uint32_tNbrOfDataToRead1=TxBufferSize2;
uint32_tNbrOfDataToRead2=TxBufferSize1;
uint8_tTxCounter1=0,RxCounter1=0;
uint8_tTxCounter2=0,RxCounter2=0;
volatileTestStatusTransferStatus1=FAILED,TransferStatus2=FAILED;

5、主程序

int32_tmain(void)
{
RCC_Configuration();//配置RCC
GPIO_Configuration();//配置GPIO
UART_Configuration();//配置UART
UART_HalfDuplexCmd(UARTy,ENABLE);//單線半雙工UARTy
UART_HalfDuplexCmd(UARTz,ENABLE);//單線半雙工UARTz
while(NbrOfDataToRead2--)//UARTy->UARTz
{
//UARTy發送一個字節數據
UART_SendData_8bit(UARTy,TxBuffer1[TxCounter1++]);
while(UART_GetFlagStatus(UARTy,UART_FLAG_TXE)==RESET);
//UARTz等待RC
while(UART_GetFlagStatus(UARTz,UART_FLAG_RC)==RESET);
UART_ClearFlag(UARTz,UART_FLAG_RC);
RxBuffer2[RxCounter2++]=UART_ReceiveData_8bit(UARTz);
}
while(NbrOfDataToRead1--)//UARTz->UARTy
{
//UARTz發送一個字節數據
UART_SendData_8bit(UARTz,TxBuffer2[TxCounter2++]);
while(UART_GetFlagStatus(UARTz,UART_FLAG_TXE)==RESET);
//UARTy等待RC
while(UART_GetFlagStatus(UARTy,UART_FLAG_RC)==RESET);
UART_ClearFlag(UARTy,UART_FLAG_RC);
RxBuffer1[RxCounter1++]=UART_ReceiveData_8bit(UARTy);
}
//檢查收發數據一致性
TransferStatus1=Buffercmp(TxBuffer1,RxBuffer2,TxBufferSize1);
TransferStatus2=Buffercmp(TxBuffer2,RxBuffer1,TxBufferSize2);
if(TransferStatus1==PASSED  TransferStatus2==PASSED)//PASSED
{
//LED1亮
PC03_SETHIGH();
}
else//FAILED
{
PC02_SETHIGH();//LED2亮
}
while(1)
{
}
}

6、測試結果:UART半雙工通信方式工作正常, LED1亮。

來源:武漢芯源半導體

免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 半雙工
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9347
  • uart
    +關注

    關注

    22

    文章

    1314

    瀏覽量

    106644
  • 單線
    +關注

    關注

    0

    文章

    7

    瀏覽量

    9147
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    CW32 UART單線半雙工模式

    效率低,但可以節約傳輸線路。半雙工方式適用于終端與終端之間的會話式通信。 二、實際操作(以CW32L083為例) 設置 UARTx_CR2.SIGNAL 為 1 使 UART 工作于單線
    發表于 01-05 06:24

    請問如何配置和使用CW32L083系列微控制器的ADC和DAC模塊?

    如何配置和使用CW32L083系列微控制器的ADC和DAC模塊?
    發表于 12-16 08:27

    請問如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?

    如何解決CW32L083系列微控制器在通信過程中可能出現的數據錯誤問題?
    發表于 12-16 08:01

    CW32L083系列微控制器有哪些應用場景?

    CW32L083系列微控制器有哪些應用場景
    發表于 12-16 07:52

    在進行低功耗設計時如何優化CW32L083系列微控制器的功耗?

    在進行低功耗設計時,如何優化CW32L083系列微控制器的功耗?
    發表于 12-16 06:03

    請問CW32L083如何實現AUTOTRIM時鐘校準?

    如題,CW32L083如何實現AUTOTRIM時鐘校準?有沒有HSIOSC時鐘校準編程示例?
    發表于 12-16 06:02

    CW32L083系列微控制器的時鐘配置有哪些選項?

    CW32L083系列微控制器的時鐘配置有哪些選項?如何選擇合適的時鐘源?
    發表于 12-15 07:09

    CW32L083的基本定時器

    CW32L083 內部集成 3 個基本定時器 (BTIM),每個 BTIM 完全獨立且功能完全相同,各包含一個 16bit 自動重裝 載計數器并由一個可編程預分頻器驅動。BTIM 支持定時器模式
    發表于 12-15 06:23

    在使用CW32L083系列微控制器時如何配置中斷向量表?

    在使用CW32L083系列微控制器時,如何配置中斷向量表?
    發表于 12-15 06:17

    SPI 支持單線半雙工通信模式

    SPI 支持單線半雙工通信模式,在該模式下,主機和從機通過一條雙向數據線進行數據通信,主機使用 MOSI,從機使用 MISO,未使用的其他 SPI 信號線可供其它功能使用。設置控制寄存
    發表于 12-12 07:52

    CW32F030 UART的主要特性

    CW32F030 內部集成 3 個通用異步收發器 (UART),支持異步全雙工、同步半雙工單線半雙工模
    發表于 12-11 08:07

    CW32L083的內置獨立校準的RTC這一般怎么玩?

    CW32L083的內置獨立校準的RTC這一般怎么玩?
    發表于 12-09 07:04

    CW32L083系列微控制器有哪些主要特點?

    CW32L083系列微控制器有哪些主要特點
    發表于 12-09 06:34

    CW32L083有哪些應用場景?

    CW32L083有哪些應用場景
    發表于 11-24 07:37

    求助,關于半雙工模式下的Uart問題求解

    ,該引腳被配置為具有內部推挽的輸入。為了傳輸,它被配置為推/拉。 我沒有在 usic 應用說明或參考手冊中看到任何關于需要此功能的信息。然而,這種重新編程會導致傳輸線出現故障。 我的問題是: 對于半雙工模式,運行時是否必須對 tx/rx 引腳進行重新編程? 當需要時如何防止這些故障?
    發表于 07-30 07:00