Board logo

标题: [求助]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