cancel
Showing results for 
Search instead for 
Did you mean: 

DMA Configuration from SRAM to SD Card

cng
Associate II
Posted on May 30, 2012 at 01:55

I am new in developing firmware by using STM32L152VBT6. I need to configure DMA to transfer data from SRAM to SD Card. The data would be {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}. However, I could not write into SD Card and I could not find any problem about it.

DMA_InitTypeDef DMA_TestStructure;

//Enables the DMA1 peripheral clock.

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

SD_Init();

SD_CS_LOW();

DMA_DeInit(DMA1_Channel5);

DMA_TestStructure.DMA_PeripheralBaseAddr = (uint32_t)SD_SPI_DR;

  DMA_TestStructure.DMA_MemoryBaseAddr = (uint32_t)write_data;

  DMA_TestStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_TestStructure.DMA_BufferSize = 10;

  DMA_TestStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_TestStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_TestStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

  DMA_TestStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

  DMA_TestStructure.DMA_Mode = DMA_Mode_Normal;

  DMA_TestStructure.DMA_Priority = DMA_Priority_High;

  DMA_TestStructure.DMA_M2M = DMA_M2M_Disable;

DMA_Init(DMA1_Channel5, &DMA_TestStructure);

SPI_I2S_DMACmd(SD_SPI, SPI_I2S_DMAReq_Tx, ENABLE);

SD_SendCmd(SD_CMD_WRITE_SINGLE_BLOCK, write_add, 0xFF);

if (!SD_GetResponse(SD_RESPONSE_NO_ERROR))

  {

    /*!< Send a dummy byte */

    SD_WriteByte(SD_DUMMY_BYTE);

    /*!< Send the data token to signify the start of the data */

    SD_WriteByte(0xFE);

    

DMA_Cmd(DMA1_Channel5, ENABLE);

while (!DMA_GetFlagStatus(DMA1_FLAG_TC5));

SD_ReadByte();

    SD_ReadByte();

    /* Read data response */

    if (SD_GetDataResponse() == SD_DATA_OK)

    {

        rvalue = SD_RESPONSE_NO_ERROR;

    }

}

SD_CS_HIGH();  

SD_WriteByte(SD_DUMMY_BYTE);

DMA_Cmd(DMA1_Channel5, DISABLE);

#dma-spi-stm32-sd
12 REPLIES 12
Posted on May 30, 2012 at 04:31

Does 10 bytes represent a valid block size on the SD card?

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
cng
Associate II
Posted on May 30, 2012 at 06:58

I had tried for SD_BLOCK_SIZE which is equal 200 but it still cannot work.

muhammad
Associate II
Posted on June 15, 2012 at 14:18

i think, I've read this somewhere

''Only the DMA2 controller can perform memory-to-memory transfers''

confirm it and please inform

Posted on June 15, 2012 at 16:00

i think, I've read this somewhere ''Only the DMA2 controller can perform memory-to-memory transfers''confirm it and please inform

Read where, care to cite? Which chip?

I'm not aware this is an issue, you might have issues with DMA2 writing to APB1 peripherals.

SD Card in this context is not a ''memory'', as it attaches via a peripheral bus (SPI/SDIO) and not within the memory map of the STM32Fxxx parts.

The STM32F4xx parts don't support DMA into the 64KB CCM region.
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
Posted on June 16, 2012 at 18:39

Here's a cite for the STM32F4, page 168

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/REFERENCE_MANUAL/DM00031020.pdf

''Note: 1 When memory-to-memory mode is used, the Circular and Direct modes are not allowed.

 

2 Only the DMA2 controller is able to perform memory-to-memory transfers.''

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
cng
Associate II
Posted on July 16, 2012 at 09:34

but it is not memory-memory transfer. I had check the reference manual that sd card is using spi2 and the spi2 receive is using dma1.

Posted on July 16, 2012 at 14:08

but it is not memory-memory transfer. I had check the reference manual that sd card is using spi2 and the spi2 receive is using dma1.

''SD Card in this context is not a ''memory'', as it attaches via a peripheral bus (SPI/SDIO) and not within the memory map of the STM32Fxxx parts.''

They are also complex block driven devices, suggest you dig through some of the STM32 examples for F1, F2, F4 and USB that demonstrate SD Card usages. There are other examples on the forum where an SD Card is used with FsFat.

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..
cng
Associate II
Posted on July 17, 2012 at 02:30

I would not like to use the FsFat because of the requirement. Have any solutions or example?

Posted on July 17, 2012 at 03:28

I would not like to use the FsFat because of the requirement. Have any solutions or example?

What requirement(s)?

Like I said you should probably review, and understand, the sample code in several of the STM32Fx firmware library releases. Here's one specifically for the STM32L152, but there are others.

STM32L1xx_StdPeriph_Lib_V1.1.1\Utilities\STM32_EVAL\STM32L152D_EVAL\stm32l152d_eval_sdio_sd.c

The stuff is broken into layers, the basic level you probably want to access the card on is the 512 byte/block level.

From there you might be able to find a practical/workable method of doing what you want. If the method you want is not practical you might have to come up with a method that is.
Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..