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