SSP0 + DMA

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

SSP0 + DMA

421 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Lobisomem on Thu Feb 27 12:13:37 MST 2014
Hi all !!

Please, take a look at the following code:

void DMA_IRQHandler(void)
{
__asm volatile("nop"::);
}
//-----------------------------------------------------------------------------

void spi_init()
{
//---------------------------
//-  P1.20 -> shift CLK     -
//---------------------------
// Put pin as third alternate func
PINSEL3  |= (0x03 << 8);
// Put the pull up resistor
PINMODE3 &= ~(0x03 << 8);
//---------------------------
//-  P1.23 ->   MISO        -
//---------------------------
// Put pin as third alternate func
PINSEL3  |= (0x03 << 14);
// Put the pull up resistor
    PINMODE3 &= ~(0x03 << 14);
//---------------------------
//-  P1.24 ->  MOSI         -
//---------------------------
// Put pin as third alternate func
PINSEL3  |= (0x03 << 16);
// Put the pull up resistor
PINMODE3 &= ~(0x03 << 16);

// ----------------------------------
// --------     SSP0      -----------
// ----------------------------------

// Turn on the SSP0 clock
PCONP |= (1 << 21);

// Select the peripheral clock
// Put SSP0 feed clock = (System clock / 1)
PCLKSEL1 &= ~(0x03 << 10);
PCLKSEL1 |=  (0x01 << 10);

// Put 16 bits data transfer
// Pre-scaler = 0
LPC_SSP0->CR0 = 0x00Cf;

// Enable the controller
LPC_SSP0->CR1 |= (1 << 1);

// Set the pre scaler
LPC_SSP0->CPSR = 8;

// Enable the RX FIFO to generate DMA request
LPC_SSP0->DMACR = 0x1;
}
//-----------------------------------------------------------------------------

void dma_init(void)
{
// Turn DMA on
PCONP |= (1 << 29);

// Enable the DMA
LPC_GPDMA->DMACConfig = 1;
while ( !(LPC_GPDMA->DMACConfig & 0x01) );

// Clear any pending interrupt
LPC_GPDMA->DMACIntTCClear = 1;

    // Enable the interrupt on NVIC
NVIC_EnableIRQ(DMA_IRQn);

// Set source address
LPC_GPDMACH0->DMACCSrcAddr  = (uint32_t)&LPC_SSP0->DR;

// Set the destination address
LPC_GPDMACH0->DMACCDestAddr = (uint32_t)dmaBuffer;

// No linked list
LPC_GPDMACH0->DMACCLLI      = 0;

// Set the length of the transfer
// Make destination auto increment
// Enable the terminal count interrupt
LPC_GPDMACH0->DMACCControl = 1 | (1<<27) | (1<<31);

// Select SSP0 RX DMA request
LPC_GPDMACH0->DMACCConfig = (1<<1);
// Peripheral to memory transfer
LPC_GPDMACH0->DMACCConfig |= (2<<11);
// Set error interrupt
LPC_GPDMACH0->DMACCConfig |= (1<<14);
// Set terminal count interrupt
LPC_GPDMACH0->DMACCConfig |= (1<<15);
// Turn Channel 0 on
LPC_GPDMACH0->DMACCConfig |= 1;
}
//-----------------------------------------------------------------------------


int main(void)
{
//system_setSysTicTimerTo1ms();
    spi_init();
    dma_init();

    // Write to data reg to generate clock
    LPC_SSP0->DR = 0x00;

    while(1) {

    }
    return 0 ;
}


Well, as one may observ, I am trying to get a byte from an off-chip ADC conected to the SSP0. And I am trying to make the transfer tho memory by DMA. The thing is ... it is not working ! The DMA never generates the interrupt. Can you help me and show me what I am doing wrong ?

Best regards
Labels (1)
0 Kudos
1 Reply

370 Views
lpcware
NXP Employee
NXP Employee
Content originally posted in LPCWare by Lobisomem on Sun Mar 02 04:30:23 MST 2014
Hi.

Thank you for all your reply.

I manage to make it work. It seems that the SSP (DMACR) must be initialized after the DMA initialization.


Best regards.

0 Kudos