реклама на сайте
подробности

 
 
> И снова STM32F10x, SD-Карты, SDIO и файловые системы., FatFS vs. KEIL и "драйверы" ST vs. KEIL
KnightIgor
сообщение Sep 10 2014, 14:14
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Коллеги,

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

Имеем:
- железяки с STM32F103 и с SD-картой на SPI либо SDIO.
- KEIL Flash-FS (из 4.х) и родными "драйверами" для SPI и SDIO.
- FatFS, конкретно с diskio.c, где пользуется "драйвер" SDIO из примеров от ST (часто как файл sdcard.c).
- познание в сравнении.

Итак, до сего момента работало все отлично либо как KEIL Flash-FS через SPI | SDIO с "драйверами" от KEIL, а также FatFS через SPI. Причем в последнем случае я переписал diskio.c от Martin Thomas, чтобы работа с SPI также велась через SPI-драйвер из KEIL.

Теперь возникла тема запустить FatFS через SDIO. Здесь я не стал пользовать управление SDIO от KEIL, а обратился к примерам, где diskio.c пользует sdcard.c из примеров от ST.

В принципе, заработало, но наблюдается следующий эффект: если в процессе отладки после УСПЕШНОЙ инициализации карты, сделать сброс отладки (начать сначала), то на последующем проходе карта не инициализируется, т.к. после CMD0 уже команда CMD8 (которая 0x1AA передает) не получает ответа вообще, и устанавливается бит таймаута в ->STATUS. Если карточку обесточить (вынуть и вставить), то инициализации пройдет успешно. Такое же поведение и при "нормальной" работе устройства: карту вставил, устройству дал сброс, карта прочиталась. Не вынимая карту и не снимая питания, снова устройство пересбросил - карта не прочиталась. Карту вынул-вставил, устройство перестартанул - карта прочлась. KEIL Flash-FS на том же устройстве при таких же экспериментах работает уверенно, карта готова всегда.

Мое подозрение: либо изнутри KEIL Flash-FS карта инициализируется иначе, чем это реализовано в diskio.c + sdcard.c, либо где-то временнЫе соотношения иные. Предварю вопрос: частоты тактирования SDIO идентичны как под KEIL, так и под ST-драйверами.

Куда смотреть еще?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Sep 10 2014, 17:41
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте паузу ~10 мс после CMD0. Слышал, что может помочьsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 10 2014, 19:10
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(AHTOXA @ Sep 10 2014, 19:41) *
Попробуйте паузу ~10 мс после CMD0. Слышал, что может помочьsm.gif

Та-а-а-к. Сделал. Вроде помогло. Однако возникает риторический вопрос: куда смотрели писатели sdcard.c, и как работает у других?

P.S. Помогло лишь тем, что всегда CMD8 отвечать стала. А затем вообще интересный эффект стал наблюдаться:

сбросил - проинициализировал - пошло чтение - успешно.
сбросил - проинициализировал - пошло чтение - ошибка SDIO_FLAG_DCRCFAIL.
сбросил - проинициализировал - пошло чтение - успешно.
сбросил - проинициализировал - пошло чтение - ошибка SDIO_FLAG_DCRCFAIL.

и.т.д., четко чередуясь.

"А тут слух пустили, что скоро водку в бумажных пакетах продавать будут. Как жить - не знаю..." (с) Г. Горин.


Сообщение отредактировал KnightIgor - Sep 10 2014, 21:17
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 11 2014, 04:26
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(KnightIgor @ Sep 11 2014, 01:10) *
"...Как жить - не знаю..." (с) Г. Горин.

Как жить, как жить... Ставить ключ на питание, это, имхо, единственный железобетонный вариант.

Добавлю пару хоороших ссылок про SDIO.
- Статья про тонкости SDIO;
- Хорошая, простая и очень понятная либа для SDIO.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Sep 11 2014, 10:27
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(AHTOXA @ Sep 11 2014, 06:26) *
Как жить, как жить... Ставить ключ на питание, это, имхо, единственный железобетонный вариант.

"Поздно пить Боржоми". Железо сковано уже, остыло и отвердело.
В общем, наковырял я следующую тему: в "драйвере" от обстоятельного немца господина Кайля есть такая специальная обработка случая ошибки контрольной суммы, которая, по слухам, обходит errat'у. Выглядит так:
CODE

if (stat & SDIO_STA_CCRCFAIL) {
SDIO->ICR = stat & SDIO_STA_CLEAR_MASK;
if ((cmd == SEND_OP_COND) ||
(cmd == SEND_APP_OP_COND) ||
(cmd == STOP_TRANS)) {
SDIO->CMD = 0;
break;
}
return (__FALSE);
}

Как видно, драйвер "забил большой байт" на ошибку CRC для трех команд и промыл трубу. Одна из команд - та самая расхожая ACMD41, а другая - CMD12, что после многоблочной передачи выдается. Этой заворушки нет в индусских драйверах от "MCD Application Team" sdcard.c. В качестве эксперимента я перенаправил работу с SDIO из файла sdcard.c в драйвер от KEIL. Конечно, если наложить шум на сигнал, будет шум, а не сигнал. Я вычистил индусский код, текст стал раз в пять короче, но без содрогания не взглянешь. Однако заработало! Можно сбрасывать туда-сюда, карта все равно оживляется... Как-то так. (с) Винни-Пух.

Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2025 - 22:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01419 секунд с 7
ELECTRONIX ©2004-2016