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