29.01.2015 Views

STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and ...

STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and ...

STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

RM0008<br />

USB on-the-go full-speed (OTG_FS)<br />

●<br />

●<br />

Isochronous IN transactions<br />

The assumptions are:<br />

– The application is attempting to receive one packet (up to 1 maximum packet size)<br />

in every frame starting with the next odd frame (transfer size = 1 024 bytes).<br />

– The receive FIFO can hold at least one maximum-packet-size packet <strong>and</strong> two<br />

status DWORDs per packet (1 031 bytes).<br />

– Periodic request queue depth = 4.<br />

The sequence of operations is as follows:<br />

a) Initialize channel 2. The application must set the ODDFRM bit in<br />

OTG_FS_HCCHAR2.<br />

b) Set the CHENA bit in OTG_FS_HCCHAR2 to write an IN request to the periodic<br />

request queue. For a high-b<strong>and</strong>width isochronous transfer, the application must<br />

write the OTG_FS_HCCHAR2 register MCNT (maximum number of expected<br />

packets in the next frame times) before switching to another channel.<br />

c) The OTG_FS host writes an IN request to the periodic request queue for each<br />

OTG_FS_HCCHAR2 register write with the CHENA bit set.<br />

d) The OTG_FS host attempts to send an IN token in the next odd frame.<br />

e) As soon as the IN packet is received <strong>and</strong> written to the receive FIFO, the OTG_FS<br />

host generates an RXFLVL interrupt.<br />

f) In response to the RXFLVL interrupt, read the received packet status to determine<br />

the number of bytes received, then read the receive FIFO accordingly. The<br />

application must mask the RXFLVL interrupt before reading the receive FIFO, <strong>and</strong><br />

unmask it after reading the entire packet.<br />

g) The core generates an RXFLVL interrupt for the transfer completion status entry in<br />

the receive FIFO. This time, the application must read <strong>and</strong> ignore the receive<br />

packet status when the receive packet status is not an IN data packet (PKTSTS bit<br />

in OTG_FS_GRXSTSR 0b0010).<br />

h) The core generates an XFRC interrupt as soon as the receive packet status is<br />

read.<br />

i) In response to the XFRC interrupt, read the PKTCNT field in OTG_FS_HCTSIZ2.<br />

If PKTCNT 0 in OTG_FS_HCTSIZ2, disable the channel before re-initializing the<br />

channel for the next transfer, if any. If PKTCNT = 0 in OTG_FS_HCTSIZ2,<br />

reinitialize the channel for the next transfer. This time, the application must reset<br />

the ODDFRM bit in OTG_FS_HCCHAR2.<br />

Selecting the queue depth<br />

Choose the periodic <strong>and</strong> non-periodic request queue depths carefully to match the<br />

number of periodic/non-periodic endpoints accessed.<br />

The non-periodic request queue depth affects the performance of non-periodic<br />

transfers. The deeper the queue (along with sufficient FIFO size), the more often the<br />

core is able to pipeline non-periodic transfers. If the queue size is small, the core is able<br />

to put in new requests only when the queue space is freed up.<br />

The core’s periodic request queue depth is critical to perform periodic transfers as<br />

scheduled. Select the periodic queue depth, based on the number of periodic transfers<br />

scheduled in a microframe. In Slave mode, however, the application must also take into<br />

account the disable entry that must be put into the queue. So, if there are two non-highb<strong>and</strong>width<br />

periodic endpoints, the periodic request queue depth must be at least 4. If at<br />

least one high-b<strong>and</strong>width endpoint is supported, the queue depth must be 8. If the<br />

Doc ID 13902 Rev 9 809/995

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!