Xranger
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2004-08-06
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1681回复:7

熟悉USBN9604的请进啊!

楼主#
更多 发布于:2004-05-31 13:46
我用的是FPGA+USBN9604,参考着NS的源码写好初始化过程之后,发现只收到ALT中断,而且ALT中断里全部是RESET和WKUP事件,这样的话枚举根本无法进行下去。下面是我的初始化和对RESET和WKUP事件的处理过程,帮忙看看吧!

初始化:
//设置MCNTRL
//INT_H_P | VGE->MCNTRL 设置中断高电平有效及电压

//屏蔽所有USB中断
//0->MAMSK 设置屏蔽所有USB中断

//开放FIFO0 OUT的NAK中断
//NAK_OUT0->NAKMSK 设置开放FIFO0 OUT的NAK中断

//开放FIFO0 tx中断和tx FIFO1中断
//TX_FIFO0|TX_FIFO1->TXMSK 设置开放FIFO0 tx中断和tx FIFO1中断

//开放FIFO0 rx中断和rx FIFO1中断
//RX_FIFO0|RX_FIFO1->RXMSK 设置开放FIFO0 rx中断和rx FIFO1中断

//开放ALT中断中的SD3和RESET
//ALT_SD3|ALT_RESET->ALTMSK 设置开放SD3和RESET中断

//开放总中断、RX_EV、NAK、TX_EV和ALT中断
//INTR_E|RX_EV|NAK|TX_EV|ALT->MAMSK 设置开放上述中断

  reset_usb();

//写入NodeOperational状态
//NodeOperational->NFSR设置状态

//ATTACH_NODE

其中reset_usb():
//开放USB设备初始地址
//AD_EN->FAR 设置开放地址

FLUSHTX0 //ep0
FLUSHTX1 //ep1
FLUSHRX0 //ep0
FLUSHRX1 //ep2

//开放RX0接收
//RX_EN->RXC0寄存器



ALT_RESET:
CLEAR_STALL_EP0;
GOTO_STATE(RST_ST);
write_usb(FAR,AD_EN+0);
write_usb(EPC0, 0x00);
SET_USB_DEVICE_ADDRESS;
USB_DEVICE_ADDRESS_ENABLE;
FLUSHTX0;
FLUSHTX1;
FLUSHRX0;
FLUSHRX1;
ENABLE_RX0;
GOTO_STATE(OPR_ST);

ALT_WKUP:
清除WKUP里的PNDUC和PNDUSB
Xranger
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2004-08-06
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-31 16:00
自己顶,以防沉了
bbiliu
驱动牛犊
驱动牛犊
  • 注册日期2004-02-20
  • 最后登录2005-01-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-01 11:40
下面是我的程序中用到的程序,你参考看看,下面的程序是成功的。

WriteUsb(uALTMSK, uALT_SD3|uALT_RESET);/*该语句在usbn9603_init中,用于打开alt中断的屏蔽,我只开了sd3和reset,建议你不要开wakeup中断*/

下面的函数是ALT中断的处理程序,和你的稍有不同,看看对你有没有帮助:

void USBN9603_alt_event_handler(void)
{
  char altev_value = 0;
  char altev_mask = 0x01;
// char test = 0;
 
 // test = ReadUsb(uALTMSK);
  altev_value = ReadUsb(uALTEV);
 
// Uart_Printf(\"in alt event\\n\",0);

  while(altev_value)
  {
  switch(altev_value & altev_mask)
  {
  case  uALT_RESET:
  //Uart_Printf(\"in alt reset \\n\",0);

WriteUsb(uEPC0, ReadUsb(uEPC0)&~uSTALL);
WriteUsb(uNFSR, uRST_ST); //go to reset stat
  WriteUsb(uFAR, uAD_EN + 0); //set default address
  //enable epc0 only
WriteUsb(uEPC0, 0x00);
//reset usb
reset_usb();
usb_device_reset();
//go to normal stat
//WriteUsb(uALTMSK, uALT_SD3|uALT_RESET);
WriteUsb(uNFSR, uOPER_ST);
  break;
  case  uALT_SD3:
  case  uALT_SD5:
  //Uart_Printf(\"in alt sd3\\n\",0);
  WriteUsb(uALTMSK, uALT_SD3|uALT_RESET|uALT_RESUME);
  WriteUsb(uNFSR, uSUS_ST);
  break;
  case  uALT_RESUME:
  //Uart_Printf(\"in alt resume\\n\",0);
  WriteUsb(uALTMSK, uALT_SD3|uALT_RESET);
  WriteUsb(uNFSR, uOPER_ST);
  WriteUsb(uRXC0,uRX_EN);
  break;

  case uALT_EOP:
  // Uart_Printf(\"in alt eop\\n\",0);
  break;
  case uALT_WKUP:
  // Uart_Printf(\"in alt wkup \\n\",0);
  // WriteUsb(uWKUP,ReadUsb(uWKUP)&0xfc);
  break;
  default:
  // Uart_Printf(\"in alt default\\n\",0);
  break;
  } //end switch
  altev_value &= ~altev_mask;
  altev_mask = altev_mask << 1;
  } //end while;
   
}//end alt
Xranger
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2004-08-06
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-01 13:55
你贴的就是NS的demo程序吧,我的程序就是参考着NS的demo来的,只不过我没有把ALT中断里的RESUME和SD3/SD5处理过程贴上来,因为我收到的ALT中断里只有RESET和WKUP事件,而且我在初始化ALT的时候只开放了RESET和SD3事件,WKUP事件我没有打开,但是还是收到了。唯一不同的是usb_device_reset();这个函数看起来不是对9604的寄存器操作的,所以我就没有做,这应该没什么影响吧。
Xranger
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2004-08-06
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-02 21:26
顶啊顶,千万不要沉了,已经在这个问题上卡了很久了...
Xranger
驱动牛犊
驱动牛犊
  • 注册日期2004-04-07
  • 最后登录2004-08-06
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-03 14:35
高手们帮忙啊!
khao513
驱动牛犊
驱动牛犊
  • 注册日期2004-07-06
  • 最后登录2004-07-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-14 14:37
我可以更你讨论一下,不过我的情况和你不同。
flywill
驱动牛犊
驱动牛犊
  • 注册日期2003-05-29
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-20 16:59
请问楼上的各位大侠,我以前做的是D12的上层Demo软件,我现在想用USBN9604,该怎样写Demo.两者差别大吗?哪里能找到USBN9604的上层例程,多谢
游客

返回顶部