This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

I want to do DMA from UART to Memory.

I have done with memory to uart but not able to do uart to memory. Here is my code for memory to uart transfer.

/**************************************************************************** * $Id:: udmatest.c 6098 2011-01-08 02:26:20Z nxp12832 $ * Project: NXP LPC17xx UART DMA example * * Description: * This file contains UART test modules, main entry, to test UART APIs. * **************************************************************************** * Software that is described herein is for illustrative purposes only * which provides customers with programming information regarding the * products. This software is supplied "AS IS" without any warranties. * NXP Semiconductors assumes no responsibility or liability for the * use of the software, conveys no license or title under any patent, * copyright, or mask work right to the product. NXP Semiconductors * reserves the right to make changes in the software without * notification. NXP Semiconductors also make no representation or * warranty that such application will be suitable for the specified * use without further testing or modification.
****************************************************************************/
#include "LPC17xx.h"
#include "uart_dma.h"
#include "dma.h"
#include "stdio.h"

#define MSEC_CNT 36000 /*!< 1msec with 60 MHz*/

extern uint32_t UARTDMA0Done;
extern uint32_t UARTDMA1Done;
extern uint32_t UARTDMA2Done;
extern uint32_t UARTDMA3Done;
uint8_t *u0_src, *u0_dst, *u1_src, *u1_dst;

/******************************************************************************
** Main Function main()
******************************************************************************/
int main (void) {
uint32_t i;
uint8_t hex[17] = "Welcome..!!";

/* SystemClockUpdate() updates the SystemFrequency variable */ SystemClockUpdate();

UARTInit(0, 57600);

u0_src = (uint8_t *)UART0_DMA_TX_SRC; u0_dst = (uint8_t *)UART0_DMA_RX_DST; //*u0_src++ = 'J';

for ( i = 0; i < UART_DMA_SIZE; i++ ) // Put data in Memory (u0_src) { *u0_src++ =hex[i]; *u0_dst++ = 0; }

DMA_Init();

/* Connect UART0 and UART1 via a RS232 cable. The sequence is, UART DMA starts from UART0 TX, lookback to UART1 RX using channel 0 and 1. Then, UART DMA starts from UART1 TX, lookback to UART0 RX using channel 2 and 3. So, both M2P+P2M on UART0 and UART1 are tested. */

/* DMA from UART0 TX to UART1 RX using channel 0 and 1. */ DMAChannel_Init( 0, M2P);

/* Destination Peripheral - (DMA_UART0_TX<<6) Transfer Type - Memory to peripheral (0x01 << 11)

LPC_GPDMACH0->CConfig |= 0x0C001|(0x00<<1)|(DMA_UART0_TX<<6)|(0x01 << 11); LPC_UART0->FCR |= 0x08;

/* DMA request was sent inside DMA ISR when DMA is done. The data should arrive at UART0 RX already. */

while ( 1 );
}

void DMA_IRQHandler(void)
{ uint32_t regVal; regVal = LPC_GPDMA->IntTCStat; if ( regVal ) { DMATCCount++; LPC_GPDMA->IntTCClear = regVal; if ( regVal & (0x01<<0) ) { DMAChannel_Init( 1, P2M ); LPC_GPDMACH1->CConfig |= 0x0C001|(DMA_UART0_RX<<1)|(0x00<6)|(0x02<<11); //LPC_UART1->FCR |= 0x08; UARTDMA0Done = 1;

}

}

regVal = LPC_GPDMA->IntErrStat; if ( regVal ) { DMAErrCount++; LPC_GPDMA->IntErrClr = regVal; } return;
}

void DMA_Init( void )
{ /* Enable CLOCK into GPDMA controller */ LPC_SC->PCONP |= (1 << 29);

/* Select primary function(UART0/1/2/3) in DMA channels, secondary is timer 0/1/2/3. */ LPC_SC->DMAREQSEL = 0x0000; // UART0 TX is selected

LPC_GPDMA->IntTCClear = 0x03; //Interrupt Terminal Count Request Clear register LPC_GPDMA->IntErrClr = 0x03; //Interrupt Error Clear register

LPC_GPDMA->Config = 0x01; /* Enable DMA channels, little endian */ while ( !(LPC_GPDMA->Config & 0x01) );

NVIC_EnableIRQ(DMA_IRQn); return;
}

uint32_t DMAChannel_Init( uint32_t ChannelNum, uint32_t DMAMode )
{ if ( ChannelNum == 0 ) { UARTDMA0Done = 0; LPC_GPDMA->IntTCClear = 0x01<<0; LPC_GPDMA->IntErrClr = 0x01<<0; if ( DMAMode == M2P ) { /* Ch0 set for M2P transfer from mempry to UART. */ LPC_GPDMACH0->CSrcAddr = UART0_DMA_TX_SRC; LPC_GPDMACH0->CDestAddr = UART0_DMA_TX_DST; /* The burst size is set to 1, source and dest transfer width is 32 bits(word), Terminal Count Int enable */ LPC_GPDMACH0->CControl = (13 & 0x0FFF)|(0x02 << 12) |(0x02 << 15)|(0x00 << 18)|(0x00 << 21)|(1 << 26)|0x80000000; } else if ( DMAMode == P2M ) { /* Ch0 set for P2M transfer from UART to memory. */ LPC_GPDMACH0->CSrcAddr = UART0_DMA_RX_SRC; LPC_GPDMACH0->CDestAddr = UART0_DMA_RX_DST;

/* The burst size is set to 1. Terminal Count Int enable. */ LPC_GPDMACH0->CControl = (UART_DMA_SIZE & 0x0FFF)|(0x00 << 12) |(0x00 << 15)|(0x00 << 18)|(0x00 << 21)|(1 << 27)|0x80000000; } else { return ( FALSE ); } }

else { return ( FALSE ); } return( TRUE );
}

0