USBD_STATUS_XACT_ERROR (0xC0000011) on high-bandwidth isochronous IN endpoint

Question: When using high-bandwidth isochronous IN endpoint (more than 1024 bytes and less than 3073 bytes per microframe) is used, from time to time we get USBD_STATUS_XACT_ERROR (0xC0000011). What is the reason behind this?



Based on the value of INPF1:0 bits of EPxISOINPKTS the PID of the data packet is generated. USB protocol uses the data PID of the first packet to find the number of packets the device would be able to send in the microframe. If the AADJ bit of EPxISOINPKTS is not set then the data packets are sent with fixed data PIDs based on the number of packets per microframe configuration. So if two or more packets of size lesser than the wMaxpacketsize (maximum packet size) of the endpoint is sent in the microframe then the PID will inform the host there is more data and the length of the packet will indicate end of transaction. This contradiction triggers USBD_STATUS_XACT_ERROR. Setting AADJ bit automatically manages the data PID sequencing using the packet length of the packets committed in the IN FIFO.