User manual

Table Of Contents
Zynq-7000 AP SoC Technical Reference Manual www.xilinx.com 349
UG585 (v1.11) September 27, 2016
Chapter 12: Quad-SPI Flash Controller
Note that the TxFIFO width must be programmed to 32 bits: qspi.Config_reg[FIFO_WIDTH] = 0b11.
Software needs to take care of “consecutive non word aligned” transfers.
Example: I/O Mode Interrupt Service Routine
1. Configure the ISR to handle the interrupt conditions based on the Quad-SPI device type. To
read from the Quad-SPI device, the simplest ISR reads data from the RxFIFO and writes content
to the TxFIFO. The system interrupt controller (GIC) is described in Chapter 7, Interrupts. The
controller generates a system peripheral interrupt (SPI), IRQ ID #51. The interrupt mechanism for
the Quad-SPI controller is described in section 12.3.4 I/O Mode Interrupts.
a. Read transfer interrupt. RxFIFO Not Empty Interrupt
b. Write transfer interrupt. TxFIFO Not Full Interrupt
12.3.4 I/O Mode Interrupts
Interrupts are only used in I/O mode. The controller interrupt is asserted whenever any of the
interrupt conditions are met. The Quad-SPI interrupt handler checks the cause of the interrupt. A
single interrupt service routine can manage all of the interrupt conditions.
Example: Interrupt Handler for Rx and Tx
The interrupt handler is trigger by IRQ ID #51. The example reads the RxFIFO until it is empty and
then fills-up the TxFIFO. The RxFIFO Not Empty Interrupt status is used to determine if content can
be read from the RxFIFO. The TxFIFO Not Full interrupt indicates if there is room in the TxFIFO for
more content.
1. Disable all of the interrupts in the controller. Set qspi.Intrpt_dis_REG[TX_FIFO_not_full,
RX_FIFO_full] both = 1.
2. Clear the interrupts. Read the interrupt status register qspi.Intr_status_REG.
3. Empty the RxFIFO. Check if RxFIFO Not Empty interrupt is asserted. If
qspi.Intr_status_REG[RX_FIFO_not_empty] = 1, then there is data in the RxFIFO.
a. If the status is asserted, then read data from the RxFIFO. Read the data using the
qspi.RX_data_REG register.
b. Read data from the RxFIFO and poll the interrupt status until the RxFIFO is empty. The
RxFIFO is empty when qspi.Intr_status_REG[RX_FIFO_not_empty] = 0.
4. Fill the TxFIFO. Check if the TxFIFO Not Full status is asserted. If
qspi.Intr_status_REG[TX_FIFO_not_Full] = 1, then there is data to be sent to the flash device
(program and/or read operations):
a. Write data to the qspi.TXD0 register.
b. Poll for qspi.Intr_status_REG[TX_FIFO_full] = 1, which indicates TX FIFO is full.
c. Follow steps a and b until all the data is written to the TxFIFO or until
qspi.Intr_status_REG[TX_FIFO_full] = 1.
5. Enable the interrupts. Set qspi.Intrpt_en_REG[TX_FIFO_not_full, RX_FIFO_full] both = 1.
6. Start the data transfer. Set qspi.Config_reg[MANSTRTEN] = 1.