cancel
Showing results for 
Search instead for 
Did you mean: 

SD CARD data larger than 800 bytes write error

scholar
Associate II
Posted on March 13, 2015 at 08:52

i am simply testing FATFS with my uSD card, whenever i write more than 800 bytes of hex data in card using f_write, it writes junk data, the hex file is attached, my code is shown below

#define size 1200

uint32_t buffer[size];

int main(void)

{

int kk;

init_GPIO();

for (kk = 0; kk < size; kk++ )

{

buffer[kk] = 0x12345678; 

}

f_mount(0, &filesystem);

f_open(&file, ''DATA.YUV'', FA_READ | FA_WRITE | FA_CREATE_ALWAYS);

GPIOD->BSRRL = 0x1000; // this sets LED1 (green)  0x2000 0x4000 0x8000

f_write(&file, &buffer[0] , size*4, &bw);

if (bw<(size*4)) while(1);

f_close(&file);

f_mount(0, NULL);

GPIOD->BSRRH = 0x1000;

GPIOD->BSRRL = 0x2000;

while(1);

}

 

i am using HxD hex reader to read data,

4 REPLIES 4
francescatodiego
Associate II
Posted on March 13, 2015 at 09:16

What functions are called by diskio.c->disk_write for writing the SD

scholar
Associate II
Posted on March 13, 2015 at 10:30

disk write calls  SD_WriteMultiBlocks((BYTE *)buff, sector << 9, 512, 1); function which writes data using dma

scholar
Associate II
Posted on March 13, 2015 at 10:32

this is the function details

SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks)

{

  SD_Error errorstatus = SD_OK;

  TransferError = SD_OK;

  TransferEnd = 0;

  StopCondition = 1;

  

  SDIO->DCTRL = 0x0;

  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)

  {

    BlockSize = 512;

    WriteAddr /= 512;

  }

  /* Set Block Size for Card */ 

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);

  if (SD_OK != errorstatus)

  {

    return(errorstatus);

  }

  

  /*!< To improve performance */

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) (RCA << 16);

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_APP_CMD);

  if (errorstatus != SD_OK)

  {

    return(errorstatus);

  }

  /*!< To improve performance */

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)NumberOfBlocks;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCK_COUNT;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_SET_BLOCK_COUNT);

  if (errorstatus != SD_OK)

  {

    return(errorstatus);

  }

  /*!< Send CMD25 WRITE_MULT_BLOCK with argument data address */

  SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)WriteAddr;

  SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_MULT_BLOCK;

  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;

  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;

  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;

  SDIO_SendCommand(&SDIO_CmdInitStructure);

  errorstatus = CmdResp1Error(SD_CMD_WRITE_MULT_BLOCK);

  if (SD_OK != errorstatus)

  {

    return(errorstatus);

  }

  SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;

  SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize;

  SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4;

  SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;

  SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;

  SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;

  SDIO_DataConfig(&SDIO_DataInitStructure);

  SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);

  SDIO_DMACmd(ENABLE);

  SD_LowLevel_DMA_TxConfig((uint32_t *)writebuff, (NumberOfBlocks * BlockSize));

  return(errorstatus);

}

scholar
Associate II
Posted on March 13, 2015 at 12:06

thanks to clives SDIO modified library it solved the problem