Stmf103+SDIO+FATFS+DMA

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Stmf103+SDIO+FATFS+DMA

Сообщение pokk »

Подскажите что не так делаю. Пытаюсь создать файл на карте, в режиме полинга он создается, а в режиме DMA нет.

Код: Выделить всё

  if(f_mount (&fatfs, "",0)==FR_OK){
	if(f_open(&fileW,(const char*)NameNewFile2,FA_OPEN_ALWAYS | FA_WRITE)==FR_OK){
			result=f_write(&fileW, &inbuf[0], 512, &bw);
			result=f_close(&fileW);
	}
  }else{
    while(1){}
  }

Код: Выделить всё

static void SD_StartBlockTransfer(uint8_t *buf, uint32_t cnt, uint32_t dir){
  uint32_t count = 0, *tempbuff = (uint32_t *)buf;

  //cnt must be integer multiple of 512!!! I will enforce this inside this function
  //Starts the actual data tranfer using the DMA.
  //Prior to calling this command. The SDCard must have been adjusted using commands
  uint32_t tempreg;

  //--------------------------------------------------------------------------------------------------
  //Make cnt an integer multiple of 512
  //Then mask it with the maximum value allowed (2^24)
  cnt=0x01FFFFFF & ((cnt>>8) << 8);
  //--------------------------------------------------------------------------------------------------
  DMA2_Channel4->CCR=0;
  DMA2->IFCR=  DMA_IFCR_CTCIF3|DMA_IFCR_CTEIF3|DMA_IFCR_CGIF3|DMA_IFCR_CHTIF3;
  //--------------------------------------------------------------------------------------------------
  DMA2_Channel4->CPAR=(uint32_t)&SDIO->FIFO;
  DMA2_Channel4->CMAR=(uint32_t) buf; //Memory address;
  //--------------------------------------------------------------------------------------------------
  DMA2_Channel4->CNDTR=cnt/4; 
  //--------------------------------------------------------------------------------------------------
  tempreg=0;
  tempreg|=DMA_CCR3_MSIZE_0*0|      // шины 32 бит
           DMA_CCR3_MSIZE_1*1|
           DMA_CCR3_PSIZE_0*0|
           DMA_CCR3_PSIZE_1*1|
           DMA_CCR3_PL_0*1|     //приоритет  Very hig
           DMA_CCR3_PL_1*1|
           DMA_CCR3_MINC*1;     // память инкримент
           //DMA_CCR3_TCIE*1;
  if(dir==SD2UM){
    tempreg&=~DMA_CCR3_DIR;     //направление память периферия
  }else if (dir==UM2SD) {
    tempreg=DMA_CCR3_DIR*1;
  }
  //--------------------------------------------------------------------------------------------------
  DMA2_Channel4->CCR=tempreg;
  //--------------------------------------------------------------------------------------------------
  DMA2_Channel4->CCR|=DMA_CCR3_EN;	// ВКЛ DMA
  //--------------------------------------------------------------------------------------------------
  //Clear the Data status flags
  SDIO->ICR=(SDIO_STA_DCRCFAIL | SDIO_STA_DTIMEOUT | SDIO_STA_TXUNDERR | SDIO_STA_RXOVERR | SDIO_STA_DATAEND | SDIO_STA_STBITERR | SDIO_STA_DBCKEND);
  //--------------------------------------------------------------------------------------------------
  //First adjust the Dtimer and Data length
  SDIO->DTIMER=(uint32_t) DATATIMEOUT;  
  SDIO->DLEN=cnt;
  //--------------------------------------------------------------------------------------------------
  //Now adjust DCTRL (and enable it at the same time)
  tempreg=0; //Reset value
  tempreg|=(uint32_t) 9 << 4; //Block size is 512 Compute log2(BlockSize) and shift 4bit
  tempreg|= 1<<3; //Enable the DMA
  tempreg|= 0<<2; //DTMode=Block Transfer (Actualy this is the reset value. Just a remainder)
  tempreg|=(dir & SDIO_DCTRL_DTDIR); //Direction. 0=Controller to card, 1=Card to Controller
  tempreg|=1; //DPSM is enabled
  SDIO->DCTRL=tempreg;
  //--------------------------------------------------------------------------------------------------
  //-------------------------!!!Ожидание завершения приема/передачи!!!--------------------------------
  //--------------------------------------------------------------------------------------------------
  //DMA2->IFCR|=DMA_ISR_GIF4|DMA_ISR_HTIF4;
  while (!(DMA2->ISR&DMA_ISR_TCIF4)){}
  DMA2->IFCR|=DMA_ISR_TCIF4|DMA_ISR_GIF4|DMA_ISR_HTIF4;
  while (!(SDIO->STA & (SDIO_FLAG_DBCKEND))){}
  while (SDIO->STA & (SDIO_STA_RXACT | SDIO_STA_TXACT)) {};
  //--------------------------------------------------------------------------------------------------
}
В общем когда пытаюсь создать файл в режиме DMA, на sd карте создается куча папок с именем TTTTTTT
если иди по шагам это происходит из за того что в функции закрытие файл (дальше move_window) периодически не сходятся if (sector != fs->winsect) и происходит считывание, сектора каталога и там вот как раз считывается TTTTTT(512 байт), в общем не как не могу разобраться из за чего, такое происходит, по отдельности запись считывания одного сектора все работает, даже такое погонял:

Код: Выделить всё

  for(i=0;i<1000;i++){
    SD_WriteSingleBlock(inbuf, 1);
    memset(inbuf,0,512);
    SD_ReadSingleBlock(inbuf, 1);
      for(k=0;k<512;k++){
          if(inbuf[k]!=0x66){
                NOP;
          }
      }
  }
все проходит не разу не застряло.
Функция с полингом почти идентичная, только ожидание чуть чуть другое

PS смотрел анализатором, как данные закончились записываться, идет следующая порция, команд и данных, т.е друг на друга не наезжают.

Но файл так и не создается =(
Реклама
AlphaLaiman
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср ноя 27, 2013 21:28:40
Откуда: Москва

Re: Stmf103+SDIO+FATFS+DMA

Сообщение AlphaLaiman »

Попробуйте запускать работу DMA (EN) только после конфигурации всех регистров SDIO и отправки команды WRITE_SINGLE_BLOCK
Реклама
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Stmf103+SDIO+FATFS+DMA

Сообщение pokk »

Не помогло :(
DMA запускаеться и так после отправки команды:

Код: Выделить всё

void SD_WriteSingleBlock(uint8_t *buf, uint32_t blk) {
  uint32_t WriteAddr;
  uint32_t response;

  //uint32_t response;
  if (SDType==1) { //High Capacity
    WriteAddr=blk;
  } else if (SDType==0) {//Standard Capacity
    WriteAddr=blk*512;
  }
  //CMD24:WRITE_SINGLE_BLOCK
  SD_Command(CMD24, SHRESP, WriteAddr);
  SD_Response(&response, RESP_R1);

  //Card is now waiting some data from the Data lines. Start actual data transmission
  SD_StartBlockTransfer(buf, 512, UM2SD);

  //Wait for transmission to end
  SD_WaitTransmissionEnd();
}
функцию SD_WaitTransmissionEnd(); показал в конце SD_StartBlockTransfer() это циклы ожидания.
мне сдаться, что не тот флаг жду или еще чего нибудь, ведь в полинге, то файл создается, правда там через N количество записей в файл виснет все на флагах SDIO_STA_RXACT | SDIO_STA_TXACT но это уже другая тема.

В принципе я из за этого и все возможные циклы ожидания напихал в конец функции.
Ответить

Вернуться в «ARM»