RM0090
handshake, the packet count for the endpoint is decremented by one, until the packet
count is zero. The packet count is not decremented on a timeout.
5.
For zero length packets (indicated by an internal zero length flag), the core sends out a
zero-length packet for the IN token and decrements the packet count field.
6.
If there are no data in the FIFO for a received IN token and the packet count field for
that endpoint is zero, the core generates an "IN token received when TxFIFO is empty"
(ITTXFE) Interrupt for the endpoint, provided that the endpoint NAK bit is not set. The
core responds with a NAK handshake for non-isochronous endpoints on the USB.
7.
The core internally rewinds the FIFO pointers and no timeout interrupt is generated.
8.
When the transfer size is 0 and the packet count is 0, the transfer complete (XFRC)
interrupt for the endpoint is generated and the endpoint enable is cleared.
Application programming sequence
1.
Program the OTG_FS_DIEPTSIZx register with the transfer size and corresponding
packet count.
2.
Program the OTG_FS_DIEPCTLx register with the endpoint characteristics and set the
CNAK and EPENA (Endpoint Enable) bits.
3.
When transmitting non-zero length data packet, the application must poll the
TG_FS_DTXFSTSx register (where x is the FIFO number associated with that
O
endpoint) to determine whether there is enough space in the data FIFO. The
application can optionally use TXFE (in OTG_FS_DIEPINTx) before writing the data.
•
Generic periodic IN data transfers
This section describes a typical periodic IN data transfer.
Application requirements
1.
Application requirements 1, 2, 3, and 4 of
page 1356
requirement 2.
–
–
–
2.
The application can only schedule data transfers one frame at a time.
–
–
also apply to periodic IN data transfers, except for a slight modification of
The application can only transmit multiples of maximum-packet-size data packets
or multiples of maximum-packet-size packets, plus a short packet at the end. To
transmit a few maximum-packet-size packets and a short packet at the end of the
transfer, the following conditions must be met:
transfer size[EPNUM] = x × MPSIZ[EPNUM] + sp
(where x is an integer ≥ 0, and 0 ≤ sp < MPSIZ[EPNUM])
If (sp > 0), packet count[EPNUM] = x + 1
Otherwise, packet count[EPNUM] = x;
MCNT[EPNUM] = packet count[EPNUM]
The application cannot transmit a zero-length data packet at the end of a transfer.
It can transmit a single zero-length data packet by itself. To transmit a single zero-
length data packet:
transfer size[EPNUM] = 0
packet count[EPNUM] = 1
MCNT[EPNUM] = packet count[EPNUM]
(MCNT – 1) × MPSIZ ≤ XFERSIZ ≤ MCNT × MPSIZ
PKTCNT = MCNT (in OTG_FS_DIEPTSIZx)
DocID018909 Rev 11
USB on-the-go full-speed (OTG_FS)
Generic non-periodic IN data transfers on
1357/1731
1368
Need help?
Do you have a question about the STM32F405 and is the answer not in the manual?
Questions and answers