cookid
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2005-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1623回复:6

???困扰了2天的问题--为什么不能够触发ISR_Ep2in中断???

楼主#
更多 发布于:2003-05-27 19:44
    读写NAND Flashrom,用快速块传输,只用了端点2IN和2OUT,没有设置为端点对,大概的思路是pc发command,在ISR_Ep2out()中判断command,如果是读(EZSDK_READ),就对flashrom写命令、写地址、然后开始读64byte到IN2BUF,读完后arm端点2IN,等主机把数据读完后发下一个IN Token,触发EP2IN中断,在ISR_Ep2in()里面继续往IN2BUF填数据,填完64byte后再arm端点2IN,这样直到传输完512byte(NAND Flashrom的一页)为止。
   现在的问题是:在ISR_Ep2out()中填入的数据可以被主机接收,IN2BC也填成64,但是接下来就是没有办法进入ISR_Ep2in()执行下面的数据传输,想了好长时间都不知道是什么道理。看看我的firmware吧:
void TD_Init(void)
{
    IN07VAL |= bmEP2 + bmEP3;
    OUT07VAL |= bmEP2 + bmEP3;
    IN07IEN  = 0xff;
    OUT07IEN  = 0xff;

    EPIO[OUT2BUF_ID].bytes = 0;

    suspCount = 1;

    OEA = 0xFF;
    OEB = 0x03;
    OEC = 0xFF;
    
    CLE_disable();
    ALE_disable();

    IN07IRQ=0xff;
    USBIRQ = 0xff;

    Rwuen = TRUE;
    gUpLoad_Flag = STATUS_DOWNLOAD ;
}

void ISR_Ep2out(void) interrupt 0
{
判断command;

gUpLoad_Flag = STATUS_UPLOAD

CLE_enable();
写命令;
CLE_disable();

ALE_enable();
写地址(3cycles);
ALE_disable();

读64byte到IN2BUF;

OUT2BC = 64;
IN2BC  = 64;//按理说arm了IN2以后,等数据传完就可以触发ISR_Ep2in的,可就是进不去
}

void ISR_Ep2in(void) interrupt 0
{
if (gUpLoad_Flag == STATUS_UPLOAD) {
   读64byte到IN2BUF;
   gFileSize -= 64;
   IN2BC = 64;
   }
   if (gFileSize == 0){
      gUpLoad_Flag = STATUS_DOWNLOAD ;//512个字节传输完毕
   }

}

PC端应用程序:

bulkControl.pipeNum = BULK_IN_PIPE;
ret = DeviceIoControl(hEZDSK,
IOCTL_EZUSB_BULK_READ,
&bulkControl,
sizeof(BULK_TRANSFER_CONTROL),
&gBuffer,
512,
&nbyte,
NULL);
if(ret == FALSE){
  MessageBox(NULL, \"数据上载传输错误 !!\", \"EZUSB\",MB_ICONSTOP);
exit (-1);
}
_write(fh, gBuffer, 512);
_close(fh);
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-27 22:23
用READFILE 试一试
cookid
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2005-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-28 10:21
READFILE和DeviceIOControl有什么区别那?
现在我用DeviceIOControl从指定的PIPE可以得到数据
但是只能是64byte,上面的主机程序里面把参数由512改成64就没有问题
但是不能触发EP2IN中断
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-28 10:49
加两句试试:
EZUSB_IRQ_CLEAR();
IN07IRQ=bmEP2;
去掉
IN07IRQ=0xff;


[编辑 -  5/28/03 by  lpwnd]
cookid
驱动牛犊
驱动牛犊
  • 注册日期2003-03-19
  • 最后登录2005-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-28 17:15
问题解决了,谢谢lpwnd大侠,马上散分
其实应该在ISR_EP2IN()的最后加上:
EZUSB_IRQ_CLEAR();
OUT07IRQ=bmEP2; :) :)
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-28 17:38
我不要分,呵呵。。。
加你为好友了
lpwnd
驱动小牛
驱动小牛
  • 注册日期2003-03-04
  • 最后登录2012-01-20
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-28 17:48
问你个问题,我的设备为什么READFILE 返回0,而writefile可以返回1啊,我没有设中断
游客

返回顶部