标题: [求助]usb firmware编程问题 [打印本页]
作者: polarbear2008 时间: 2005-10-9 14:49 标题: [求助]usb firmware编程问题
freescale网站上说几乎所有的标准请求都可由硬件处理,只有get_descriptor须由固件处理.
可是,我在 使能USB MODULE 和Normal PHY operation ,并且允许SETUP中断后,
为什么无法进入setup中断程序?
也就是说并没有检测到get_descriptor命令,是不是我漏掉了一些其他设置?
而且我在setup data buffer 里面看到最后一条setup command 是
00 00 0000 0008 0015
从第二个字节是00看应该是get_status命令,
但是其他字节好像又和这条命令有矛盾.
[此贴子已经被作者于2005-10-9 14:49:52编辑过]
作者: seuafu2005 时间: 2005-10-9 16:04
是的,在standard request里面,只需要处理get_descriptor。
整个MCU的中断有没有放开?
UMCRH寄存器中,USB PHY clock有没有enable?
作者: polarbear2008 时间: 2005-10-9 17:24
好像没有UMCRH 这个寄存器吧 我搜索了所有data sheet 没找到阿
我试过statuschange中断,可以进入.说明中断应该不会被屏蔽.
而且主机肯定send get_descriptor 命令,可是为什么不进入setup中断子程序呢
作者: polarbear2008 时间: 2005-10-9 17:35
你指的是不是MCE?enable clock to USB2.0 Module 这个设置过了
作者: seuafu2005 时间: 2005-10-9 17:54
对,是MCE位。
你说主机肯定send get_descriptor命令是怎么得出来的?
如果主机确实有该命令出来的话,你尝试不用中断,用循环读UMSR1的SETUP标志位的方式,看看能不能检测到get_descriptor的命令。
作者: polarbear2008 时间: 2005-10-9 18:13
在setup中断子程序里面设置断点,debug时,CodeWarrior的Command 窗口出现绿色的ILLEGAL_BP ,不知道是怎么回事.
作者: polarbear2008 时间: 2005-10-9 18:37
用循环的方法也检测不到...
主机在什么情况下会不发get_descriptor呢
我运行这段程序后,已经检测到该设备了,而且在enumdone标志位也为1.
作者: seuafu2005 时间: 2005-10-10 09:57
Illegal_Bp是Illegal breakpoint。你还是需要检查一下你的程序是否有问题。
你说设备检测到了,那设备的类型描述正确吗?
另外,看看你的USB线是否良好,特别是接地端是否接触良好。从USB口取电的话,注意电流大小。
作者: polarbear2008 时间: 2005-10-10 13:25
我觉得我现在做的应该是最开始的步骤,我全部程序就只有下面几行:
#include "hidef.h" /* common defines and macros */
#include "MC9S12UF32.h" /* derivative information */
#pragma LINK_INFO DERIVATIVE "1"
byte breakpoint=0;
void interrupt 22 setup(void) {
if(UMSR1_SETUP==1)
breakpoint=1;
else
breakpoint=2;
}
void main(void) {
EnableInterrupts;
UMCR_MCE=1; //enable clock to USB2.0 Module
UMCR_SPHY=0; //normal phy operation
UMCR_DISCON=0; //normal operation on USB bus
UIMR_SETUPIE=1; //enable setup interrupt
UMCR_MEM=1; //enable USB2.0 Module(不知道这一步是否需要)
for(;;){
if(UMSR1_SETUP==1)
breakpoint=1;
else
breakpoint=2;
}
}
[此贴子已经被作者于2005-10-10 13:25:41编辑过]
作者: polarbear2008 时间: 2005-10-10 13:26
(供电方式是默认状态的bus-powered)
执行这段程序后,enumeration 完成,电脑上显示自动搜索设备驱动,但失败.
我把断点先后设在两个breakpoint=1处,都没有效果.
根据USB2.0 规范, enumeration 完成后,主机应该发送Get_Descriptor,但我却没有收到.
不知道是不是我的这些设置显然不够?
[此贴子已经被作者于2005-10-10 13:26:37编辑过]
作者: polarbear2008 时间: 2005-10-10 14:54
我用其他工具测过,主机确实发了Get_Descriptor 给我,但是我却没有收到...
是不是我有些寄存器没设置好呢?
作者: seuafu2005 时间: 2005-10-10 17:14
前面USB的初始化没有问题,UMCR_MEM=1; 这句话肯定是要的。
COPCTL = 0; 把COP关掉
你没有配置其他的endpoint,试试配置一个endpoint1
UEPCSR0和UEPCSR1寄存器中的TFRC把它清一下。
作者: polarbear2008 时间: 2005-10-11 11:12
试一试 痛苦 没做过USB通信
作者: polarbear2008 时间: 2005-10-11 11:19
请教一下 USB设备固件设计 有没有比较详细的书,或者是网上的资料呢
freescale的网站上的参考设计,我看起来好像没什么心得
[此贴子已经被作者于2005-10-11 11:19:54编辑过]
作者: oldxie 时间: 2006-3-29 22:54
我也遇到同样的问题,请问是怎么解决的呢?新手求教
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |