阅读:1300回复:2
大家来看看我的D12的发送和接受子程序是否正确,为什么枚举不正确?谢谢!!!
大家来看看我的发送和接受子程序:(单步执行时,ep_last为0X03,为什么?这可能是那里的错误,我在D12数据单里看到0X03表示数据接受或发送成功,PID解码错误,位7-4不是位3-0的反码 )
void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag if (ep_last & D12_SETUPPACKET) { ControlData.wLength = 0; ControlData.wCount = 0; if( D12_ReadBuffer(0,(unsigned char *)(&(ControlData.DeviceRequest)),sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST)) { D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); bEPPflags.bits.control_state = USB_IDLE; return; } ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); // Acknowledge setup here to unlock in/out endp D12_AcknowledgeEndpoint(0); D12_AcknowledgeEndpoint(1); ControlData.wLength = ControlData.DeviceRequest.wLength; ControlData.wCount = 0; if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */ } else { if (ControlData.DeviceRequest.wLength == 0) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; /* set command */ } else { if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { bEPPflags.bits.control_state = USB_IDLE; D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); } else { bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */ } } // set command with data } // else set command } // if setup packet else if (bEPPflags.bits.control_state == USB_RECEIVE) { i =D12_ReadBuffer(0, ControlData.dataBuffer + ControlData.wCount,EP0_PACKET_SIZE); ControlData.wCount += i; if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; } } else { bEPPflags.bits.control_state = USB_IDLE; } } //control in function 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; } } [编辑 - 7/5/03 by djsnake] |
|
沙发#
发布于:2003-07-07 23:27
用PHILIPS的D12程序不会有错的,只要你移植没有出错.我几乎没对CHAP_9.C做多大改动就在其他MCU上实现了USB的连接.
|
|
|
板凳#
发布于:2003-07-18 18:13
用PHILIPS的D12程序不会有错的,只要你移植没有出错.我几乎没对CHAP_9.C做多大改动就在其他MCU上实现了USB的连接. 楼上说的对,PHILIPS的D12的枚举等程序没什么问题,只是罗嗦了点,熟悉了是可以优化,要改的只是mainloop.c和isr.c |
|