记录MM32F0133C6P关于USB 的配置
USB工程配置
关于MM32的USB配置,可以使用例程中的工程配置,并无特殊注意事项
USB 设备描述符配置
描述符中需要注意的只有USB设备描述符
, CustomHID_ConfigDescriptor
, CustomHID_StringVendor
,CustomHID_StringProduct
- 其中
USB设备描述符
需要注意idVendor
idProduct
,也就是VID与PID CustomHID_ConfigDescriptor
需要注意Descriptor of Custom HID endpoints
,也就是USB短点描述,每个字符的含义可以另找说明,在这就不进行详细说明了,我的配置如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// 27
0x07, // bLength: Endpoint Descriptor size
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType:
0x81, // bEndpointAddress: Endpoint Address (IN)
0x03, // bmAttributes: Interrupt endpoint
0x40, // wMaxPacketSize: 64 Bytes max
0x00,
0x02, // bInterval: Polling Interval (32 ms)
// 34
0x07, // bLength: Endpoint Descriptor size
USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType:
// Endpoint descriptor type
0x03, // bEndpointAddress:
// Endpoint Address (OUT)
0x03, // bmAttributes: Interrupt endpoint
0x40, // wMaxPacketSize: 2 Bytes max
0x00,
0x02, // bInterval: Polling Interval (20 ms)CustomHID_StringVendor
是厂家描述符,不过需要转换为unicode码,比如中文就是两个字节,而英文就一个字节,第二个字节为0CustomHID_StringProduct
是产品描述符
中间可能会出现CUSTOMHID_SIZ_STRING_VENDOR报错,是因为CUSTOMHID_SIZ_STRING_VENDOR设置的值不符合数组大小,其余的同理
USB读写
读取在设备描述符无问题的情况下,使用的是callback方式读取USB数据,比如我使用的EP3端点进行收,而callback是
EP3_OUT_Callback
,代码如下1
2
3
4
5
6
7
8void EP3_OUT_Callback(void)
{
BitAction Led_State;
PMAToUserBufferCopy(Receive_Buffer, ENDP3, BUFF_SIZE);
USB_receive(Receive_Buffer,BUFF_SIZE);
}其中
BUFF_SIZE
是64,因为批量传输每次都需要传输毅整个帧发送
USB 发送与接收大同小异,代码如下if(bDeviceState == CONFIGURED) { if(!(_GetUSB_CTRL1()&EP1_CTRL_TRANEN)) { UserToPMABufferCopy(buffer_in, ENDP1, 64); _SetUSB_CTRL1(EP1_CTRL_TRANEN | 64) ; //Loop IN transmission } }
其他设置
使用例程的情况下,会出现一段时间之后,USB掉线的情况,是因为例程是有低功耗设置,在USB无活动的时候,会自动挂起,等待唤醒,
void USB_Istr(void)
中,有Suspend()
,可以自行修改MM32的USB不需要上下拉电阻,但是可能会出现USB D+ D-连接错误的情况,需要注意
- MM32的USB时钟需要设置为48M,也需要开启CSR