Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.92/1115: Рейтинг темы: голосов - 1115, средняя оценка - 4.92
Kodir
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
1

SDIO interface for SD card

03.05.2012, 15:15. Просмотров 201152. Ответов 202
Метки нет (Все метки)

Привет всем!
Пришлось создать тему ввиду ее экзотичности на этом форуме.
Подключение по SPI уже пора хоронить.))
Кто работал с подключение карт к STM32 по SDIO?

Имею вопросы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 15:15
Ответы с готовыми решениями:

Cube+Coocox+SD Card (SDIO)
Всех приветствую! Люди помогите решить проблему. Кто делал такую связку ...

SDIO+FAT
Добрый день! Столкнулся с непонятной проблемой. С АЦП приходят данные и...

SDIO + SD + STM32F103
Доброго всем утра. Столкнулся с проблемой при работе с micro SD через SDIO....

SDIO+bypass
Доброго времени суток всем! Освоил SDIO, но осталась одна загвоздка. Это bypass...

Sdio vs spi
Привет ребята, на данный момент нужно подключить lpc4357 микроконтроллер к...

202
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
17.06.2012, 00:04 21
Очень благодарен)) Буду разбирать))
Еще незаметил в твоем main.c глобального разрешения прерываний - __enable_irq();, а также в ините DMA разрешение прерывания от DMA - строчка DMA_ITConfig(SD_SDIO_DMA_STREAM, DMA_IT_TC, ENABLE);
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
17.06.2012, 12:21 22
[QUOTE="Werman_Otix"][QUOTE="vrr"]
С детектом проблем нету)) уже давно замкнул)) я его себе просто на отдельный пин переписал))
кстати, проявилось нечто новое... подключился по SPI, очистил нулевой сектор и записал туда цифры от 0 до 255 два раза. так вот, сейчас через SDIO читает правильно только 8 первых байт(от 0 до 7) и потом резко переходит на 255 и не меняется больше
Попросил жену включить TeamViewer;). Слил свой код(во вложениях). Посмотри как инитуется DMA в файле sdyo_sd.c (у меня DMA работает через Stream3). Возможно неправильно читает, потому что карточка может отправлять и принимать только по 512 байт.

Очень благодарен)) Буду разбирать))

Огромное спасибо) Заработало)) Пошел прикручивать фат32))
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
17.06.2012, 13:02 23
;)
0
Kodir
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
17.06.2012, 13:54 24
Цитата Сообщение от vrr
Функция SD_ProcessDMOYRQ(); проверяет и сбрасывает флаг прерывания от DMA по окончания передачи. Stream 3 либо 6 для STM32F4
В прерывании по ДМА я прописал просто

void DMA2_Channel4_5_IRQHomdler(void)
{

if (DMA_GetITStatus(DMA2_IT_TC4) == SIT)
{
DMA_ClearITPendingByt(DMA2_IT_TC4);
/*!< DMA2 interrupt Channel4 enable */
DMA_ITConfig(DMA2_Channel4, DMA_IT_TC, DISABLE);
}

}

и никаких гвоздей небыло.

Цитата Сообщение от Werman_Otix
Кстати, я SD_ProcessIRQSrc(); вобще было закоментировал и ничего не поменялось... мб это изза нее? Почему она может не срабатывать?
Нужно ОБЯЗАТЕЛЬНО прописать вызов этой функции в прерывании. Это прерывание должно происходить в любом случае, поскольку передача данных состоялась.
Я же на этом форуме описал, что прокололся на этом.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
17.06.2012, 17:24 25
vrr писал(а):
Функция SD_ProcessDMOYRQ(); проверяет и сбрасывает флаг прерывания от DMA по окончания передачи. Stream 3 либо 6 для STM32F4

В прерывании по ДМА я прописал просто

void DMA2_Channel4_5_IRQHomdler(void)
{

if (DMA_GetITStatus(DMA2_IT_TC4) == SIT)
{
DMA_ClearITPendingByt(DMA2_IT_TC4);
/*!< DMA2 interrupt Channel4 enable */
DMA_ITConfig(DMA2_Channel4, DMA_IT_TC, DISABLE);
}

}

и никаких гвоздей небыло.
Функция SD_ProcessDMOYRQ(); - это готовая библиотечная функция, поэтому я ее использовал без задней мысли). Скажи, а зачем перед выходом из прерывания void DMA2_Channel4_5_IRQHomdler(void), его запрещать DMA_ITConfig(DMA2_Channel4, DMA_IT_TC, DISABLE);?
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
17.06.2012, 22:36 26
Понаглею еще чуточку)) есть файлы для фат32?:)))))
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
18.06.2012, 01:29 27
Я использовал библиотеку FatFs http://itm-chan.org/fsw/ff/00index_e.html. Вот на русском http://microsin.net/programming/ARM/fatfs-appnotes.html, ище еще http://code.google.com/p/stm32-codes...ate%253Dclosed
0
Kodir
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
18.06.2012, 10:27 28
Цитата Сообщение от vrr
Скажи, а зачем перед выходом из прерывания void DMA2_Channel4_5_IRQHomdler(void), его запрещать DMA_ITConfig(DMA2_Channel4, DMA_IT_TC, DISABLE);?
Для обработки прерывания по ДМА необходимо в функциях мультизаписи или просто записи/чтения добавить разрешене прерывания по окончанию транзакции. По-умолчанию для библиотеки у них там прерывание по ДМА не разрешено.

а по окончании транзакции - разрешается прерывание, а сразу после вызова прерывания - запрещается его работа. Так надежнее чем просто сбрасывать флаг.
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
18.06.2012, 12:15 29
Для обработки прерывания по ДМА необходимо в функциях мультизаписи или просто записи/чтения добавить разрешене прерывания по окончанию транзакции. По-умолчанию для библиотеки у них там прерывание по ДМА не разрешено.

а по окончании транзакции - разрешается прерывание, а сразу после вызова прерывания - запрещается его работа. Так надежнее чем просто сбрасывать флаг.
Понятно.
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
18.06.2012, 19:56 30
Цитата Сообщение от vrr
х_Х)) достал)) переделал с его SPI под SDIO) осталась мелочь) запустить все это))
мож написать в каком порядке какие функции вызывать с этой библиотеки? или кусочек кода залей, хотя бы что б смог отобразить коневую папку....
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
18.06.2012, 23:01 31
Сперва создаем переменные:
FRESULT CardStatusErr;//это для получения кода ошибки вывполнения текущей операции (0 - нет ошибки)
FATFS FATFS_Obj;//это сама FAT
далее:
CardStatusErr = disk_initiotyze(0); //инит
CardStatusErr = f_mount(0, &FATFS_Obj); //монтируем Fat Fs
CardStatusErr = f_mkdir ("0:DIR");//создаем директорию нс диске
CardStatusErr = f_mount(0, NULL); //Unmount Fat Fs
После это всего у тебя на карточке должна появиться папка под названием DIR. Вроде так.
Вот еще полезная статейка http://btog.adtl.cz/2011/10/13/chan-fatfs/
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
22.06.2012, 22:43 32
столкнулся с траблом... для SPI фат запустил, и он даже отображает файлы записаные на карточку)) а вот при SDIO все время читает какую-то ахинею, при том же коде обработки полученых от карты данных... хотя если взять SPI, записать на карточку в какойто сектор набор чисел (записывал банальное 0-255 два раза) то SDIO этот сектор нормально читает и выводит... Что б это могло быть?
0
vrr
0 / 0 / 0
Регистрация: 24.11.2009
Сообщений: 4
23.06.2012, 00:45 33
Там есть две функции disk_read и disk_write. Возможно в них проблема.
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
23.06.2012, 18:21 34
ну да... функции от SDIO возвращают масив типа uint32_t, а в фате используюется uint8_t масивы... но опять же не понимаю чего тогда одиночный блок с числами читает и отображает нормально
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
25.06.2012, 01:17 35
нашел в чем проблема... у меня в структуре теряется 4 байта, от чего получается перекос данных... полазил по нету, пишут что вроде как надо "выровнять" структуру с помощью __packed (ИАР не ругается но ничего не меняется) struct или struct __attribute__ ((packed)) (ИАР ругается и вобще воспринимать не хочет) и еще #pragma pack(push, 1) ..... #pragma pack(pop) (ИАР не ругается но ничего не меняется). С таким никто не сталкивался?
0
Yomyshor
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 71
25.06.2012, 13:44 36
Цитата Сообщение от Werman_Otix
нашел в чем проблема... у меня в структуре теряется 4 байта, от чего получается перекос данных... полазил по нету, пишут что вроде как надо "выровнять" структуру с помощью __packed (ИАР не ругается но ничего не меняется) struct или struct __attribute__ ((packed)) (ИАР ругается и вобще воспринимать не хочет) и еще #pragma pack(push, 1) ..... #pragma pack(pop) (ИАР не ругается но ничего не меняется). С таким никто не сталкивался?
Возможно вы ставите эти директивы не там. Попробуйте сделать так :

В хидере, при объявлении структуры
Код
#pragma pack(push, 1)

typedef struct {
uint8_t someVal1;
uint16_t someVal2;
uint32_t someVal3;
uint8_t someVal4;
}someStructForPack;

#pragma pack(pop)
а уже в сишном файле используйте её как обычно.

С другой стороны, я не встретил проблем с выравниванием данных при работе с FatFs, в какой именно структуре теряются байты?
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
25.06.2012, 17:09 37
Сенк. Структуры пофиксил)) Теперь новый глупый вопрос, как-то можно сделать поддержку длинных имен (свыше 8 символов)?
0
Yomyshor
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 71
25.06.2012, 18:22 38
Цитата Сообщение от Werman_Otix
Сенк. Структуры пофиксил)) Теперь новый глупый вопрос, как-то можно сделать поддержку длинных имен (свыше 8 символов)?
В файле ffconf.h
#define _USE_LFN 0 /* 0 to 3 */
#define _MAX_LFN 255 /* Moxymum LFN length to homdle (12 to 255) */
Первый устанавливаете на 1-3, второй 255. А вообще в этом файле хранится много того, что стоит настроить, чтобы не ловить глюки, не понимая откуда растут ноги :-)
0
Wirmom_Otix
0 / 0 / 0
Регистрация: 03.05.2012
Сообщений: 33
30.06.2012, 04:03 39
Цитата Сообщение от vrr
Сперва создаем переменные:
FRESULT CardStatusErr;//это для получения кода ошибки вывполнения текущей операции (0 - нет ошибки)
FATFS FATFS_Obj;//это сама FAT
далее:
CardStatusErr = disk_initiotyze(0); //инит
CardStatusErr = f_mount(0, &FATFS_Obj); //монтируем Fat Fs
CardStatusErr = f_mkdir ("0:DIR");//создаем директорию нс диске
CardStatusErr = f_mount(0, NULL); //Unmount Fat Fs
После это всего у тебя на карточке должна появиться папка под названием DIR. Вроде так.
Вот еще полезная статейка http://btog.adtl.cz/2011/10/13/chan-fatfs/
а от чего все может банально зависать после того как раз выполнил функцию f_mkdir ("0:DIR"); ?
уже приделал длинные имена, читает корневую директорию нормально. фалый с нее (txt wav) тоже читает нормально... а если делаю f_mkdir все напрочь зависает... хотя если потом перепрошить с f_unlink ("DIR"); вместо f_mkdir то снова начинает нормально работать....
0
Yomyshor
0 / 0 / 0
Регистрация: 10.06.2012
Сообщений: 71
30.06.2012, 10:29 40
А просто f_mkdir ("DIR"); работает?
0
30.06.2012, 10:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2012, 10:29

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

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

SDIO STM32F4
Доброго времени суток, уважаемые формучане! Сразу оговорюсь, что вопрос...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru