Например TDA7294

Форум РадиоКот • Просмотр темы - Stmf103+SDIO+FATFS+DMA
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 12:54:03

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Stmf103+SDIO+FATFS+DMA
СообщениеДобавлено: Чт мар 01, 2018 07:45:50 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Подскажите что не так делаю. Пытаюсь создать файл на карте, в режиме полинга он создается, а в режиме 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 смотрел анализатором, как данные закончились записываться, идет следующая порция, команд и данных, т.е друг на друга не наезжают.

Но файл так и не создается =(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Stmf103+SDIO+FATFS+DMA
СообщениеДобавлено: Сб мар 03, 2018 08:32:16 
Первый раз сказал Мяу!

Карма: 7
Рейтинг сообщений: 7
Зарегистрирован: Ср ноя 27, 2013 21:28:40
Сообщений: 29
Откуда: Москва
Рейтинг сообщения: 0
Попробуйте запускать работу DMA (EN) только после конфигурации всех регистров SDIO и отправки команды WRITE_SINGLE_BLOCK


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Stmf103+SDIO+FATFS+DMA
СообщениеДобавлено: Сб мар 03, 2018 16:43:31 
Вымогатель припоя

Зарегистрирован: Вт ноя 02, 2010 17:46:37
Сообщений: 574
Рейтинг сообщения: 0
Не помогло :(
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 но это уже другая тема.

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


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Юрий48 и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y