Datasheet

347
SAM3X / SAM3A [DATASHEET]
Atmel-11057C-ATARM-SAM3X-SAM3A-Datasheet_23-Mar-15
4. After the DMAC selected channel has been programmed, enable the channel by writing a ‘1’ to the
DMAC_CHER.ENAx bit, where x is the channel number. Make sure that bit 0 of DMAC_EN.ENABLE
register is enabled.
5. Source and destination request single and chunk DMAC transactions to transfer the buffer of data (assuming
non-memory peripherals). The DMAC acknowledges at the completion of every transaction (chunk and
single) in the buffer and carries out the buffer transfer.
6. Once the transfer completes, the hardware sets the interrupts and disables the channel. At this time, you can
either respond to the Buffer Transfer Completed Interrupt or Chained Buffer Transfer Completed Interrupt, or
poll for the Channel Handler Status Register (DMAC_CHSR.ENAx) bit until it is cleared by hardware, to
detect when the transfer is complete.
Multi-buffer Transfer with Linked List for Source and Linked List for Destination (Row 4)
1. Read the Channel Handler Status register to choose a free (disabled) channel.
2. Set up the chain of Linked List Items (otherwise known as buffer descriptors) in memory. Write the control
information in the LLI.DMAC_CTRLAx and LLI.DMAC_CTRLBx registers location of the buffer descriptor for
each LLI in memory (see Figure 22-5 on page 348) for channel x. For example, in the register, you can
program the following:
a. Set up the transfer type (memory or non-memory peripheral for source and destination) and flow con-
trol device by programming the FC of the DMAC_CTRLBx register.
b. Set up the transfer characteristics, such as:
i.
Transfer width for the source
in the SRC_WIDTH field.
ii. Transfer width for the destination in the DST_WIDTH field.
v. Incrementing/decrementing or fixed address for source in SRC_INCR field.
vi. Incrementing/decrementing or fixed address for destination DST_INCR field.
3. Write the channel configuration information into the DMAC_CFGx register for channel x.
a.Designate the handshaking interface type (hardware or software) for the source and destination
peripherals. This is not required for memory. This step requires programming the
SRC_H2SEL/DST_H2SEL bits, respectively. Writing a ‘1’ activates the hardware handshaking inter-
face to handle s
ource/destination requests for the specific channel. Writing a ‘0’ activates the
software handshaking interface to handle source/destination requests.
b. If the hardware handshaking interface is activated for the source or destination peripheral, assign the
handshaking interface to the source and des
tination peripheral. This requires programming the
SRC_PER and DST_PER bits, respectively.
4. Make sure that the LLI.DMAC_CTRLBx register locations of all LLI entries in memory (except the last) are
set as shown in Row 4 of Table 22-4 on page 345. The LLI.DMAC_CTRLBx register of the last Linked List
Item must be set as described in Row 1 of Table 22-4. Figure 22-4 on page 345 shows a Linked List
example with two list items.
5. Make sure that the LLI.DMAC_DSCRx register locations of all LLI entries in memory (except the last) are
non-zero and point to the base address of the next Linked List Item.
6. Make sure that the LLI.DMAC_SADDRx/LLI.DMAC_DADDRx register locations of all LLI entries in memory
point to the start source/destination buffer address preceding that LLI fetch.
7. Make sure that the LLI.DMAC_CTRLAx.DONE field of the LLI.DMAC_CTRLAx register locations of all LLI
entries in memory are cleared.
8. Clear any pending interrupts on the channel from the previous DMAC transfer by reading the status register:
DMAC_EBCISR.
9. Program the DMAC_CTRLBx, DMAC_CFGx registers according to Row 4 as shown in Table 22-4 on page
345.
10. Program the DMAC_DSCRx register with DMAC_DSCRx(0), the pointer to the first Linked List item.