Easyelectronics.ru

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

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



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

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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
Смотрим описание SD_ILLEGAL_CMD: "Command is not legal for the card state".
Варианты возникновения разные:
- после отправки команды в регистре SDIO_CMD должна быть отправленная команда (после получения ответа), если это не так, то будет SD_ILLEGAL_CMD.
- карта находится в том состоянии (card state), когда отправленную команду отправлять нельзя.
Первый вариант может случиться из-за плохой связи, например, но второй вариант вероятнее, т.к. при пошаговом проходе все работает. Значит идея такова, что где-то карта не успевает перейти в нужный режим, а ей уже пихают следующую команду. Значит надо после каждого SDIO_SendCommand() втулить проверку на ошибку и выяснить, на каком этапе облом.


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Заменил либу на либу из проекта Pingvin - проблема устранилась, мдя... Значит всё таки лыжи не ехали... Удивляет больше то, что вроде как стандартный пример от производителя, вроде как обкатанный на такой же платформе и на такой же частоте тактовой (72мгц) - и не работает по факту, ладно бы с конкретной картой не работал, так нет же, с любой получается. Для интереса надо бы сравнить чем первая от второй либа отличается, что бы придти к пониманию граблей...


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Разницу нашел в строчках:
#define SDIO_CMD0TIMEOUT ((uint32_t)0x00010000)
#define SDIO_CMD0TIMEOUT ((u32)0x00002710)

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


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

Зарегистрирован: 17 ноя 2014, 21:28
Сообщения: 8
Весьма неочевидная проблема. С ростом проекта и наличием ОСРВ таймат приходится увеличивать вплоть до 0x000FFFFF.


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Кто-нибудь сталкивался с проблемами при работе с большими картами SDHC ? Более 4 Гб (на 4Гб всё норм). Странность заключается в чтении какой-то ерунды вместо положенных данных. Пытаюсь считать блок с номером 0. Получаю
Вложение:
Комментарий к файлу: вот это
rd_block0_sdhc16gb.txt [3.93 Кб]
Скачиваний: 386
(то что скрыто [-] везде нули). Пробовал искать эти данные на карте (при помощи winhex) - не нашел. То есть явно что-то не то читается. При этом карта SDSC 2Гб читается на ура, SDHC 4Гб тоже. А вот SDHC 16Гб читается вот так криво. В начале грешил на то что это SDHC и что-то с адресацией, но во-первых для блока 0 адресация роли не играет, там всегда 0, как не крути, а во-вторых та что 4Гб работает нормально. Причем она точно SDHC (проверено на древнем картридере - как и положено он её не видит).
Может есть какая особенность в инициализации карт ?


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
Отличий инициализации нет, мой код что с 4Гб, что с 32Гб картами работал нормально, тот, что из SPL, на больших картах не пробовал, но отличий быть не должно.
Странный размер блока в .txt файле, для SDHC блок фиксирован на 512 байт и не меняется. В байтах 510-511 виден маркер MBR. В байтах 446-453 похоже, "master partition table" (не помню цифры эти и искать лень). После 511 байта - это уже второй сектор карты.
Цифры при чтении одни и те же или каждый раз разные? Интерфейс SDIO, полагаю, CRC не вываливается или вообще как-нибудь ошибок?


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
На длину просьба не обращать внимание, она не кратна блокам, еще и для другого используется просто. Читаю я один блок без мультиблока, так что всё что после 511 не важно. То что похоже на MBR да! Мне тоже в начале так показалось и подумалось "ну ок, всё работает", но вот на самом деле на карту я записал совсем другие данные просто дампом (без всяких FAT и форматирований) и читается всё равно такая же фигня. То что читается ни как не меняется. Ошибок никаких не выпадает, SD_OK возвращает. Проверил кстати на карте SDHC 32Гб - те же грабли.


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

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


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Раз 10 уже перепроверил, данные явно неадекватные, причем при мультичтении только первые 512 байт содержат данные, остальные (пробовал сразу 32 блока) содержат 0x00, проверил на 8,16 и 32 гб флешках - результат один и тот же, только после 446 байта данные у всех немного различаются, на флешках 2 и 4 гб - всё как положено, все 32 блока читаются и совпадают с тем, что видно в winhex на компе. Уже пробовал и в аргументе ACMD41 добавлять бит о том, что хост поддерживает SDHC - всё бестолку.
Может кто протестит на своем железе ? Кристалл stm32F103 c sdio. Главное что бы дебагер был и флешка на sdio, остальное не важно. Вот проект https://yadi.sk/d/nvmGmTT8kWCae для CoIDEv2beta. Запустить в дебаге, затем остановить и посмотреть массив data_rd.


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
Подтверждаю, у этого кода какая-то борода с большими флешками.
Подключил к своему F103 разъем для флешки, убрал из кода переключение на 4-бит шину, скомпилил (кокос 1.7.8). Для 32Gb флешки получил результат в точности, как в прикрепленном выше .txt файле: куча нулей, потом с 446 байта значения и в 510-511 байтах маркер MBR. С 4Gb флешкой все нормально.


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
Так может либа не рассчитана на большие карты?


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Вот потому и спрашиваю есть ли какие-то особенности с большими флешками (не считая то что адрес в функцию надо уже передавать не в 32, а в 64 битной переменной что бы выше 4 гб корректно обращаться, но это поправить не долго). Сравнивал с либами из куба, с либами датироваными 2015 годом и фигурированием там модных слов "SDXC" - никакой особой разницы не обнаружил, как в прочем и в статье с хабры http://habrahabr.ru/post/213803/ про инициализацию


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Проблема так и не побеждается, вкрутил уже либу от другого автора https://yadi.sk/d/-HUNdeggkXfsF, судя по комментам правки были совсем недавно, но результат на выходе абсолютно идентичен. Интересно у кого-то вообще удалось именно на sdio 32F103 большие флешки читать, а то складывается впечатление, что ни кто просто и не пробовал)) Ну или не было нужды в таком объеме. Либа вот из этого проекта https://github.com/nemuisan (STM32Primer2_GPS_Tracker)


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Примерно разобрался почему такой глюк возникает, но причину, вернее раскуривать механизм как это устроено выяснять лень, да и не нужно, т.к. всё равно предполагается работа просто с массивом флеш-памяти, а не с ФС. Оказалось, что на флешках большого объема почему-то реальная MBR смещена в блок 0x2000 (вероятно бывают и другие варианты), в начале думал что об этом где-то в CID/CSD можно узнать, но вроде не там это хранится. А вот в секторе 0 хранится лишь что-то похожее и видимо указывает на MBR. Ну а на компе проги по какой-то причине показывают флешку не с начала, а именно с блока 0x2000, в итоге данные, которые читает МК вообще найти на компе невозможно. Забавно, что если при помощи МК затереть блок 0, то тогда комп начинает флешку показывать с нуля, то есть значит всё таки это ни как не связано с флешкой и картридером аппаратно, а срабатывает прослойка на компе...
Собственно потому у тех, кто использует либу FatFs проблема эта ни как не возникает... Товарищ Chen видимо это давно знает...
Вот такие дела)) Спасибо за внимание, так сказать))


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 599
Откуда: Nowhere
Уже стало совсем интересно, взял плату на STM32L1, взял свою "либу" для SDIO, вытащил из телефона 32Гб флешку, прочитал первый сектор - картина как выше описано здесь. Чтоза... подумал я, ведь точно же работало... Выдрал из другой своей прошивки кусок, что читает корневую директорию в FAT (просто список файлов, используется библиотека DOSFS слегка допиленая), запустил - все работает, список файлов кажет без проблем. Почесал репу, достал две подопытные 8Гб флешки, одна форматированая виндой, другая - фотоаппаратом. Прочитал у них 0-й сектор и вышло так, что у одной из них "нормальный" MBR в нулевом секторе, а у другой такая фигня с ноликами. На обеих содержимое FAT читается нормально. Выходит DOSFS, как и FastFs, знает о такой особенности.


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Именно... А "DiskEditor-ы" всякие хавают то, что им подсовывает ОС, а сама же ОС скрывает эту особенность если "так надо"...


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

Зарегистрирован: 30 апр 2010, 22:56
Сообщения: 1580
Откуда: Киев
Это называется partition table. А точнее - Master Boot Record (MBR). У него тоже загрузочная сигнатура в конце.
Флешка, как и жесткий диск, можетбыть разбита на разделы. Поэтому нулевой сектор - это partition table
И флешка может быть записана как дискета - в нулевом секторе бутблок.
И то и то поддерживается системой.

PS. я дамп подробно не смотрел, может там быть не MBR a GPT, но сути это не меняет


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Да это всё понятно, смутило просто то что винда это тщательно скрывает когда таблица разделов отдельно, а так всё правильно и логично.
У меня теперь другая проблема с этим SDIO, а именно почему-то очень низкая скорость в мультиблоке на запись, причем если записывать по одному блоку, то скорость порядка 350кб/с, а в мультиблоке вообще около 300кб/с. И это на 4 битной шине. Пробовал опять же разные варианты библиотек - скорость работы не отличается.
При использовании "ченовского" варианта с SPI скорость вообще запредельная получается, явно больше 1мб/с, что даже немного удивляет. Вроде логично, что на SDIO должно быть если не больше, то хотя бы столько же...
Просто почему не подходит мне вариант с ФС и на SPI по прямому назначению. Мне нужно записывать данные со скоростью 300кб/с (ну с небольшим запасом на случай тормозов), но что бы ни как не возникали длительные паузы. Вариант с ФС на SPI к великому сожалению с какой-то периодичностью читает FAT-таблицу или еще что-то там в ФС (видимо уточняя куда писать дальше) и дает провалы по скорости от которых буфер успевает переполниться (в МК ОЗУ не много). Было решено добавить еще одну флешку как "внутренний" накопитель на SDIO со своей простенькой ФС (как CDFS или TRDOS), а потом уже данные переписать на флешку с ФС на SPI. Но вот и тут засада...

Может я чего-то делаю не так ? Или такова она суровая реальность и SDIO на этих МК такой унылый ?


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

Зарегистрирован: 18 фев 2013, 14:22
Сообщения: 512
Цитата:
что бы ни как не возникали длительные паузы

Смотря что понимать под "длительные паузы". Там паузы могут возникать внутри SD. Вам это неподвластно.


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Пауза это более 100мс, хотя обычно кусок в 4096 байт пишется в диапазоне 4-16мс.


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Как выяснилось, что бы мультиблок был эффективен оказывается нужно записывать мноооого блоков, а не 4 кб как у меня. Ну а ОЗУ не резиновое, так что думаю решить только путем нарезки функции на куски и не прерывая цепочку мультиблоков записывать уже приличные объемы.
Вся причина в задержке в конце функции SD_WriteMultiBlocks:

/*!< Add some delay before checking the Card Status */
for(count = 0; count < 0xFFFF; count++);

А это не хилая такая задержка. Просто механизм таков, что на самом деле даже указывая количество блоков всё равно это используется только для самой функции, а флешке только сообщается через ACMD23 (задание количества блоков для предстирания), а вот CMD23 (явно указывающая количество блоков на запись/чтение) не используется по причине не поддерживания её большинством флешек (не только SDSC). В итоге всё тормозится CMD12 (Stop Transfer), а т.к. после этого флешка впадает в состояние программирования (записи) последних данных, то видимо кроме как паузой подкараулить момент окончания ни как нельзя.
При убирании паузы сразу с ошибкой выпадает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 22 ноя 2016, 15:16 
Заглядывает иногда

Зарегистрирован: 12 окт 2011, 09:34
Сообщения: 122
У меня не получается перейти на 4b шину

Создал проект STMCube для SWB
иcпользую библиотеку 1.13.0
Путь к репозиторию
C:\Program Files\STMicroelectronics\STM32Cube\Repository\STM32Cube_FW_F4_V1.13.0
чип stm32f429

В проекте ничего лишнего, только работа с SD картой. Из своего кода добавил только чтение/запись чтобы проверить.
При использовании 1-битного режима работает нормально, но если в кубе задать 4-битный режим и сгенерить проект, то начинают сыпаться разные ошибки при работе с картой.
Пайку проверил, посмотрел уровни сигналов - ничего криминального не увидел, сигналы на шине данных есть.
Пробовал ставить минимальную скорость CLK - тоже не помогло
Карта Transcend 8Gb 10класс MicroSDHC, других нет, не пробовал
DMA не использую

подскажите в чем может быть причина?
проект во вложении

upd
Покрутил делитель, влияющий на скорость обмена. при значении 10 стабильно при записи возникает ошибка SD_DATA_CRC_FAIL
в erata написано, что она может возникать после отправки команды CMD5, из-за того, что CRC рассчитывается всегда, даже когда команда этого не предполагает.
У меня эта ошибка возникает в функции HAL_SD_WriteBlocks, внутри нее не нашел упоминания CMD5..


Вложения:
Комментарий к файлу: Исходник
sd_test.zip [28.84 Кб]
Скачиваний: 186
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 01 авг 2017, 22:07 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
А у меня ошибки вылезли при чтении из файла данных, более чем размер блока - 512 байт.
Решил вернутся к теме...
Посмотрел режим с DMA - так ожидание окончания операции всё-равно в цикле.
Это значит, при использовании FreeRTOS процессорное время будет тратиться на этот цикл ненужный.
По идее нужно семафор отпускать из прерывания DMA, а в задаче ждать семафора.
Но это нужно глубоко копать.
"Скрестить" так сказать FreeRTOS и SDIO драйвер.


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

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 542
Скажите, чтобы в HAL работал DMA режим с использованием HAL-функций нужно ещё и прерывания включать? С АЦП и UART такого не было, работало без включения global interrupt. Использую только HAL_SD_WriteBlocks_DMA и HAL_SD_GetCardState(&hsd). Данные записываются корректно, проверяю карточку на компьютере просмотром секторов.

Но если отключить прерывания, то функция HAL_SD_GetCardState(&hsd) постоянно возвращает HAL_SD_CARD_RECEIVING и никогда не приходит HAL_SD_CARD_TRANSFER. Если же включить прерывания, то HAL_SD_CARD_TRANSFER приходит, чем и определяю готовность карточки к следующим операциям записи:
Код:
ch=HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t*)&adcBuffer, address, 32);
comSend((uint8_t *)&ch,1);
do {
   ch=HAL_SD_GetCardState(&hsd);
   comSend((uint8_t *)&ch,1);
   HAL_Delay(100);                        
   }   while(ch!=HAL_SD_CARD_TRANSFER);

Прерывания нигде не использую, но посмотрев исходники HAL_SD_IRQHandler в STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c у меня возникло подозрение, что без этой функции не будет что-то работать.

update: еще непонятно, почему
Код:
         while (1)
            {
               ch=HAL_SD_GetCardState(&hsd);
          if (ch==HAL_SD_CARD_TRANSFER) break;
             HAL_Delay(1);
            }

не зависает, а
Код:
         while (1)
            {
               ch=HAL_SD_GetCardState(&hsd);
          if (ch==HAL_SD_CARD_TRANSFER) break;
         
            }

виснет (убрал delay)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 14 авг 2017, 01:15 
Заглядывает иногда

Зарегистрирован: 12 окт 2011, 09:34
Сообщения: 122
У меня HAL-овский UART DMA не работал без прерываний, он на них построен. Может и тут та же история
а HAL_Delay использует для счетчика прерывания SysTick, если глобальные запрет включен, то может это как-то влияет. На достоверность не претендую, так, идеи где поискать причину


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

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


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

Сейчас этот форум просматривают: VladislavS


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

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

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