初涉USB,初学者USB入门总结(2) 设备固件程序

[复制链接]
5045|5
 楼主| arthur0561 发表于 2009-2-23 18:00 | 显示全部楼层 |阅读模式
<B>二,实际数据过程测试</B><br />(图片颜色显示不出,可以到我博客<a href="http://blog.csdn.net/arthur05611/archive/2009/02/23/3929778.aspx" target=_blank>http://blog.csdn.net/arthur05611/archive/2009/02/23/3929778.aspx</a>)<br />这节主要是对固件里的USB请求处理有个概念,还有就是调试的方法。大篇幅的程序配合,如果不关心这一块的话可以跳过,呵呵。<br />为了更好的说明整个USB启动过程,我们可以用串口实时的跟踪各个USB中断。不过这里先不用串口进行测试,只是简单的用一组变量记录过程。测试程序如下(以下会有程序的说明):<br /><br />uchar&nbsp;test[100];//100长度的变量,记录过程<br />uchar&nbsp;conters=0;//记录计数值,<br />/*------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;高校电子联盟--肖继达<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QQ:258347765&nbsp;&nbsp;&nbsp;&nbsp;<br />-------------------------------------------------------------*/<br /><br />void&nbsp;EXT_int(void)//USB中断响应函数<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;/*------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Check&nbsp;interrupt&nbsp;status&nbsp;register&nbsp;to&nbsp;know&nbsp;interrupt<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source.<br />&nbsp;&nbsp;&nbsp;&nbsp;------------------------------------------------------------*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(USB_BUSRESET_ASS_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;USB&nbsp;bus&nbsp;reset&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;for&nbsp;USB&nbsp;Rev.1.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;After&nbsp;USB&nbsp;bus&nbsp;reset&nbsp;released,&nbsp;10msec&nbsp;recoverly&nbsp;time&nbsp;we&nbsp;have.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Follwing&nbsp;request&nbsp;must&nbsp;be&nbsp;processed&nbsp;normally.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_BUS_RESET_STATE();&nbsp;&nbsp;/*&nbsp;USB&nbsp;bus&nbsp;reset&nbsp;status&nbsp;clear&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endpoint0&nbsp;setting<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Tx/Rx&nbsp;payload&nbsp;size&nbsp;setting&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Rx&nbsp;payload&nbsp;is&nbsp;fixed&nbsp;as&nbsp;8-byte&nbsp;or&nbsp;32-byte,&nbsp;therefor&nbsp;the&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setting&nbsp;has&nbsp;no&nbsp;meaninig&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_PAYLOAD_EPn(EP0RX,&nbsp;device_descriptor.bMaxPacketSize0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SET_PAYLOAD_EPn(EP0TX,&nbsp;device_descriptor.bMaxPacketSize0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Stall&nbsp;bit,&nbsp;the&nbsp;value&nbsp;undefined&nbsp;after&nbsp;reset,&nbsp;cleared&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_STALL_EPn(EP0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Misceronous&nbsp;status&nbsp;variable&nbsp;initialization<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_status.configuration&nbsp;=&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_status.remote_wakeup&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_status.address&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_status.dvcstate&nbsp;=&nbsp;DEFAULT_STATE;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Device&nbsp;state&nbsp;:DEFAULT&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usb_status.stall_req&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='!';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;to&nbsp;application&nbsp;layer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;------------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*usb_status.callback)();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(SUSPENDED_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;suspended&nbsp;state&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;for&nbsp;USB&nbsp;Rev.1.1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transit&nbsp;to&nbsp;suspended&nbsp;state&nbsp;after&nbsp;detect&nbsp;the&nbsp;USB&nbsp;line&nbsp;has&nbsp;kept&nbsp;idle&nbsp;over&nbsp;3msec.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;After&nbsp;resume&nbsp;detected,&nbsp;end&nbsp;suspend&nbsp;state&nbsp;in&nbsp;3msec&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;respond<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;host&nbsp;request.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_SUSPENDED_STATE();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='@';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(AWAKE_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;Deveice&nbsp;awake&nbsp;state&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;AWAKE&nbsp;procedure&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_AWAKE_STATE();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Request&nbsp;clear&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='#';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(USB_BUSRESET_DES_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;USB&nbsp;bus&nbsp;reset&nbsp;deassert&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Procedure&nbsp;for&nbsp;USB&nbsp;bus&nbsp;reset&nbsp;de-assert&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_BUS_RESET_DES_STATE();&nbsp;&nbsp;/*&nbsp;Request&nbsp;clear&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='$';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(SOF_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;SOF&nbsp;interrupt&nbsp;status&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLR_B_SOF_STATE();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='%';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;SOF&nbsp;interrupt&nbsp;status&nbsp;clear&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;/*&nbsp;SOF&nbsp;interrupt&nbsp;status&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SETUP_RDY_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;setup&nbsp;ready&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;Debug<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test[conters]='^';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conters++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_Device_Requests();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(EP1_PKTRDY_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;EP1&nbsp;packet&nbsp;ready&nbsp;*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_FIFO(EP1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(EP2_PKTRDY_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;EP2&nbsp;packet&nbsp;ready&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_FIFO(EP2);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(EP0_RXPKTRDY_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;EP0&nbsp;receive&nbsp;packet&nbsp;ready&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_FIFO(EP0RX);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(EP0_TXPKTRDY_INT())<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;/*&nbsp;EP0&nbsp;transmit&nbsp;packet&nbsp;ready&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;write_FIFO(EP0TX);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br />计录的结果在变量查看中显示如下:<br /><br />首先我解释一下,这段程序是我在做USB设备时的中断函数。主控(就是你往里面写固件程序的那个东西)会在要求设备进行操作时,产生一个相应的中断(我们可以用中断的方式,也可以用查询的方式,中断的方式的好处就是主机有需要操作的都会叫你,而用查询你必须不断的问主机“有事么”,这里采用中断方式),比如主机给设备设置地址,主机会通过固定的通道(point0)发送一个‘设定地址’包,设备主控接到包后会产生中断,并且把响应的状态保存在相应的寄存器中,我们只要在中断程序判断各个寄存器就能完成主机的任务。<br />程序中蓝色字是中断类型的判断,其对应的宏定义就不列出来了。如果是这个中断就会执行相应的中断操作。并且一次中断只有一种中断类型,我们在每个中断响应中加一段红色字的程序,是为了保存每次中断的状态,比如刚插上设备,来了一次BUSRESET总线复位中断,就会进入相应的中断操作,完了后记录状态test[conters]='!';&nbsp;conters++;意思是进入了这个中断就在这一组数的当前位置设成'!',并且位置记录的变量加一,以便下一次记录到下一个位置。这样USB的过程我们就记录了下来,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面看一下记录结果(其中的数字和字母是响应标准请求时的程序产生的这里不罗列程序了)。<br />file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg<br /><br />可以看到,一开始是一次总线复位,然后USB&nbsp;bus&nbsp;reset&nbsp;de-assert,然后再挂起总线。重复了两次,然后就是上一节的具体配置了。<br />这节主要是对固件里的USB请求处理有个概念,还有就是调试的方法。<br />&nbsp;
 楼主| arthur0561 发表于 2009-2-23 18:03 | 显示全部楼层

图片颜色显示不出

这里图片,颜色显示不出,可以去我博客http://blog.csdn.net/arthur05611/archive/2009/02/23/3929778.aspx<br />谢谢支持哈,
clizhi 发表于 2009-3-1 20:40 | 显示全部楼层

不错,谢谢楼主

  
encijia 发表于 2009-5-4 11:01 | 显示全部楼层

顶上去!

串口实时的跟踪各个USB中断,这个方法好用
xiaox314 发表于 2013-7-3 11:39 | 显示全部楼层
顶顶顶死不负责
yoonssica 发表于 2013-7-11 10:33 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

84

帖子

9

粉丝
快速回复 在线客服 返回列表 返回顶部