Перейти к содержанию

SDMMC работа с FIFO


w5277c

Рекомендуемые сообщения

Нужна помощь.

В  RM0433 Reference manual дословно сказано следующее:
 

Receive FIFO:
Data can be read from the receive FIFO when the DPSM is activated (DPSMACT = 1).
When IDMAEN = 1 the FIFO is fully handled by the IDMA.
When IDMAEN = 0 the FIFO is controlled by firmware via the AHB slave interface.When the
data path subunit receives a word of data, it drives the data on the write databus. The write
pointer is incremented after the write operation completes. On the read side, the contents of
the FIFO word pointed to by the current value of the read pointer is driven onto the read
databus. The receive FIFO is accessible via sequential addresses. The receive FIFO is
handled in the following way:
1. Write the data length into DATALENGTH and the block length in DBLOCKSIZE.
- For block data transfer (DTMODE = 0), DATALENGTH must be an integer multiple
of DBLOCKSIZE.
2. Set the SDMMC in receive mode (DTDIR = 1).
– Configures the FIFO in receive mode.
3. Enable the DPSM transfer
– either by sending a command from the CPSM with the CMDTRANS bit set
– or by setting DTEN bit.
4.  When (DPSMACT = 1) the FIFO is ready to receive data.
– The DPSM writes the received data to the FIFO.
5. When the FIFO is half full (RXFIFOHF flag), read data from the FIFO until FIFO is
empty (RXFIFOE = 1).
6. When last data has been received end of data (DATAEND flag), read data from the
FIFO until FIFO is empty (RXFIFOE = 1).
– SDMMC has completely received all data and the DPSM is disabled (DPSMACT = 0).

В сурсах библиотеки HALL присутствует следующий код:
 

while (!__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXOVERR | SDMMC_FLAG_DCRCFAIL | SDMMC_FLAG_DTIMEOUT | SDMMC_FLAG_DATAEND))
  {
    if (__HAL_SD_GET_FLAG(hsd, SDMMC_FLAG_RXFIFOHF))
    {
      for (count = 0U; count < 8U; count++)
      {
        *pData = SDMMC_ReadFIFO(hsd->Instance);
        pData++;
      }
    }

    if ((HAL_GetTick() - tickstart) >=  SDMMC_DATATIMEOUT)
    {
      return HAL_SD_ERROR_TIMEOUT;
    }
  }

В связи с чем у меня вопросы:
1) Почему код в официальной библиотеке HALL не соответствует описанному в документе алгоритму?
2) Каким образом осуществляется синхронизация между процессором и устройством FIFO?
Судя по коду синхронизации вообще нет, да и по описанному алгоритму механизма синхронизации тоже не видно.
Проще говоря каким именно образом гарантируется, что значение в регистре FIFO не будет считано дважды или пропущено.

При этом в отладчике видно, что значения в регистре SDMMC_FIFOR0 меняются(не зависимо от действий программы)

3) Есть ли у кого действительно стабильный рабочий код в котором будет видно как именно нужно инициировать SD карту, повышать частоту шины (выше 400КГц), переключать ее на 4битный режим и выполнять чтение или запись несколькими блоками?

То, что я вижу в хале - это просто магия какая-то, и работает она соответственно. А мне нужно создать стабильно работающую реализацию :(

Вообще у меня масса вопросов касаемо SDMMC, пока я не понимаю для чего вообще была сделана подобная аппаратная поддержка SDMMC.
Все равно ее нужно дополнять большим объемом программной реализации.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...