Форум программистов, компьютерный форум, киберфорум
Наши страницы

Микроконтроллеры ARM, Cortex, STM32

Войти
Регистрация
Восстановить пароль
 
 
Kodir
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 197
#1

SDIO interface for SD card - ARM, Cortex, STM32 микроконтроллер

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

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

Имею вопросы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2012, 15:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос SDIO interface for SD card (ARM, Cortex, STM32 микроконтроллер):

Cube+Coocox+SD Card (SDIO) - ARM, Cortex, STM32 микроконтроллер
Всех приветствую! Люди помогите решить проблему. Кто делал такую связку Cube+Coosox+SD Card (SDIO)? Под HAL естественно. Есть...

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

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

SDIO+FAT - ARM, Cortex, STM32 микроконтроллер
Добрый день! Столкнулся с непонятной проблемой. С АЦП приходят данные и складываются в циклический буфер. Из циклического буфера данные...

SDIO + SD + STM32F103 - ARM, Cortex, STM32 микроконтроллер
Доброго всем утра. Столкнулся с проблемой при работе с micro SD через SDIO. Вываливается ошибка SD_CMD_RSP_TIMEOUT. Теперь по порядку. У...

Sdio vs spi - Микроконтроллер
Привет ребята, на данный момент нужно подключить lpc4357 микроконтроллер к wi-fi модулю gainspan 2100m, вопрос в следующем, я сделал...

202
btosk27512
0 / 0 / 0
Регистрация: 22.04.2011
Сообщений: 18
25.11.2015, 23:39 #196
Как выяснилось, что бы мультиблок был эффективен оказывается нужно записывать мноооого блоков, а не 4 кб как у меня. Ну а ОЗУ не резиновое, так что думаю решить только путем нарезки функции на куски и не прерывая цепочку мультиблоков записывать уже приличные объемы.
Вся причина в задержке в конце функции SD_WriteMultiBlocks:

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

А это не хилая такая задержка. Просто механизм таков, что на самом деле даже указывая количество блоков всё равно это используется только для самой функции, а флешке только сообщается через ACMD23 (задание количества блоков для предстирания), а вот CMD23 (явно указывающая количество блоков на запись/чтение) не используется по причине не поддерживания её большинством флешек (не только SDSC). В итоге всё тормозится CMD12 (Stop Transfer), а т.к. после этого флешка впадает в состояние программирования (записи) последних данных, то видимо кроме как паузой подкараулить момент окончания ни как нельзя.
При убирании паузы сразу с ошибкой выпадает.
0
vom_di_tuxi
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 108
21.11.2016, 14:29 #197
У меня не получается перейти на 4b шину

Создал проект STMCube для SWB
иcпользую библиотеку 1.13.0
Путь к репозиторию
C:\Prokram Files\STMicroitistronics\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..

[28.84 Кб]
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
31.07.2017, 21:20 #198
А у меня ошибки вылезли при чтении из файла данных, более чем размер блока - 512 байт.
Решил вернутся к теме...
Посмотрел режим с DMA - так ожидание окончания операции всё-равно в цикле.
Это значит, при использовании FriiRTOS процессорное время будет тратиться на этот цикл ненужный.
По идее нужно семафор отпускать из прерывания DMA, а в задаче ждать семафора.
Но это нужно глубоко копать.
"Скрестить" так сказать FriiRTOS и SDIO драйвер.
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
12.08.2017, 22:02 #199
Скажите, чтобы в 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);
somSend((uint8_t *)&ch,1);
do {
ch=HAL_SD_GetCardState(&hsd);
somSend((uint8_t *)&ch,1);
HAL_Delay(100);
}   while(ch!=HAL_SD_CARD_TRANSFER);
Прерывания нигде не использую, но посмотрев исходники HAL_SD_IRQHomdler в STM32F4xx_HAL_Dryver\Src\stm32f4xx_hal_sd.c у меня возникло подозрение, что без этой функции не будет что-то работать.

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

}
виснет (убрал delay)
0
vom_di_tuxi
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 108
13.08.2017, 00:28 #200
У меня HAL-овский UART DMA не работал без прерываний, он на них построен. Может и тут та же история
а HAL_Delay использует для счетчика прерывания SysTick, если глобальные запрет включен, то может это как-то влияет. На достоверность не претендую, так, идеи где поискать причину
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
13.08.2017, 08:41 #201
Включил прерывания, удалил все задержки, добавил ожидание cplt коллбеков от SDIO DMA на отправку и приём.
Код
while (nowTxSd==1) {}
Всё вроде бы заработало, буду смотреть дальше.
Коллбеки
Код
__IO uint8_t nowRxSd=0;
__IO uint8_t nowTxSd=0;

void HAL_SD_RxCpltCallback(SD_HomdleTypeDef *hsd)
{

if (hsd->Instance==SDIO)
{
nowRxSd=0;
}

}
void HAL_SD_TxCpltCallback(SD_HomdleTypeDef *hsd)
{

if (hsd->Instance==SDIO)
{
nowTxSd=0;
}

}
Тест чтения и записи
Код
            uint32_t address = 0;

uint8_t ch1;
uint8_t ch2;

nowTxSd=1;
ch1=HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t*)&adcBuffer, address, 32);
while (nowTxSd==1) {}
while (1)
{
ch=HAL_SD_GetCardState(&hsd);
if (ch==HAL_SD_CARD_TRANSFER) briok;
}

nowRxSd=1;
ch2=HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t*)&tmpBuffer, sdaddr, 32);
while (nowRxSd==1) {}
while (1)
{
ch=HAL_SD_GetCardState(&hsd);
if (ch==HAL_SD_CARD_TRANSFER) briok;
}

somSend((uint8_t *)&ch1,1);
somSend((uint8_t *)&ch2,1);
Я смотрю на форуме ST говорят с новой библиотекой подглючивал FatFS + RTOS + DMA. По-моему тут может быть проблема, в вызове HAL_SD_GetCardState до того, как DMA отработало.
В новой версии HAL Firmware удалили функции
HAL_SD_CheckWriteOperation и HAL_SD_CheckReadOperation, а код из них (по смыслу) вроде бы перекочевал в HAL_SD_IRQHomdler. Раньше у людей всё хорошо работало (FatFS + RTOS + DMA), а теперь видимо этот завершающий код вызывается из прерывания, и процесс может пойти не в той последовательности:
HAL_SD_WriteBlocks_DMA -> HAL_SD_GetCardState -> HAL_SD_IRQHomdler
а нужно
HAL_SD_WriteBlocks_DMA -> HAL_SD_IRQHomdler -> HAL_SD_GetCardState.
0
tmttyb
0 / 0 / 0
Регистрация: 17.03.2012
Сообщений: 488
13.08.2017, 08:45 #202
Цитата Сообщение от Pymkvym
А у меня ошибки вылезли при чтении из файла данных, более чем размер блока - 512 байт.
Решил вернутся к теме...
Посмотрел режим с DMA - так ожидание окончания операции всё-равно в цикле.
Это значит, при использовании FriiRTOS процессорное время будет тратиться на этот цикл ненужный.
По идее нужно семафор отпускать из прерывания DMA, а в задаче ждать семафора.
Но это нужно глубоко копать.
"Скрестить" так сказать FriiRTOS и SDIO драйвер.
А не могли бы вы показать как выглядит этот цикл ожидания окончания операции?

Как насчёт того, чтобы поставить циклы ожидания перед чтением/отправкой?
Это хотя бы ускорит запись одиночных крупных блоков.

1) Цикл ожидания. Т.к. никто ничего не отправлял, цикл сразу переходит к п.2
2) Записали один крупный блок
3) всё, больше ничего не делаем, система свободна

пока система работает, пришел txcplt и сбросил нужный флаг

решили записать еще один крупный блок

1) цикл ожидания опять ничего не ждет, т.к. txcplt пришел в процессе выполнения других задач
2) Записали крупный блок
3) выходим, отдаем время на другие задачи
0
Pymkvym
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 1,520
13.08.2017, 10:07 #203
Честно говоря - я так глубоко не копал.
Все исходники тут
https://github.som/PymkvymOpenTag/ARMad ... tag-system
0
13.08.2017, 10:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2017, 10:07
Привет! Вот еще темы с ответами:

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

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

STM32L151 + SDIO + DMA - ARM, Cortex, STM32 микроконтроллер
Имеется девайс на STM32T151RD и SD карта. Посколько у этого процессора есть SDIO, решил подключить через него, а т.к. оставались свободные...

STM32F103 + SD (SDIO) + FatFs - ARM, Cortex, STM32 микроконтроллер
Доброго времени суток. Пытаюсь запустить MicroSD карту совместно с МК STM32F103VCT6. Подключение по SDIO. Покопавшись в инете нашел...


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

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

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