日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于MCU_USB的虚拟串口助手实现

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于MCU_USB的虚拟串口助手实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一 、實(shí)驗(yàn)?zāi)康?#xff1a;

通過MCU的USB模塊加串口模塊,實(shí)現(xiàn)一個(gè)串口助手的功能。具體操作為把USB接收到的數(shù)據(jù)通過串口發(fā)送,同時(shí)實(shí)現(xiàn)串口接收的數(shù)據(jù)回傳到USB,從而實(shí)現(xiàn)從USB到TTL的電平轉(zhuǎn)換。

二、實(shí)驗(yàn)環(huán)境:

1.mcu: 國芯ccm4202

2.開發(fā)環(huán)境:Keil

三、操作步驟:

1.USB設(shè)置為CDC類

USB CDC類的通信部分主要包含三部分:枚舉過程、虛擬串口操作和數(shù)據(jù)通信。其中虛擬串口操作部分并不一定強(qiáng)制需要,因?yàn)槿籼^這些虛擬串口的操作,實(shí)際上USB依然是可以通信的,這也就是為什么上圖中,在操作虛擬串口之前會(huì)有兩條數(shù)據(jù)通信的數(shù)據(jù)。之所以會(huì)有虛擬串口操作,主要是我們通常使用PC作為Host端,在PC端使用一個(gè)串口工具來與其進(jìn)行通信,PC端的對應(yīng)驅(qū)動(dòng)將其虛擬成一個(gè)普通串口,這樣一來,可以方便PC端軟件通過操作串口的方式來與其進(jìn)行通信,但實(shí)際上,Host端與Device端物理上是通過USB總線來進(jìn)行通信的,與串口沒有關(guān)系,這一虛擬化過程,起決定性作用的是對應(yīng)驅(qū)動(dòng),包含如何將每一條具體的虛擬串口操作對應(yīng)到實(shí)際上的USB操作。需要注意的是,Host端與Device端的USB通信速率并不受所謂的串口波特率影響,它就是標(biāo)準(zhǔn)的USB2.0全速(12Mbps)速度,實(shí)際速率取決于總線的實(shí)際使用率、驅(qū)動(dòng)訪問USB外設(shè)有效速率(兩邊)以及外部環(huán)境對通信本身造成的干擾率等因素組成。

2.接口映射

初始化MCU的UART,實(shí)現(xiàn)通過UART把USB的數(shù)據(jù)進(jìn)行收發(fā)。

四、軟件實(shí)現(xiàn):

1.USB設(shè)置為CDC類

void USB_CDC_Init(void) {//USB1.1, 同時(shí)配置USB配置項(xiàng)為USB1.1模式g_usbVer = 0;//0:internal oscillator; 1:external oscillatorUSBC_PHY_Init(0);CCM->PHYPA |= 0x0e00; //no need to supply VBUS./* Global USB Register *///gUSBC_fifoReg = (USBCFIFO_Reg*)(USBC_BASE_ADDR+0x1A);gUSBC_fifoReg = (USBCFIFO_Reg*)(USBC_BASE_ADDR+0x60);gUSBC_ComReg = (USBCCommonReg*)USBC_BASE_ADDR;gUSBC_IdxReg = (USBCIndexedReg*)(USBC_BASE_ADDR+0x10);//USB data bufferg_databuf = USB_BUFFER_ADDR;//The suspend mode is disable before BULK-Only tranfer startg_suspendMode = 0;/* Setup USB register *///enable usb common interrupt//0 1 2 3 4 5 6 7 (bit)//Susp Resume Reset SOF Conn Discon SessReq VBusErrgUSBC_ComReg->INTRUSBE = USB_INTERRUPT_RESET|USB_INTERRUPT_CONNECT|USB_INTERRUPT_DISCON|USB_INTERRUPT_SUSPEND|USB_INTERRUPT_RESUME;//enable ep0 and ep1 tx interrupts,clear other tx interruptsgUSBC_ComReg->INTRTXE_L = USB_INTERRUPT_EP0|(1<<INDEX_EP1)|(1<<INDEX_EP3);gUSBC_ComReg->INTRRXE_L = (1<<INDEX_EP2);//ensure ep0 control/status regesters appeare in the memory map.gUSBC_ComReg->EINDEX = CONTROL_EP;//Enable Soft connectionif(g_usbVer == 1)gUSBC_ComReg->UCSR = USB_POWER_SOFT_CONN|USB_POWER_HS_ENAB;elsegUSBC_ComReg->UCSR = USB_POWER_SOFT_CONN;g_USBAddrFlag = 0;g_USBNewAddr = 0;NVIC_Init(3, 3, USBC_IRQn, 2); }

2.初始化串口為中斷方式

void Usb_UART_init(void) {UART_InitTypeDef UART_InitStruct;UART_InitStruct.UART_BaudRate = LineCoding.bitrate;UART_InitStruct.UART_Mode = UART_INT_MODE;UART_InitStruct.UART_Parity = UART_PARITY_NONE;if( LineCoding.format == 0){UART_InitStruct.UART_FrameLength = UART_DATA_FRAME_LEN_10BIT;UART_InitStruct.UART_StopBits = 1;}else{UART_InitStruct.UART_FrameLength = UART_DATA_FRAME_LEN_11BIT;UART_InitStruct.UART_StopBits = 2;}UART_Init(Usb_Uart, &UART_InitStruct); }

3.串口接收數(shù)據(jù),通過USB發(fā)送到上位機(jī)。當(dāng)數(shù)據(jù)間隔大于50毫秒默認(rèn)為兩包數(shù)據(jù)

ret = UART_RecvByte(Usb_Uart, &temp);if(STATUS_OK == ret){uart_data_buf_[i++] = temp;len = i ;}else{if( Tool_Tc_cnt >= 50){Tool_Tc_cnt = 0 ;if(len!= 0 ){usb_cdc_send(INDEX_EP1, (UINT8*)uart_data_buf_, len);i = 0 ;len = 0 ;}}}

4.USB接收數(shù)據(jù),并將數(shù)據(jù)通過UART發(fā)出

void USBDev_DoCDCCmd_(void) {UINT16 recvLen = 0;UINT16 len;len = 64;memset(cdc_ctl_buf_, 0x00, sizeof(cdc_ctl_buf_));recvLen = usb_cdc_receive(INDEX_EP2, (UINT8 *)cdc_ctl_buf_);if (recvLen == 0)return;len = recvLen;UART_SendData(Usb_Uart, cdc_ctl_buf_,len); }void usb_cdc_poll_(void) {if( (g_uchUSBStatus & BIT1) == BIT1 ) //接收到一包數(shù)據(jù){g_uchUSBStatus &= ~BIT1;USBDev_DoCDCCmd_();} }

五、實(shí)驗(yàn)現(xiàn)象:

如圖所示,通過MCU模擬出來的串口助手可以實(shí)現(xiàn)USB_TTL芯片相同效果,進(jìn)行數(shù)據(jù)收發(fā)。

六、注意點(diǎn)

1.串口需要采用中斷方式,輪訓(xùn)會(huì)造成數(shù)據(jù)接收轉(zhuǎn)發(fā)不完全

2.usb虛擬串口部分,需要設(shè)置MCU的波特率,數(shù)據(jù)位,停止位等信息,否則會(huì)導(dǎo)致數(shù)據(jù)亂碼。

總結(jié)

以上是生活随笔為你收集整理的基于MCU_USB的虚拟串口助手实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。