CH582的USB串口最大包发送长度为什么是32


用的是官方例程usb_uart, 看代码最大发送长度应该是64,可以是调试发现超过32bytes就发不出去了。


是什么原因呢?

4个通道只用了一个有办法设置最大长度是128吗?


/*********************************************************************

 * @fn      DevEP2_IN_Deal

 *

 * @brief   端点2数据上传

 *

 * @param   l   - 上传数据长度(<64B)

 *

 * @return  none

 */

void DevEP2_IN_Deal(uint8_t l)

{

    R8_UEP2_T_LEN = l;

    R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;

}


void DevEP2_IN_Deal(uint8_t l)

{

    R8_UEP2_T_LEN = l;

    R8_UEP2_CTRL = (R8_UEP2_CTRL & ~MASK_UEP_T_RES) | UEP_T_RES_ACK;

}




或者难道说BLE那边接收那边的最大长度是32,我这边是BLE接收数据,然后通过usb_uart发送给主机


您好,您提到的usb_uart官方例程是指COM例程吗,是要做BLE和USB之间的透传吗

蓝牙最大包可以是244B,将MTU开启即可:https://www.cnblogs.com/gscw/p/17896209.html

您要做128字节/包的话,USB的硬件DMA缓存是限制了64字节,USB这边有限制。USB的描述符中有限制端点包长的代码,通过修改描述符、修改例程中默认的32字节包长限制,可以改到最大64字节。


请问是该改下面的哪里呢?


#define DevEP0SIZE  0x40

// 设备描述符

const uint8_t MyDevDescr[] = { 0x12,0x01,0x10,0x01,0xFF,0x00,0x00,DevEP0SIZE,

                             0x86,0x1A,0x23,0x75,0x63,0x02,0x00,0x02,

                             0x00,0x01 };

// 配置描述符

const uint8_t MyCfgDescr[] = {   0x09,0x02,0x27,0x00,0x01,0x01,0x00,0x80,0xf0,              //配置描述符,接口描述符,端点描述符

                                 0x09,0x04,0x00,0x00,0x03,0xff,0x01,0x02,0x00,

                                 0x07,0x05,0x82,0x02,0x20,0x00,0x00,                        //批量上传端点

                                 0x07,0x05,0x02,0x02,0x20,0x00,0x00,                        //批量下传端点

                                 0x07,0x05,0x81,0x03,0x08,0x00,0x01};                       //中断上传端点

// 语言描述符

const uint8_t MyLangDescr[] = { 0x04, 0x03, 0x09, 0x04 };

// 厂家信息

const uint8_t MyManuInfo[] = { 0x0E, 0x03, 'i', 0, 'D', 0, 'a', 0, 't', 0, 'a', 0, 'n', 0 };

// 产品信息

const uint8_t MyProdInfo[] = { 0x0C, 0x03, 'M', 0, 'o', 0, 'c', 0, 'a', 0, 'p', 0 };

/*产品描述符*/

const uint8_t StrDesc[28] =

{

  0x1C,0x03,0x55,0x00,0x53,0x00,0x42,0x00,

  0x32,0x00,0x2E,0x00,0x30,0x00,0x2D,0x00,

  0x53,0x00,0x65,0x00,0x72,0x00,0x69,0x00,

  0x61,0x00,0x6C,0x00

};


const uint8_t Return1[2] = {0x31,0x00};

const uint8_t Return2[2] = {0xC3,0x00};

const uint8_t Return3[2] = {0x9F,0xEE};



只改配置描述符,

长度超过32还是发不出去


// 配置描述符

const uint8_t MyCfgDescr[] = {   0x09,0x02,0x27,0x00,0x01,0x01,0x00,0x80,0xf0,              //配置描述符,接口描述符,端点描述符

                                 0x09,0x04,0x00,0x00,0x03,0xff,0x01,0x02,0x00,

                                 0x07,0x05,0x82,0x02,0x40,0x00,0x00,                        //批量上传端点

                                 0x07,0x05,0x02,0x02,0x40,0x00,0x00,                        //批量下传端点

                                 0x07,0x05,0x81,0x03,0x08,0x00,0x01};                       //中断上传端点



CH582的USB例程下,COM代码中,USB工作模式选用USB_CDC_MODE模式,已经支持64字节包长了。

您看一下是不是电脑端识别出的是什么设备。端点传输端点描述符中有限制,电脑驱动端也有限制,若识别出来CH340,还是会有32字节包长的限制;识别是CH9340的话是支持64字节包长的。

注意待传输字节长度是64字节的整数倍,要在数据包发完后再传输一包0长度包,表示批量传输结束。


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