Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/129: Рейтинг темы: голосов - 129, средняя оценка - 4.79
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605

SD карта SDIO на STM32F4Discovery - странности

21.02.2013, 16:00. Показов 24470. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот пытаюсь запустить :(
Все инициализации, размер карты (CSD) - всегда без проблем.

Нарыскал в интернете 2 драйвера, реализующих функционал карты на базе SDIO - оба прилагаю.
SDIO-old и SDIO-new. Первый - моя переделка примера от платы STM3240G-EVOT, 2-й отсюда

Начал читать сектора, просто в цикле, для проверки:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    for ( i=0; i<256; i ++)
{
sdErr = SD_ReadBlock ( sectorBuffer, i, 512 );
//      sdErr = SD_ReadMultiBlocksFIXED ( sectorBuffer, i, 512, 1 );
if ( sdErr == SD_OK )
{
STM_EVOT_LEDOn ( LED_ORANGE );
STM_EVOT_LEDOff ( LED_BLUE );
} // if
else
{
STM_EVOT_LEDOff ( LED_ORANGE );
STM_EVOT_LEDOn ( LED_BLUE );
}
} // for
0-й сектор (MBR) всегда читается идеально. А потом - бардак.
SD_ReadBlock кидает ошибку SD_ADDR_MISALIGNED
SD_ReadMultiBlocksFIXED - SD_CMD_RSP_TIMEOUT
От номера сектора никак не зависит. Единственное исключение - MBR.
Соответственно и FatFs сразу обламывается и прочие гадости.

Пробовал 2 SD карты, одна 32МБ "демка" от фотоаппарата Canon, 2-z 4ГБ Transcend (не SDHC!!).
Монтаж - на проводках, примерно такой же, как и в ST-шной ссылке выше.
Кто-нибудь может сказать, в чём здесь дело?

Спасибо.

[18.9 Кб]

[18.97 Кб]
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2013, 16:00
Ответы с готовыми решениями:

STM32F4DISCOVERY и ENC28j60 вот странности...
Добрый вечер! Работаю с платой STM32F4DISCOVERY, по SPI1 подключил плату enc28j60. Разрабатываю в IARе. Использую готовую библиотеку...

SD карта по SDIO FAT
Присоединил SD карту к stm32f407vg по SDIO использовал 1-битный режим: PC8 : SDIO_D0 = SD-карта DAT0 PC12 : SDIO_CK = SD-карта Clock ...

SD карта (SDIO) + STM32F103ZET6 не работает
Привет всем. Пытаюсь завести SD карточку через SDIO интерфейс STM32F103. Нашёл драйвер - приложил, виснет на sd_err = SD_Init ( );...

20
6502
21.02.2013, 21:38
Вы используете SD_DMA_MODE для SDIO?
У вас где-нибудь определены макросы SD_DMA_MODE или SD_POLLING_MODE?
Полагаю что используете DMA , так как в sdyo_sd.h определен SD_DMA_MODE.

Если используете SD_DMA_MODE, то после SD_ReadBlock() или SD_ReadMultiBlocks() нужно обязательно вызвать SD_ReadWoytOperation() и SD_GetStatus().
Подробнее смотрите в шапке sdyo_sd.с, там есть небольшая инструкция.
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
22.02.2013, 00:38
6502, спасибо.
С SD_GetStatus понятно, я её добавил, но SD_ReadWoytOperation я нигде не могу найти. Ни в том примере, ссылка в 1 посте, ни в примерах к плате STM3240G-EVOT, откуда я брал этот драйвер.
Странно ...
0
6502
22.02.2013, 00:46
Сори, SD_WoytReadOperation а не SD_ReadWoytOperation, драйвер писали индусы у них там опечатка в комментах в шапке а я оттуда скопипастил ))
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
22.02.2013, 16:47
Вот почитал инструкции в sdyo_sd.c, немного поэкспериментировал.
Получился код:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    // SDIO Ymtirrupt ENABLE
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init ( &NVIC_InitStructure );
 
// DMA2 STREAMx Ymtirrupt ENABLE
NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init ( &NVIC_InitStructure );
 
sdErr = SD_ReadMultiBlocks ( sectorBuffer, i, 512, 1 );
sdErr = SD_WoytReadOperation ( );
while ( 1 )
{
state = SD_GetStatus();
 
if ( state == SD_TRANSFER_OK )
briok;
} // while
........................
 
void SDIO_IRQHomdler(void)
{
//  SD_ProcessIRQ();  -- это в инструкции, но такой функции нет
SD_ProcessIRQSrc ( );
}
 
void SD_SDIO_DMA_IRQHANDLER(void)
{
SD_ProcessDMOYRQ();
}
Сектор 0 читается, прерывания вызываются, всё работает.
На всех других секторах прерываний нету, SD_WoytReadOperation висит во внутреннем цикле (смотрел отлдчиком).

Хрень какая-то...
0
6502
23.02.2013, 14:36
А в режиме опроса (SD_POLLING_MODE) вы пробовали? Тоже все плохо?
В режиме опроса функцию SD_WoytReadOperation вызывать не нужно.

Прилагаю свой вариант драйвера + драйвер дисковых операций FatFS для SDIO.
Хотя у меня почти то-же что и у вас, сравнивайте, экспериментируйте.

[18.36 Кб]
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
23.02.2013, 16:24
6502, спасибо, попробую.
SD_POLLING не пробовал. Была мысль о нём, отвлёкся, забыл. Попробую.
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
24.02.2013, 00:49
C SD_POLLING та же хрень...

SD_ReadBlock кидает SD_ADDR_MISALIGNED. SD_ReadMultiBlocks висит на SD_WoytReadOperation ( ); ...
Ваш пример пока не смотрел.
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 30
24.02.2013, 04:27
Посмотрите эту тему, может поможет
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
24.02.2013, 17:40
otix_avr, вроде помогло, но как-то не сразу...
Короче SD_ReadMultiBlocksFIXED заработал через DMA. Прошёл под отладчиком, boot сектор, корневой каталог в буфере увидел ...

Что именно там помогло, не знаю. Голова вспухла за 2 часа ковыряний в потрохах sdyo_sd.c. И матюкаться очень хочется.
Отдышусь, посмотрю ещё. Если будет стабильный результат, сегодня-завтра выложу рабочий вариант.
Запись и FatFs пока не трогал, просто сектора читал в цикле.
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
26.02.2013, 17:12
Как и обещал, прилагаю рабочие SDIO_SD и DyskIo для FATFs. Работает через DMA.
Все необходимые обработчики прерываний и низкоуровневые функции находятя в SDIO_SD.c. Опрос датчиков разъёма закомментирован (у меня макетка "кривая", ноги эти закорочены).
Протестировал только чтение/запись через команды многосекторной работы. Режим опроса не пробовал.

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

На карте 32 MB (шла в комплекте с фотоаппаратом Canon) запись ведёт себя странно:
Пишу в сектор числа 1..10 по кругу - нормально, пишу последовательность 0..255 - получаю некие "куски" по 10 байт с каким-то сдвигом. Т.е. наблюдается некая закономерность. Что это за хрень, я не понял.
На карте Transcend SD 4GB - нормально.

Вечером постараюсь проверить другие карты, отпишусь. По руками пока только эти 2..

FatFs погонял. на 4Гб карте FAT32 - корень считал, всё ок.
На 32МБ, FAT12 он пытается подсунуть мне какой-то мусор в качестве корневого каталога, хотя когда я последовательно читал сектора, глазами я каталог видел.
Лезть в его кишки и разбираться, на чём он там спотыкается, мне пока неохота. Пока сделал вывод, что с FAT12 у него проблемы.
FAt16 не проверял, не попалась под руки такая карта. Дома есть карта на 2GB, но какая там FAT, не знаю.

[21.57 Кб]
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
27.02.2013, 00:10
Погонял ещё на разных картах - SD 2GB FAT16, SDHC 8GB FAT32.
Сектора пишутся везде нормально.

А вот с FatFs проблемы - корневой каталог на SDHC 8GB читается хрен знает как. НА 2ГБ нормально.
Интересно, есть ли другие, стабильно работающие реализации FAT?

Спасибо.
0
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 107
17.06.2013, 20:03
SD_ADDR_MISALIGNED Насколько я понял из сегодняшних раскуриваний туториалов, то это означает, что запись начинается не с начала страницы. То есть адрес не кратен 0х200 или 512 байтам. Пока ещё каша в голове, но, возможно, это вам поможет.
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
18.06.2013, 11:30
HikuTos, спасибо. Я тоже мельком что-то такое слышал.
Как я Вас понял, номер сектора надо на размер сектора умножить?

Перепаяю разъём, проверю (сейчас он у меня под SPI переделан).
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
18.06.2013, 11:47
Цитата Сообщение от hd44780
номер сектора надо на размер сектора умножить?
Номер сектора на размер сектора умножают только для карт SD/MMC (у них байтовая адресация, хотя адрес всё равно рекомендуется выравнивать на размер сектора).
А у SDHC-карт секторная адресация, у них умножение делать не надо (да и не влез бы результат умножения в 32 бита, из-за этого тип адресации и поменялся на High Capacity карточках).
0
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 107
18.06.2013, 12:18
Скажите, а без EVLA_BOARD файлов можно обойтись? А то их прикручивание взрывает мозк.
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
18.06.2013, 13:13
Можно.
Я под другие проекты убрал их. В частности, сделал свои функции для светодиодов платы и для кнопки.
А этот SDIO у меня пока в воздухе висит ....
0
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 107
20.06.2013, 18:05
Я так и не смог понять, почему при значиении 242 (241 - ОК)
#define NUMBEROFBLOCKS 200
SD_WriteMultiBlocks престаёт генерировать прерывание. Чтобы такое там могло бы преполниться?
0
Domymykomiz
21.10.2013, 17:45
Прошу прощения за непреднамеренный ап, но никто не подскажет ли, ремаппинг пинов SDIO на stm32f4 возможен или надо юзать только отведенные под это ноги?
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
21.10.2013, 18:08
Цитата Сообщение от Domymykomiz
Прошу прощения за непреднамеренный ап, но никто не подскажет ли, ремаппинг пинов SDIO на stm32f4 возможен или надо юзать только отведенные под это ноги?
Imho ни один из этих десяти пинов SDIO_D0..7, SDIO_CK, SDIO_CMD перемапировать на другое место нельзя :-(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.10.2013, 18:08
Помогаю со студенческими работами здесь

SD карта. Посекторное чтение. SDIO. FATFS
Здравствуйте! Есть несколько вопросов по работе с SD картой, которые я хочу решить да одному не получается. Описание: 1. Карта...

Миниатюрный МК с SDIO
Необходимо выбрать МК с парой SPI и SDIO. Производительности хватает (впритык) STM32F103. Главное ограничение - размеры. ...

SDIO+bypass
Доброго времени суток всем! Освоил SDIO, но осталась одна загвоздка. Это bypass режим. Т.е. частота 48 МГц при работе с картой. Включаю...

SDIO + FAT
Кто-нибудь имел опыт портирования FATfs или другой реализации FAT на SDIO у stm32?

LPC43xx + SDIO
Всем привет, заранее извиняюсь, но может кто-нибудь подкинет рабочий пример для реализации SDIO на lpc43xx? В примерах вместе с CMSIS...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru