来点个人理解的HID知识点
HID通过端点方式来和PC进行USB交互
其中端点0不用配置,可以直接进行收/发数据,通常是来配置USB信息,比如描述符
该MCU型号是MM32F0133C7P ,共有5个端点(Endpoint)
另有端点1-4,这4个端点只能配置为收或发任选一,而不能同时存在,通过端点0配置的描述符固定了他是收还是发,还是不用
这些均在usb_conf.h 和 usb_pwr.c 以及usb_desc.c ,这3个文件中进行配置
上次用了官方示例库 MM32F013x_Samples\LibSamples\USB\USB_HID_Suspend
这个示例只能用端点1回复PC数据,端点3接收数据,
我将它改成了端点1为IN(上传PC数据),端点2为OUT,接收PC数据。
以下是修改的代码:
CustomHID_ConfigDescriptor 结构体中
bEndpointAddress: Endpoint Address (IN)
0x81改成0x80+输入端点号1-4,
0x03, // bEndpointAddress:
0x3改成0x2,OUT端点3改成2,
注释掉
//#define EP2_OUT_Callback NOP_Process
然后写对应的回调函数,在usb_endp.c中
在回调函数中接收数据并处理
void EP2_OUT_Callback(void){
PMAToUserBufferCopy(Receive_Buffer, ENDP2, BUFF_SIZE);
// 你的代码
}
PowerOn函数中配置使能相应端点
开启端点1
_SetEP1_INT_EN(EPn_INT_EN_INACKIE); // EPn_INT_EN_INACKIE
_ClrEP1_INT_STA(EPn_INT_STATE_INACK); // EPn_INT_STATE_INACK
开启端点2
_SetEP2_INT_EN(EPn_INT_EN_OUTACKIE);
_ClrEP2_INT_STA(EPn_INT_STATE_OUTACK);
注释掉原有端点3代码
_SetEP_EN((1 << ENDP0) | (1 << ENDP1) | (1 << ENDP2));
_SetEP_INT_EN((1 << ENDP0) | (1 << ENDP1) | (1 << ENDP2));
还没用过这款开发板的HID,下周用完也写一篇。