CH32V307V的USB代码问题

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、没有在代码中看到RingBuffer_Comm的初始化部分;2、RingBuffer_Comm.PackLen[RingBuffer_Comm.DealPtr]这个数组到底是多大也看不出来。官方能否出个文档解释一下代码?

您好,CH372Device程序中定义RingBuffer_Comm为全局变量,编译器会为其初始化默认值为0;RingBuffer_Comm.PackLen[RingBuffer_Comm.DealPtr]这个数组是由16个uint16_t类型的元素组成的数组,如下图为其定义的部分;

image.png


USB中断代码中有两次switch( USBHS_SetupReqCode ),不知道这两次有什么区别?

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中断代码中的两个switch( USBHS_SetupReqCode ),都是判断主机的请求类型,然后做响应该请求的处理;只不过两个switch的处理是在不同的中断中,一个是在USB传输完成中断,一个是在SETUP事务完成中断,如下图是判断中断标志来确定进入了哪一种USB中断:

image.png

image.png


只有登录才能回复,可以选择微信账号登录