CH32V307V的USB代碼問(wèn)題

CH32V307的USB HS Device中CH372代碼:

?if(RingBuffer_Comm.RemainPack)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? ret = USBHS_Endp_DataUp(DEF_UEP1, &Data_Buffer[(RingBuffer_Comm.DealPtr) * DEF_USBD_HS_PACK_SIZE], RingBuffer_Comm.PackLen[RingBuffer_Comm.DealPtr], DEF_UEP_DMA_LOAD);

? ? ? ? ? ? ? ? if(ret == 0)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? NVIC_DisableIRQ(USBHS_IRQn);

? ? ? ? ? ? ? ? ? ? RingBuffer_Comm.RemainPack--;

? ? ? ? ? ? ? ? ? ? RingBuffer_Comm.DealPtr++;

? ? ? ? ? ? ? ? ? ? if(RingBuffer_Comm.DealPtr == DEF_Ring_Buffer_Max_Blks)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? RingBuffer_Comm.DealPtr = 0;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? NVIC_EnableIRQ(USBHS_IRQn);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

1、沒(méi)有在代碼中看到RingBuffer_Comm的初始化部分;2、RingBuffer_Comm.PackLen[RingBuffer_Comm.DealPtr]這個(gè)數(shù)組到底是多大也看不出來(lái)。官方能否出個(gè)文檔解釋一下代碼?

您好,CH372Device程序中定義RingBuffer_Comm為全局變量,編譯器會(huì)為其初始化默認(rèn)值為0;RingBuffer_Comm.PackLen[RingBuffer_Comm.DealPtr]這個(gè)數(shù)組是由16個(gè)uint16_t類型的元素組成的數(shù)組,如下圖為其定義的部分;

image.png


USB中斷代碼中有兩次switch( USBHS_SetupReqCode ),不知道這兩次有什么區(qū)別?

switch( USBHS_SetupReqCode )

? ? ? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? len = ( USBHS_SetupReqLen >= DEF_USBD_UEP0_SIZE )? DEF_USBD_UEP0_SIZE : USBHS_SetupReqLen;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? memcpy( USBHS_EP0_Buf, pUSBHS_Descr, len );

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHS_SetupReqLen -= len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr += len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_LEN = len;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->UEP0_TX_CTRL ^= USBHS_UEP_T_TOG_DATA1;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? case USB_SET_ADDRESS:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? USBHSD->DEV_AD = USBHS_DevAddr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? default:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? }

switch( USBHS_SetupReqCode )

? ? ? ? ? ? {

? ? ? ? ? ? ? ? /* get device/configuration/string/report/... descriptors */

? ? ? ? ? ? ? ? case USB_GET_DESCRIPTOR:

? ? ? ? ? ? ? ? ? ? switch( (uint8_t)(USBHS_SetupReqValue>>8) )

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? /* get usb device descriptor */

? ? ? ? ? ? ? ? ? ? ? ? case USB_DESCR_TYP_DEVICE:

? ? ? ? ? ? ? ? ? ? ? ? ? ? pUSBHS_Descr = MyDevDescr;

? ? ? ? ? ? ? ? ? ? ? ? ? ? len = DEF_USBD_DEVICE_DESC_LEN;

? ? ? ? ? ? ? ? ? ? ? ? ? ? break;



USB中斷代碼中的兩個(gè)switch( USBHS_SetupReqCode ),都是判斷主機(jī)的請(qǐng)求類型,然后做響應(yīng)該請(qǐng)求的處理;只不過(guò)兩個(gè)switch的處理是在不同的中斷中,一個(gè)是在USB傳輸完成中斷,一個(gè)是在SETUP事務(wù)完成中斷,如下圖是判斷中斷標(biāo)志來(lái)確定進(jìn)入了哪一種USB中斷:

image.png

image.png


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频