代码如下:
_SetEPAddress(rx_ep, rx_ep);
_SetEPType(rx_ep, EP_BULK);
_SetEPDoubleBuff(rx_ep);
_SetEPDblBuffCount(rx_ep, EP_DBUF_OUT, 64);
_SetEPDblBuffAddr(rx_ep, EP_DBL0_ADDRESS(rx_ep), EP_DBL1_ADDRESS(rx_ep));
_ClearDTOG_RX(rx_ep);
_ClearDTOG_TX(rx_ep);
_ToggleDTOG_TX(rx_ep);
_SetEPRxStatus(rx_ep, EP_RX_VALID);
根据ST文档,第1个事务完成后,双缓冲的机制开始应用,第2个事务的令牌包到达后,硬件检查硬件缓冲区与用户缓冲区是否冲突,如果冲突就设置NAK状态。
那么,当第1个包收到后,位于缓冲区0中,硬件缓冲区自动切换为缓冲区1,如果用户程序不翻转用户缓冲区,第2个包到达时,就会发生冲突,所以第2个包应该收不到。
但是实际测试却不是这样,用户程序不翻转用户缓冲区,硬件却收到3个包,分别位于缓冲区0, 1, 0,第3个包后,硬件缓冲区重新回到了1,此时方才因为冲突报NAK。
总结:DBL_BUF启用后,第1个冲突不报告。第2个冲突及以后就正常了。
|