阅读:1135回复:3
郁闷--d12枚举
为什么郁闷的人总是我?希望各位仁兄帮忙,小弟在调试USB枚举时,在进行单步执行时,
当执行到函数ep1_txdone()中的unsigned char D12_WriteBuffer(unsigned char endp , unsigned char *buf, unsigned char len) reentrant时出现死循环,当鼠标移到buf 时,提示指针无效,同时len也为0 ,但我觉得程序是对的,不知这是为什么???望各位 仁兄帮忙。小弟先谢了!!!! |
|
沙发#
发布于:2003-04-19 08:47
把程序贴出来让大家看一下,要不谁也不知道你错哪儿了
|
|
板凳#
发布于:2003-04-19 16:54
void ep0_txdone(void)
{ short i = ControlData.wLength - ControlData.wCount; D12_ReadLastTransactionStatus(1); // Clear interrupt flag if (bEPPflags.bits.control_state != USB_TRANSMIT) return; //------------------------- if( i >= EP0_PACKET_SIZE) { //ControlData.pData=&ControlData.dataBuffer; D12_WriteBuffer(1, ControlData.pData + ControlData.wCount,EP0_PACKET_SIZE); ControlData.wCount += EP0_PACKET_SIZE; bEPPflags.bits.control_state = USB_TRANSMIT; } else if( i != 0) { D12_WriteBuffer(1,ControlData.pData + ControlData.wCount,i); ControlData.wCount += i; bEPPflags.bits.control_state = USB_IDLE; } else if (i == 0) { D12_WriteBuffer(1, 0, 0); // Send zero packet at the end ??? bEPPflags.bits.control_state = USB_IDLE; } } unsigned char D12_WriteBuffer(unsigned char endp ,unsigned char *buf,unsigned char len) reentrant { unsigned char i; if(bEPPflags.bits.in_isr == 0) DISABLE; outportb(D12_COMMAND,endp); //选择端点 inportb(D12_DATA); //读入满/空状态 //********************************************** outportb(D12_COMMAND,0xF0); //写缓冲区命令 outportb(D12_DATA,0); outportb(D12_DATA,len); for(i=0; i<len; i++) { outportb(D12_DATA, *(buf+i)); outportb(D12_COMMAND,0xFA); //VALIDATE BUFFER } if(bEPPflags.bits.in_isr == 0) ENABLE; return len; } |
|
地板#
发布于:2003-04-19 17:58
程序应该没什么问题呀,你先检查一下几个常量的设置是不是有误,然后再看写入到端点的变量值是不是正确,比如ControlData.wLength和ControlData.wCount等
|
|