CE97089.pdf

CE97089 – PSoC® 4 ADC to Memory Buffer DMA
Transfer
Objective
This code example demonstrates how to set up a PSoC® 4 direct memory access (DMA) channel to transfer data from an
ADC peripheral to the memory buffer.
Overview
This code example sets up the PSoC 4 DMA controller to transfer data from the ADC result register to an array in SRAM. A
transfer is initiated each time the ADC asserts an end of conversion (EOC) signal. At the end of each DMA transfer, an
interrupt is generated. The CPU implements a simple moving average filter on the data in the array and sends the results
through a UART.
Requirements
Tool: PSoC Creator™ 3.2
Associated Parts: PSoC 4200M and PSoC 4100M
Related Hardware: CY8CKIT-044
Design
Every DMA channel in PSoC 4 has two descriptor structures. The descriptor comprises information regarding the source and
destination address, the modes of transfer, and other specifics related to a transfer. You can choose to use one or both the
descriptors in the channel. Refer the DMA Component datasheet for more details on the use of descriptors.
In this code example, a single DMA channel is configured with a single descriptor, which has the source address as the ADC
result register and the destination as a buffer in memory. The trigger (tr_in) for the DMA is the ADC EOC. The transfer mode is
set as “Single data element per trigger,” which leads to the ADC result being transferred to the memory buffer every time the
EOC is asserted. Figure 1 illustrates the concept of this code example, and Figure 2 shows the PSoC Creator implementation.
Figure 1. ADC to Memory Buffer DMA Transfer
Memory Buffer
(SRAM)
DMA Channel
Sample 1
1
ger
Trig er 2
g
g
ri
T
SAR ADC
2 bytes
Sample 2
CPU access
Sample 3
EOC
Tr
ig
TRIGGER
tr_in
Interrupt
ge
Sample 4
Interrupt
Moving
average
Filter
(in code)
CPU
access
UART
rN
Sample N
Descriptor 0
www.cypress.com
Document No. 001-97089 Rev. **
1
PSoC® 4 ADC to Memory Buffer DMA Transfer
Figure 2. PSoC Creator Implementation
The SAR ADC is configured for a sample rate of 6400 sps. The DMA descriptor is configured to transfer a total of 64 ADC
results to the memory buffer. The DMA descriptor is completed every 10 ms and is configured to generate an interrupt on
completion of the descriptor, informing the CPU that the DMA is complete and the memory buffer is full.
When the interrupt is generated, the CPU implements an averaging on the 64 elements in the buffer and prints out the result
through the UART. The UART is configured for a baud rate of 115.2 kbps.
Figure 3 shows the DMA configuration for the project:
1.
The Number of data elements to transfer is set to “64.” This configures the descriptor to transfer 64 elements before
generating a completion interrupt.
2.
The Data element size specifies the width of the data being transferred. This field also determines the address increment
size when the source increment or destination increment features are enabled. In this example, since the data transferred
is a 12-bit ADC result and the destination is an int16 array, the data element size selected is “Halfword (2 bytes).”
3.
The ADC result register (source) is a 32-bit register, and the memory location (destination) is a 16-bit array. Hence, the
Source and destination transfer width is configured as “Word to Halfword.”
4.
The source is the ADC result register and does not require incrementing after each transfer. The destination is a buffer
and needs to be incremented after each element transfer, so “Increment destination address by two” is enabled. The
destination address is incremented until 64 elements are transferred, after which it is reset to the starting address.
5.
The Transfer mode is set as “Single data element per trigger.” This means that one transfer from the ADC result register
to the buffer is triggered every time the trigger (ADC EOC) is asserted. To complete the full DMA descriptor, 64 separate
ADC EOC triggers are required.
6.
In the Post completion actions field, “Generate interrupt request” is enabled, which generates an interrupt at the
completion of the descriptor. In this example, an interrupt will be generated after the completion of 64 transfers. This
interrupt can be used to trigger the CPU action to average the results and send them over UART.
www.cypress.com
Document No. 001-97089 Rev. **
2
PSoC® 4 ADC to Memory Buffer DMA Transfer
Figure 3. DMA Configuration
2
1
5
3
4
6
The code utilizes an int16 array (ADCBuffer) to act as the destination buffer for the DMA transfer. The DMA is initialized with
the source and destination addresses.
DMA_1_Start((void *) ADC_SAR_Seq_SAR_CHAN0_RESULT_PTR, ADCBuffer);
Apart from that, you must set up the DMA interrupt. The DMA has a single interrupt for all eight channels. This interrupt service
routine is implemented in CY_ISR(CyDmaInterrupt) in CyDMA.c. The interrupt automatically identifies the DMA channel that
was the source of the interrupt and branches to the callback that is assigned to the DMA channel. So, to implement the DMA
interrupt for this project, you need to register a function as a callback for the DMA channel using the
DMA_1_SetInterruptCallback ().
DMA_1_SetInterruptCallback(DMA_Done_interrupt);
The DMA_Done_interrupt() sets a flag that is polled in the main loop to initiate the averaging and UART output operation.
The main loop polls only for DMA descriptor completion, and when it encounters the completion, it executes the averaging of
the buffer data and prints it out through the UART.
www.cypress.com
Document No. 001-97089 Rev. **
3
PSoC® 4 ADC to Memory Buffer DMA Transfer
if(DMADoneFlag == DMA_COMPLETE)
{
//Reset Flag to specify that a descriptor is in progress
DMADoneFlag = DMA_IN_PROGRESS;
//This loop gets the sum of all elements in the buffer
for(i=0; i<ADC_BUFFER_SIZE; i++)
{
Result = Result + ADCBuffer[i];
}
Result = Result >> 6;//Divides result by 64 to get average
sprintf(tmpStr, "%d mV\r\n", ADC_SAR_Seq_CountsTo_mVolts(0,Result));
UART_UartPutString(tmpStr);
//Print result on the UART interface
Result=0;
}
Design Considerations
In this example, the code is executed only when the DMA interrupt is generated (once every 10 ms). The CPU is free at all
other times. The DMA can be functional in the PSoC 4 Sleep mode, so you can optionally put the device to sleep after the data
has been transmitted through the UART. This can help to reduce system power consumption. The device will be automatically
woken up to Active mode when the DMA interrupt occurs.
The averaging of the ADCBuffer can be implemented internal to the ADC itself. In this example, the averaging is done using
the CPU to illustrate a scenario of the CPU taking over after a DMA transfer to process the transferred data.
The design implements a flag variable that is marked complete when a DMA interrupt is encountered. The flag variable is
reverted to the DMA_PROGRESS state when the ADCBuffer is being processed by the CPU. In this example, the CPU speed
is much higher than the rate at which the ADC would be filling up the buffer. This eliminates the possibility of the buffer getting
overwritten by the ADC while the CPU is processing it.
For design scenarios in which the ADC sample rates are higher, there are two ways to maintain ADCBuffer integrity during the
CPU processing phase, as follows. This code example does not implement both these methods for the sake of simplicity.


ADC/DMA can be stopped on completion of a transfer and reinitiated once the CPU is done processing the ADCBuffer.
Double buffering: One DMA descriptor transfers the ADC data to a memory buffer (ADCBuffer). The completion of this
transfer can then trigger another DMA transfer that copies the entire content of ADCBuffer to another buffer in a single
trigger. The second DMA transfer from memory to memory will be faster. The CPU accesses can happen from the second
DMA buffer.
Note When the voltage on the ADC is close to zero, there is a chance of the ADC result going negative due to a negative
offset.
www.cypress.com
Document No. 001-97089 Rev. **
4
PSoC® 4 ADC to Memory Buffer DMA Transfer
Hardware Setup


Input setup: Connect a voltage input between Vdd and GND, with the wiper pin connecting to P2[0].
Output setup: The UART TX output is already connected to pin P7[1], which connects to the PSoC 5LP RX line on
CY8CKIT-044. The PSoC 5LP on the board implements a UART-to-USB bridge, which enumerates as a COM port on the
PC.
You need to set up a terminal program such as Termite to receive the UART data being transferred. You also need to find and
connect to the COM port enumerated. The UART settings for the terminal are as follows:





Baud rate: 115200 bps
Data bits: 8 bits
Stop bits: 1 bit
Parity: None
Flow control: None
Operation
Once the terminal program is started, the average values sent will start appearing. The change in potentiometer voltage will be
reflected in the values being printed.
Note When the voltage on the ADC is close to zero, there is a chance of the ADC result going negative due to a negative
offset.
Components
Table 1 lists the PSoC Creator Components used in this example, as well as the hardware resources used by each.
Table 1. List of PSoC Creator Components
Component
Hardware Resources
ADC_SAR_SEQ
SAR ADC
DMA
1 DMA channel
UART
SCB
www.cypress.com
Document No. 001-97089 Rev. **
5
PSoC® 4 ADC to Memory Buffer DMA Transfer
Related Documents
Table 2 lists the relevant application notes, code examples, Component datasheets, and device and DVK documentation.
Table 2. Related Documents
Application Notes
AN79953 – Getting Started with PSoC 4
Code Examples
CE95275 – Sequencing SAR ADC and Die Temperature Sensor with PSoC 4
CE95272 – SAR ADC in Differential Mode using Pre-Amplifier with PSoC 4
CE95366 – UART Transmit and Receive using a Serial Communication Block (SCB) with PSoC 4
PSoC Creator Component Datasheets
PSoC 4 Sequencing Successive Approximation ADC (ADC_SAR_Seq)
Universal Asynchronous Receiver Transmitter (UART)
PSoC 4 Serial Communication Block (SCB)
Direct Memory Access (DMA)
Device Documentation
PSoC 4 Datasheets
PSoC 4 Technical Reference Manuals
Development Kit (DVK) Documentation
CY8CKIT-044 – PSoC 4 M-Series Pioneer Kit
For questions or suggestions on this code example please contact [email protected].
www.cypress.com
Document No. 001-97089 Rev. **
6
PSoC® 4 ADC to Memory Buffer DMA Transfer
Document History
Document Title: CE97089 - PSoC® 4 ADC to Memory Buffer DMA Transfer
Document Number: 001-97089
Revision
ECN
**
4865821
www.cypress.com
Orig. of
Change
QVS
Submission
Date
08/13/2015
Description of Change
New code example.
Document No. 001-97089 Rev. **
7
PSoC® 4 ADC to Memory Buffer DMA Transfer
Worldwide Sales and Design Support
Cypress maintains a worldwide network of offices, solution centers, manufacturer’s representatives, and distributors. To find
the office closest to you, visit us at Cypress Locations.
PSoC® Solutions
Products
Automotive
cypress.com/go/automotive
psoc.cypress.com/solutions
Clocks & Buffers
cypress.com/go/clocks
PSoC 1 | PSoC 3 | PSoC 4 | PSoC 5LP
Interface
cypress.com/go/interface
Lighting & Power Control
cypress.com/go/powerpsoc
Cypress Developer Community
Community | Forums |Blogs | Video |Training
Memory
cypress.com/go/memory
PSoC
cypress.com/go/psoc
Touch Sensing
cypress.com/go/touch
USB Controllers
cypress.com/go/usb
Wireless/RF
cypress.com/go/wireless
Technical Support
cypress.com/go/support
PSoC is a registered trademark and PSoC Creator is a trademark of Cypress Semiconductor Corp. All other trademarks or registered trademarks
referenced herein are the property of their respective owners.
Cypress Semiconductor
198 Champion Court
San Jose, CA 95134-1709
Phone
Fax
Website
: 408-943-2600
: 408-943-4730
: www.cypress.com
© Cypress Semiconductor Corporation, 2015. The information contained herein is subject to change without notice. Cypress Semiconductor
Corporation assumes no responsibility for the use of any circuitry other than circuitry embodied in a Cypress product. Nor does it convey or imply any
license under patent or other rights. Cypress products are not warranted nor intended to be used for medical, life support, life saving, critical control or
safety applications, unless pursuant to an express written agreement with Cypress. Furthermore, Cypress does not authorize its products for use as
critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The
inclusion of Cypress products in life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies
Cypress against all charges.
This Source Code (software and/or firmware) is owned by Cypress Semiconductor Corporation (Cypress) and is protected by and subject to worldwide
patent protection (United States and foreign), United States copyright laws and international treaty provisions. Cypress hereby grants to licensee a
personal, non-exclusive, non-transferable license to copy, use, modify, create derivative works of, and compile the Cypress Source Code and derivative
works for the sole purpose of creating custom software and or firmware in support of licensee product to be used only in conjunction with a Cypress
integrated circuit as specified in the applicable agreement. Any reproduction, modification, translation, compilation, or representation of this Source
Code except as specified above is prohibited without the express written permission of Cypress.
Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS MATERIAL, INCLUDING, BUT
NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress reserves the
right to make changes without further notice to the materials described herein. Cypress does not assume any liability arising out of the application or
use of any product or circuit described herein. Cypress does not authorize its products for use as critical components in life-support systems where a
malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress’ product in a life-support systems
application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges.
Use may be limited by and subject to the applicable Cypress software license agreement.
www.cypress.com
Document No. 001-97089 Rev. **
8