在原来的程序中,虽然对端点的双缓冲区清除中断时有判断,但是还是存在着刚好读回时,双缓冲没满,但是写入时双缓冲区满的情况。这样的话就会丢失中断,导致一些数据在缓冲区拿不出来,要等下一次接收到数据时才能拿出来。
将原来程序中的void UsbEp2Out(void)函数中的 //读最后接收状态,这将清除端点2输出的中断标志位。 //注意端点2有个双缓冲机制,在清除中断之前,先检查是否两个缓冲区 //是否全满了,如果两个缓冲区全满的话,就不用清除中断标志。只有当 //两个缓冲区不全满的时候才需要清除中断标志。 if((D12ReadEndpointStatus(4)&0x60)!=0x60) { D12ReadEndpointLastStatus(4); } 部分删除,在函数最后增加如下代码:
if(!(D12ReadEndpointStatus(4)&0x60)) //如果任何一个缓冲区又有数据,则不要清除中断 { D12ReadEndpointLastStatus(4); //清除端点中断 }
然后重新编译之。 |