Easyelectronics.ru

Электроника для всех
Текущее время: 15 окт 2019, 19:01

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 224 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 20 апр 2015, 23:14 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
It is. But I did actually tried to enable it and got the same result...
That is where this function is being called from.
Код:
           
  // Put the Card in the tranfer mode using cmd7. Bus width can only be changed in transfer mode
  if (((err = sdio_cmd(SDIO_COMMAND_SELECT_CARD, rca<<16, rsp)) == SDIO_LOW_LEVEL_SUCCESS)
    //Change the bus-width with acmd6
  && ((err = sdio_cmd(SDIO_COMMAND_APP_CMD, rca<<16, rsp)) == SDIO_LOW_LEVEL_SUCCESS)
  && ((err = sdio_cmd(SDIO_COMMAND_SET_BUS_WIDTH, SDIO_BUS_WIDTH_4, rsp)) == SDIO_LOW_LEVEL_SUCCESS)) {
    sdio_bus_clk(SDIO_24MHZ);
    sdio_bus_width(SDIO_BUS_WIDTH_4);
    for (ec = 0, arg = 0; arg < 1000; arg++) {
      err = rd_abs_block((uint32_t *)sdio_blk, arg);
      if ((tmp = sdio_cmd(SDIO_COMMAND_SEND_STATUS, rca<<16, NULL)) != SDIO_RESP_OK) break;
      if (err != SDIO_RESP_OK) {
        ec++;
        arg--;
      }
      else {
        for (offs = 0; offs < (CARD_BLOCK_SIZE - sizeof(SIGN)); offs++)
           if (strncmp(&sdio_blk[offs], SIGN, sizeof(SIGN)) == 0) break;
        if (offs < (CARD_BLOCK_SIZE - sizeof(SIGN))) {
          found = true;
          break;
       }
     }
   }
}



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 21 апр 2015, 00:52 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
If HW flow disabled, then only one though: PCB issues. At first, try to switch to 1-bit bus, then decrease bus speed.
Pull-up resistors for each SDIO line must be in range 10k..100k, SDIO_CK doesn't need pull-up. The pull-up resistor for the SDIO_D3 line is already inside the SD card, however its value varies from card to card, you might try to pull-up the SDIO_D3 line with external resistor and disable the internal pull-up by software (ACMD42).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 21 апр 2015, 02:22 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
I'm using original dev boards and their software works - i.e. it is my software at fault.
I also tried 1-bit bus and 400kHz clk. Nothing changes.
Another clue is that sometimes I'm able to read the first block and NEVER anything else.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 21 апр 2015, 03:02 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
That's my ReadBlock procedure, it works on STM32L151 at 32Mhz with 12MHz SDIO bus. With higher bus frequency the overrun errors happens because the MCU does not have time to load data into the SDIO FIFO in time. Maybe it will be helpful.
Show SD_WriteBlock


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 21 апр 2015, 18:07 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
Will give a shot. Thanks. I don't see any meaningful difference.
I can read one block only. What needs to be done to read the next block? What confuses me most that when the function is called again it loops forever with bits RXACT and RXFIFOE set and at the same time the FIFOCNT register becomes 0x80...
Код:
uint8_t rd_abs_block (uint16_t rca, uint32_t *buf, uint32_t blk) {
  uint8_t    err;
  uint32_t   r1;
 
//  SDIO->DCTRL = 0;
//  if ((err = sdio_cmd(SDIO_COMMAND_SEND_STATUS, rca<<16, NULL)) != SDIO_LOW_LEVEL_SUCCESS) return err;
  SDIO->DLEN    = CARD_BLOCK_SIZE;
  SDIO->DTIMER  = CARD_BLOCK_SIZE * DATA_RD_TMO_VALUE;
  SDIO->DCTRL   = SDIO_BLK_SIZE_512 | SDIO_DCTRL_RD | SDIO_DCTRL_DTEN;
  if ((err = sdio_cmd(SDIO_COMMAND_READ_BLOCK, blk, NULL)) != SDIO_LOW_LEVEL_SUCCESS) return err;

  do {
    r1 = SDIO->STA;
    if (r1 & SDIO_STA_RXFIFOHF) {
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      *buf++ = SDIO->FIFO;
      continue;
    }
    if (r1 & SDIO_STA_DTIMEOUT) {
      SDIO->ICR = SDIO_ICR_CLEAR_ALL; 
      return SDIO_LOW_LEVEL_DATA_TMO;
    }
    if (r1 & SDIO_STA_DCRCFAIL) {
      SDIO->ICR = SDIO_ICR_CLEAR_ALL; 
      return SDIO_LOW_LEVEL_DCRC_FAIL;
    }
    if (r1 & SDIO_STA_RXOVERR) {
      SDIO->ICR = SDIO_ICR_CLEAR_ALL; 
      return SDIO_LOW_LEVEL_RXOVERR;
    }
    if (r1 & SDIO_STA_STBITERR) {
      SDIO->ICR = SDIO_ICR_CLEAR_ALL; 
      return SDIO_LOW_LEVEL_START_BIT_ERR;
    }
    if (r1 & SDIO_STA_DBCKEND) {
      while (SDIO->STA & SDIO_STA_RXDAVL) *buf++ = SDIO->FIFO;
      SDIO->ICR = SDIO_ICR_CLEAR_ALL; 
      return SDIO_LOW_LEVEL_SUCCESS;
    }
  } while (r1 & SDIO_STA_RXACT);
  return SDIO_LOW_LEVEL_ERR_UNKNOWN;




Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 24 апр 2015, 19:18 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
Now I have CTIMEOUT fault. Step by step operations are seems to be working. Any advice how to deal with it?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 24 апр 2015, 20:31 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
Код:
    if (r1 & SDIO_STA_DBCKEND) {
      while (SDIO->STA & SDIO_STA_RXDAVL) *buf++ = SDIO->FIFO;
      SDIO->ICR = SDIO_ICR_CLEAR_ALL;
      return SDIO_LOW_LEVEL_SUCCESS;
    }
  } while (r1 & SDIO_STA_RXACT);

For multiple-block reading also try to check the SDIO_STA_DATAEND bit.

Код:
SDIO->DTIMER  = CARD_BLOCK_SIZE * DATA_RD_TMO_VALUE;

This value - a timeout measured in SDIO clocks, according to the SD specifications it must be at least 250ms for write and 100ms for read. Maybe you set it to low?
That's my macroses for calculation (SDIO_CLK_DIV_TRAN - SDIO clock divider in the CLKCR register, 48000000 - SDIO clock):
Код:
#define SDIO_DATA_R_TIMEOUT           ((uint32_t)((48000000 / (SDIO_CLK_DIV_TRAN + 2) / 1000) * 100)) // Data read timeout is 100ms
#define SDIO_DATA_W_TIMEOUT           ((uint32_t)((48000000 / (SDIO_CLK_DIV_TRAN + 2) / 1000) * 250)) // Date write timeout is 250ms


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 24 апр 2015, 22:12 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
And this is mine:
Код:
#define SD_CLK                          24000000UL
// RD ~100ms at 24MHz SD clock   */
#define DATA_RD_TMO_VALUE               (100*(SD_CLK/1000))
// WR ~200ms at 24MHz SD clock   */
#define DATA_WR_TMO_VALUE               (200*(SD_CLK/1000))

Yours is better, but for now my task scope is limited.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 25 апр 2015, 00:28 
Только пришел

Зарегистрирован: 20 апр 2015, 19:17
Сообщения: 10
Publishing the whole code. If someone sees something suspicious, please let me know.
FYI: I can read Russian, but can type it only from my home machine.
Show Код


Последний раз редактировалось elisey 25 апр 2015, 07:23, всего редактировалось 1 раз.
Большие листинги кода нужно прятать под спойлер


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 18:35 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Привет, обьясните как использовать библиотеку sdio_SD.h (sdio_SD.c).

SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize) // функция чтения одного блока

Что в этой функции нужно указывать в параметре ReadAddr. Номер сектора или все таки какой-то адрес? Как тогда перевести адреса в номера секторов, чтоб удобнее было?
Потом... она возвращает результат типа SD_Error. Чтобы посмотреть мне нужно создавать в программе переменную типа SD_Error ? это же целая структура?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 18:49 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
В теории, для SDSC карточек (SD standard capacity, до 2Gb включительно), адресация идет кратно размеру сектора, т.е. 0, 512, 1024... (если сектор 512байт). Для SDHC,SDXC - адресация поблочно, т.е. 0, 1, 2... В самой же функции может быть сделан автоматический перерасчет адреса под тип карточки, так что не видя нутра функции, однозначного ответа на вопрос об адресе дать нельзя. Так же и про SD_Error - надо смотреть исходники.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 19:06 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf, щас вроде запустил. Инициализация SDIO, SD, проходит SD_OK . А чтение блока 0x03 SD_CMD_RSP_TIMEOUT.


Show



Для меня пока трудно разобраться, неужели для работы нужно столько телодвижений? Я заметил что используется 1bit передача, или это только команда?!

Все эти готовые библиотеки, SPL тоже, вводят меня в ступор , я лучше бы писал названия регистров...


Последний раз редактировалось elisey 16 июн 2015, 20:14, всего редактировалось 1 раз.
Большие листинги кода нужно прятать под спойлер


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 19:56 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Парни - кончайте этот онанизм!
Качайте новый куб, за 5 минут рабочий проект получите, с преферансом и поэтессами!
Потом можете его код ковырять до скончания времён!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 21:01 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
По изначальному вопросу, из кода
Код:
  if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
  {
    BlockSize = 512;
    ReadAddr /= 512;
  }

видно, что адрес надо задавать кратным размеру блока, т.е. 0, 512, 1024... и оно само переведет адрес в номер блока для SDHC карты. В любом случае адрес 0 должен читаться.

MIG29 писал(а):
Я заметил что используется 1bit передача, или это только команда?!

Карта инициализируется в 1bit режиме, т.е. задействована только одна линия для передачи данных D0. После инициализации карту можно перевести в 4-bit режим, когда будут задействованы D0..D3 линии.

MIG29 писал(а):
А чтение блока 0x03 SD_CMD_RSP_TIMEOUT.

А точно инициализация проходит успешно? Параметры карты верно определяются? Ну и обычный вопрос еще в таких случаях: на линиях SD_D0, SD_CMD есть подтяжка к питанию на 47кОм (не 4.7к!)?

Pingvin писал(а):
Качайте новый куб, за 5 минут рабочий проект получите, с преферансом и поэтессами!

А также набором веселых глюков из-за сырости кода, ответственного за SDIO...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 22:35 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Не удобненько тут у вас цитировать фрагменты(

LonelyWolf, я так и не понял, мне адрес нужно указывать не как номер сектора, а именно адрес? Например я хочу 500-тый сектор, значит писать 500 * 512 ?

Подтяжки стоят везде 11К ом, причем даже на тактовой ножке, сейчас уберу... Инициализация вроде успешна...

В коментариях то что пишет окно Watch:

Код:
volatile SD_Error temp;//Это я создал переменную типа SD_Error.
................................
SD_DeInit();
SD_Init();
temp =SD_PowerON();// Temp 0x2A SD_OK
temp = SD_InitializeCards();//Temp 0x2A SD_OK
temp = SD_ReadBlock(&BUFFER[0], 550, 512);// Temp 0x03 SD_CMD_RSP_TIMEOUT


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 16 июн 2015, 23:45 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
MIG29 писал(а):
Например я хочу 500-тый сектор, значит писать 500 * 512 ?

Да, именно так.

MIG29 писал(а):
Инициализация вроде успешна...

Не помешало бы в этом убедиться. Судя по приведенному коду ReadBlock, это нечто из SPL или CubeMX. Значит там должна быть перменная, содержащая структуру CSD. При инициализации карты в эту структуру забиваются её параметры. Стоит убедиться, что туда корректные данные забиты (объем карты, её тип и чего там еще можно глянуть).

MIG29 писал(а):
0x2A SD_OK

Странное значение для SD_OK, все время в поделках SPL/Cube оно нулем было.
Update: хотя сейчас нашел на гите некий проект, где есть bsp_sdio_sd.с/bsp_sdio_sd.h, там да, SD_OK явно не задан и он вполне может быть равен 0x2A.
Код:
  * @file    stm32_eval_sdio_sd.c
  * @author  MCD Application Team
  * @version V4.4.0
  * @date    31-December-2010


Последний раз редактировалось LonelyWolf 17 июн 2015, 00:08, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 17 июн 2015, 00:07 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf, вот все варианты ошибок , 42 (0x2A) элемент как раз SD_OK.

Show


Как думаете, мне проще написать свой код или пробовать ковырять этот? Мне нужно всего лишь чтение блоков (одиночных, а лучше сразу несколько)....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 17 июн 2015, 00:12 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
MIG29 писал(а):
Как думаете, мне проще написать свой код или пробовать ковырять этот? Мне нужно всего лишь чтение блоков (одиночных, а лучше сразу несколько)....

В этом вопросе трудно советовать. Я, в свое время, ковырялся в одной из версий этой библиотеки из SPL, в результате написал свою реализацию.

А вот почему ReadBlock возвращает таймаут - дебажить надо. Смотреть в каком месте возникает этот самый таймаут и там уже кумекать. Опять же, повторюсь: неплохо бы удостовериться, что карта инициализируется верно, что ее параметры читаются корректно и все такое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 17 июн 2015, 22:01 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf, удалось считывать 1 сектор. При попытке использовать поблочное чтение Keil зависает в размышлениях на долгие минуты (прокручивает что то с DMA).
Для поблочного чтения нужен буфер размером с сумму всех блоков считаных данных?

Моя задача такая, считывать блоки как можно быстрее и запихивать определенные байты в определеные регистры сравнения таймеров...

Upd:
Функция чтения блока зависает на манипуляциях с DMA.
Как я понял бесконечно ожидается флаг завершения передачи TCIF4 (Channel 4 transfer complete flag)...
При этом выставлен флаг "половинной передачи" HTIF4 (Channel 4 Half transfer complete flag) и GIF4 (Channel 4 Global Interrupt flag) тоже выставлен.
Программа зависает в этом месте на долгие минуты, дольше не ждал...
Код:
while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK)) {}

Что особенно не понятно, то это происходит только при чтении определенного сектора. Например 801 в порядке. 807 наотрез зависает...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 21 июн 2015, 23:29 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Помогите! Не понятно и не работает драйвер! Одни блоки считать может на других зависает! Как работать с карточкой? В готовых драйверах не понятно написано!

Код:
//......
else if (DeviceMode == SD_DMA_MODE)
  {
    SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE);
    SDIO_DMACmd(ENABLE);
    SD_LowLevel_DMA_RxConfig((uint32_t *)readbuff, BlockSize);
    while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK))
    {}
    if (TransferError != SD_OK)
    {
      return(TransferError);
    }
  }
//........


Что тут делают, к примеру, TransferEnd и TransferError? Каким макаром они могут измениться? Где хоть один обработчик прерывания у этого драйвера?
Не врубаюсь в работу SD и чипа STM32F103 =(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 июн 2015, 00:53 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
MIG29 писал(а):
Не понятно и не работает драйвер! Одни блоки считать может на других зависает!

Очень исчерпывающее объяснение проблемы, как помочь?

MIG29 писал(а):
Как работать с карточкой?

Читать документ под названием "SD simplified specifications", вникать в протокол и команды.

MIG29 писал(а):
TransferEnd и TransferError? Каким макаром они могут измениться?

В данном случае они должны изменяться в обработчиках прерываний от DMA и SDIO.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 июн 2015, 01:27 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf, в драйвере sdio_sd.c нет таких обработчиков! Что это значит?

Я с карточкой более менее понимаю. Инициализация, считывание там какой то ерунды CSD . Указать размер блока, собственно послать команду считывания блока.
Эта схема более менее понятна. А дальше как надо считывать из буфера? Где ставится "на паузу" тактирование флешки? Какая разница между 3 режимами обработки принятых данных (Polling, Interrupt, DMA) ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 июн 2015, 02:26 
Старожил

Зарегистрирован: 11 окт 2013, 01:46
Сообщения: 234
MIG29 писал(а):
Какая разница между 3 режимами обработки принятых данных (Polling, Interrupt, DMA) ?

Да как во всей периферии:

- Polling
Код:
HAL_PERIPH_Start (params);
while(1){
    if ( Periph_Some_One() ){
        Do_SomeThing();
    }
}
- Interrupt
Код:
HAL_PERIPH_Start_IT (params);
void Periph_IRQHandler(void){
    Do_SomeThing();
}
- DMA
Код:
HAL_PERIPH_Start_DMA(params);
void DMAx_StreamY_IRQHandler(void){
    Do_SomeThing();
}

На мой взгляд Interrupt от DMA мало чем отличается. В обоих случаях реакция на что-то через прерывание идет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 июн 2015, 03:01 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Hamper,

Вот кусочек из драйвера.

Show


Из FIFO берется по 32 бита и кладется в мой буфер, "отступая" по 8x8 (Буфер обьявлен как ссылка uint8_t). Совсем не понимаю , поправьте!
И еще один вопрос как FIFO узнаёт что нужно подгрузить "новые" данные? Как узнает что нужно начать это делать и когда закончить? Прерываниями вроде не пахнет...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 июн 2015, 03:02 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
MIG29 писал(а):
драйвере sdio_sd.c нет таких обработчиков! Что это значит?

На сайте ST есть такая штука как "STM32F10x standard peripheral library", ищется по кодовой фразе "STSW-STM32054"
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/LN1939/PF257890#
В ней лежит последняя версия этого самого "драйвера" и есть примеры использования. Можно скачать и изучать до полного просветления ;)

MIG29 писал(а):
Где ставится "на паузу" тактирование флешки? Какая разница между 3 режимами обработки принятых данных (Polling, Interrupt, DMA) ?

На "паузу" тактирование ставится либо автоматом (включен power saving mode в SDIO) либо вручную битом в регистре SDIO.
По режимам, если грубо:
polling - программа в основном цикле опрашивает регистры SDIO. критичная ко времени штука, например на STM32L1 на частоте 32МГц более 8МГц из SDIO выжать неспособна, из-за того, что просто не успеет подгружать/выгружать данные в SDIO
interrupt - все работает на прерываниях SDIO. пришли данные - сработало прерывание, ушла команда - прерывание и т.д.
DMA - то же, что и предыдущий режим, но передача данных в/из SDIO идет средствами DMA, а программа занимается своими делами. как произошло какое-нибудь событие от SDIO (ошибка или окончание передачи) - срабатывает прерывание. точно так же прерывание от DMA об окончании передачи. в этих обработчиках и должны выставляться флаги TransferEnd и TransferError.

MIG29 писал(а):
Из FIFO берется по 32 бита и кладется в мой буфер, "отступая" по 8x8 (Буфер обьявлен как ссылка uint8_t). Совсем не понимаю , поправьте!
И еще один вопрос как FIFO узнаёт что нужно подгрузить "новые" данные? Как узнает что нужно начать это делать и когда закончить? Прерываниями вроде не пахнет...

FIFO у SDIO - это 32 32-битных ячейки памяти. Флаг RXFIFOHF означает, что 8 или более ячеек FIFO содержат принятые данные. Поэтому приведенный код ожидает установки данного флага и читает 8 ячеек (8х4 байт). tempbuf скорее всего считает не байты, а слова, т.е. реальное количество прочитанных байт будет в 4 раза больше, чем значение tempbuf.
Если не успеть выгрести данные из FIFO, то случится ошибка OVERRUN (SDIO_FLAG_RXOVERR) и обмен с карточкой остановится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 224 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9  След.

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


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], VladislavS, Yoda


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

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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB