阅读:1623回复:6
???困扰了2天的问题--为什么不能够触发ISR_Ep2in中断???
读写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); |
|
沙发#
发布于:2003-05-27 22:23
用READFILE 试一试
|
|
板凳#
发布于:2003-05-28 10:21
READFILE和DeviceIOControl有什么区别那?
现在我用DeviceIOControl从指定的PIPE可以得到数据 但是只能是64byte,上面的主机程序里面把参数由512改成64就没有问题 但是不能触发EP2IN中断 |
|
地板#
发布于:2003-05-28 10:49
加两句试试:
EZUSB_IRQ_CLEAR(); IN07IRQ=bmEP2; 去掉 IN07IRQ=0xff; [编辑 - 5/28/03 by lpwnd] |
|
地下室#
发布于:2003-05-28 17:15
问题解决了,谢谢lpwnd大侠,马上散分
其实应该在ISR_EP2IN()的最后加上: EZUSB_IRQ_CLEAR(); OUT07IRQ=bmEP2; :) :) |
|
5楼#
发布于:2003-05-28 17:38
我不要分,呵呵。。。
加你为好友了 |
|
6楼#
发布于:2003-05-28 17:48
问你个问题,我的设备为什么READFILE 返回0,而writefile可以返回1啊,我没有设中断
|
|