Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4Discovery + SD карта через SDIO
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
hd44780
Собственно тема.

Примеров именно под Discovery я не нашёл, пришлось выдирать и переправлять из примеров к плате STM3240G-EVAL.
Получившийся код прилагаю.

Сама карта подключена проводками к соответствующим ногам проца:
PC8 - DAT0
PC9 - DAT1
PC10 - DAT2
PC11 - DAT3
PC12 - CLK
PD2 - CMD

На всех ногах, кроме CLK стоят pull-upы 47к на +3в. Как собственно нарисовано в схеме STM3240G-EVAL rolleyes.gif .
Выключателей CardDetect и ReadOnly нет вообще (разъём коряво припаяли, они всё время замкнуты на корпусе biggrin.gif ). Соответственно от проца они отключены и не опрашиваются.

Опрос:
Код
      // Init SD card
      sdErr = SD_Init ( );
      
      if ( sdErr == SD_OK )
      { // Карта инициализирована
        isSdPresent = true;
        STM_EVAL_LEDOn ( LED_GREEN );       // Светодиодик

        strcpy ( buffer, "Card init OK\r\n" );
      } // if
      else
      {
        isSdPresent = false;
        STM_EVAL_LEDOn ( LED_RED );         // Ошибка инициализации карты

        sprintf ( buffer, "Card init FAIL, code = %d\r\n", (int)sdErr );
      } // if


Результат - код ошибки 2 - CRC Error. buffer выводится на комп через виртуальный USB COM-порт.
Пытался регулируовать скорость макросом SDIO_TRANSFER_CLK_DIV - вообще виснет.
Сама карта (даже 2) рабочая. В картридерах работают и по SPI (на проце AT91SAM7S256) тоже.

Помогите, кто может.

Ещё непонятно, что такое
#define SDIO_FIFO_ADDRESS ((uint32_t)0x40012C80)

Буфер обмена с картой? Тогда чего адрес фиксированый? Может не туда улетает?

Спасибо.
_Артём_
Цитата(hd44780 @ Jan 21 2013, 21:21) *
Ещё непонятно, что такое
#define SDIO_FIFO_ADDRESS ((uint32_t)0x40012C80)

Видимо регистр SDIO_FIFO, описанный п в 26.9.15 SDIO data FIFO register.

Цитата(hd44780 @ Jan 21 2013, 21:21) *
Тогда чего адрес фиксированый?

Отчего же ему не быть фиксированным, если он - регистр.
hd44780
Про SDIO_FIFO понятно, спасибо.

Поправил там одну ошибочку, ошибки CRC никуда не делись, но размер карты считывается верно (если не проверять код завершения).
Завтра попробую читать сектора.

Где-то на буржуйских сайтах читал, что там длина проводов влияет. На выходных мож перепаяю, проверю.
hd44780
Заработало всё. Виной всему оказались длинные интерфейсные провода.
Перепаял на короткие (до 4 см) - работает нормально.
Правы были буржуи ... И про pull-upы наа всех ногах карты, кроме CLK не забыть.

Прилагаю подправленный код драйвера SD карты. Из 1-го поста не брать, там ошибка.
flopix
По поводу длины проводов. Сейчас тоже мучаю micro SD карту с STM32 в режиме SDIO. Длина проводов 20 см.
Но для теста установил: #define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x76)
При этом SDIO Data Transfer Frequency = 400Khz. Неужели и при такой частоте будет влиять длина проводов или косяк в проекте? Хотя там где я его взял сказали что он полностью рабочий.

Схема подключения:




Тестовый проект во вложении.
flopix
Уменьшил длину проводов до 5 см. Стало еще хуже.
Если при SDIO_TRANSFER_CLK_DIV = 4 раньше зависало на n ом блоке, то сейчас зависает уже при попытке открыть файл.

При больших значениях делителя работает со сбоями как и раньше.

Наверно все таки какой то косяк в железной части.
flopix
В режиме SDIO 1 бит читает без сбоев на максимальной скорости. Значит все таки проблема в проводах.

При этом файл размером 20 мбайт читает при размере блока чтения
512 42c
1024 21c
2048 13c
4096 11c
8192 9c
16384 9c
32768 8c

При этом скорость чтения получается около 2,5МБайта в секунду.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.