USB on-the-go high-speed (OTG_HS)
RM0090
1496/1731
DocID018909 Rev 11
•
Isochronous IN transactions
The assumptions are:
–
The application is attempting to receive one packet (up to 1 maximum packet size)
in every frame starting with the next odd frame (transfer size = 1 024 bytes).
–
The receive FIFO can hold at least one maximum-packet-size packet and two
status DWORDs per packet (1 031 bytes).
–
Periodic request queue depth = 4.
The sequence of operations is as follows:
a) Initialize channel 2. The application must set the ODDFRM bit in
OTG_HS_HCCHAR2.
b) Set the CHENA bit in OTG_HS_HCCHAR2 to write an IN request to the periodic
request queue. For a high-bandwidth isochronous transfer, the application must
write the OTG_HS_HCCHAR2 register MCNT (maximum number of expected
packets in the next frame times) before switching to another channel.
c) The OTG_HS host writes an IN request to the periodic request queue for each
OTG_HS_HCCHAR2 register write with the CHENA bit set.
d) The OTG_HS host attempts to send an IN token in the next odd frame.
e) As soon as the IN packet is received and written to the receive FIFO, the OTG_HS
host generates an RXFLVL interrupt.
f)
In response to the RXFLVL interrupt, read the received packet status to determine
the number of bytes received, then read the receive FIFO accordingly. The
application must mask the RXFLVL interrupt before reading the receive FIFO, and
unmask it after reading the entire packet.
g) The core generates an RXFLVL interrupt for the transfer completion status entry in
the receive FIFO. This time, the application must read and ignore the receive
packet status when the receive packet status is not an IN data packet (PKTSTS bit
in OTG_HS_GRXSTSR
≠
0b0010).
h) The core generates an XFRC interrupt as soon as the receive packet status is
read.
i)
In response to the XFRC interrupt, read the PKTCNT field in OTG_HS_HCTSIZ2.
If PKTCNT
≠
0 in OTG_HS_HCTSIZ2, disable the channel before re-initializing the
channel for the next transfer, if any. If PKTCNT = 0 in OTG_HS_HCTSIZ2,
reinitialize the channel for the next transfer. This time, the application must reset
the ODDFRM bit in OTG_HS_HCCHAR2.
•
Selecting the queue depth
Choose the periodic and nonperiodic request queue depths carefully to match the
number of periodic/nonperiodic endpoints accessed.
The nonperiodic request queue depth affects the performance of nonperiodic transfers.
The deeper the queue (along with sufficient FIFO size), the more often the core is able
to pipeline nonperiodic transfers. If the queue size is small, the core is able to put in
new requests only when the queue space is freed up.
The core’s periodic request queue depth is critical to perform periodic transfers as
scheduled. Select the periodic queue depth, based on the number of periodic transfers
scheduled in a micro-frame. In Slave mode, however, the application must also take
into account the disable entry that must be put into the queue. So, if there are two
nonhigh-bandwidth periodic endpoints, the periodic request queue depth must be at
least 4. If at least one high-bandwidth endpoint is supported, the queue depth must be