刚又仔细看了下你的代码,汗,整个流程都错了。
void USBCom_RecvPacket(u8 *Data) { pUSBRecvData = Data; USBRecvLen = GetEPRxCount(ENDP3); PMAToUserBufferCopy(pUSBRecvData,ENDP3_RXADDR,USBRecvLen); SetEPRxValid(ENDP3); } 你的这段代码中的 USBRecvLen = GetEPRxCount(ENDP3); PMAToUserBufferCopy(pUSBRecvData,ENDP3_RXADDR,USBRecvLen); 这两句话,都应该是在端点3的接收完成后执行的,所以不能放在启动接收的代码中,而应放在端点3的OUT中断中,即EP3_OUT_Callback()中。而启动接收的代码应该是最简单的SetEPRxValid(ENDP3);
整个过程应该是使能端点3的RX -> PC发送数据 -> STM32产生端点3的OUT中断 -> 在中断中把PC发送的数据保存到用户管理的存储区中。-> 配置用户标志位,表示接收完成,同时再次使能端点3的RX,允许下次的数据接收。
简单说你的代码应该是: main() { .... SetEPRxValid(ENDP3); while(1){ if(ReceiveFlag){ USBCom_SentData(RecvBuffTemp, USBRecvLen); ReceiveFlag = 0; } } }
EP3_OUT_Callback() { USBRecvLen = GetEPRxCount(ENDP3); PMAToUserBufferCopy((pUSBRecvData, ENDP3_RXADDR, USBRecvLen ); SetEPRxValid(ENDP3); ReceiveFlag = 1; }
|