Easyelectronics.ru

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

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



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

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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf,
я так немного понимаю что к чему, DMA, прерывания,
просто истерика!, зачем вылаживать драйверы в которых нужно перелопатить весь код и без опыта программирования смотришь как баран на новые ворота!
Я вижу что в драйвере что я скачал инициализируется только 1 канал DMA, значит выигрыш скорости не может быть!? Обработчиков и вовсе не видно и отладчик в них не заходит!

*tempbuff = (uint32_t *)readbuff; //

Указатель на "мой" буфер и правда переделывают в другой указатель на uint32_t, правильно я понял?
Все равно насчитываю только 256 байт во всем этом цикле (Polling).

RXOVERR флаг и правда высвечивается, по-моему он даже не сбрасывается, хотя в драйвере предусмотрен сброс этого и всех флагов...

Мне показывается что регистр FIFO - 32 разрядный,а не 32х32, я с вами не спорю, однако как берутся нужные данные? В программе стоит строчка
return SDIO->FIFO; // Возвращает значение FIFO, как узнаёт какой именно из 32 FIFO?


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 598
Откуда: Nowhere
MIG29 писал(а):
я так немного понимаю что к чему, DMA, прерывания, просто истерика!,

DMA и прерывания нужны для того, чтобы данные успели вычитываться/передаваться. Для начала стоит разобраться с более простым вариантом - polling. Когда он будет уверенно работать, тогда можно и "ускоряться" через DMA.

MIG29 писал(а):
Я вижу что в драйвере что я скачал инициализируется только 1 канал DMA, значит выигрыш скорости не может быть!? Обработчиков и вовсе не видно и отладчик в них не заходит!

Для передачи или приема данных по SDIO как раз и нужен один канал DMA (на прием или на передачу). Почему обрабочтиков "не видно" - судить трудно, код далеко...

MIG29 писал(а):
*tempbuff = (uint32_t *)readbuff; //
Указатель на "мой" буфер и правда переделывают в другой указатель на uint32_t, правильно я понял?
Все равно насчитываю только 256 байт во всем этом цикле (Polling).

Да, указатель приводится к 32-битному, т.к. данные из FIFO читаются порциями по 4 байта. Как получается значение 256?

MIG29 писал(а):
Мне показывается что регистр FIFO - 32 разрядный,а не 32х32, я с вами не спорю, однако как берутся нужные данные? В программе стоит строчка
return SDIO->FIFO; // Возвращает значение FIFO, как узнаёт какой именно из 32 FIFO?

FIFO - это стек. Регистр SDIO_FIFO указывает на этот стек. Пишем в него - значение кладется в стек. Читаем - значение забирается. Стек из 32-и 32-битных значений. Карта присылает 4 байтика, периферия SDIO кладет это дело в стек. Карта присылает еще 4 байтика, периферия кладет в стек. Программа читает SDIO_FIFO - получает первые 4 байта, читает еще раз - следующие. Если стек заполнился - значит караул, мы читаем данные из этого стека медленнее, чем карта их присылает. Возникает ошибка OVERRUN. Если такое происходит - надо думать над оптимизацией кода либо уменьшать скорость обмена с картой. Либо использовать DMA (чтобы байтики максимально быстро без участия программы летали из FIFO в память).


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

Зарегистрирован: 11 окт 2013, 01:46
Сообщения: 234
И еще хочу внести свои 5 копеек по поводу "ускорения через DMA"

DMA - очень хитро отделен от основного потока вычислений.
Polling и Interrupt они все равно внутри себя делают что-то вроде
Код:
for( i=0; i<bufSize; i++){
    mem[i] = anotherMem[i];
}
Каждая эта операция крадет у нас драгоценные тики камня.
DMA мы говорим примерно следующее - "Когда тебя будут дергать, клади из адреса 1 в адрес 2" и забываем про это. Тики на все эти операции копирования не расходуются. Как только DMA выполнил указанное количество копирований, так сразу он об этом сообщит своим прерыванием. А пока он это делает, мы "спасаем мир" )))))

Лично для меня сразу возникает вопрос - при каком количестве данных я получу экономию на тиках?! Если надо скопировать 1 байт, то как бы что включение DMA займет больше тиков, чем простое a = b. Если надо переслать (например) 10+ байт, то тогда наверное стоит задуматься о применении DMA.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
- Как получается значение 256?

Код:
if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET)
      {
        for (count = 0; count < 8; count++)
        {
          *(tempbuff + count) = SDIO_ReadData();// return SDIO->FIFO;
        }
        tempbuff += 8;
      }


8 раз записывается из FIFO... 8х4 байт?

Отлично, я понял FIFO это стэк и с него автоматически снимаются данные =)

Upd:
А все =) я понял, 8 раз по 4 байта, и всё это повторяется пока FIFO не пустой.
Странно, а что если в FIFO каким-либо образом окажется (в общей сложности) меньше 512 байт (принятых от флешки). Тогда в "мой" буфер попадут нули или мусор...!?

С другой стороны флаг RXFIFOHF исчезнет... ну ладно, пока приму на веру =)


Последний раз редактировалось MIG29 22 июн 2015, 04:52, всего редактировалось 2 раз(а).

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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Hamper, да спасибо, я это понимаю, что только большие обьемы данных лучше пересылать.
В рассматриваемом драйвере используется 1 канал DMA, я думал это можно делать двумя и даже более каналами...

Моя практическая задача такая, что полученные данные нужно еще немного и обработать (отсортировать),
если получится чтобы DMA это делал, тогда будет круто, если нет, то боюсь быстрее будет классическим методом с исп. процессора...

Преобразования данных примерно такое , что будет не обычный буфер-массив, а двумерный... Определенные байтики должны лечь правильно... и как можно быстрее =).


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

Зарегистрирован: 11 окт 2013, 01:46
Сообщения: 234
Нет! DMA точно ничего и никогда сортировать не будет!!!!
DMA - это Плюшкин, который тупо из одной сумочки в другую перекладывает.
Оптимизация тут может быть только одна - пока DMA складирует очередной буфер, можно в основном цикле заниматься раскладкой предыдущей порции данных.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Hamper, да, или так как вы щас написали, гибридный DMA-процессорный метод...
А может можно использовать переменные для указания "куда" копировать в настройке ДМА. Или же зайдествовать 2 канала с разными настройками? Я ни разу не пользовался этим ДМА.....=(


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

Зарегистрирован: 11 окт 2013, 01:46
Сообщения: 234
MIG29 писал(а):
А может можно использовать переменные для указания "куда" копировать в настройке ДМА.

Ну так ведь он именно так и запускается!

Что надо для работы DMA:
- Адрес источника
- Адрес, куда копировать источник (приемник)

Дальше идут нюансы:
На каждом такте копирования:
- Количество пересылаемых данных - 1 или 2 байта
- Надо ли инкрементировать адрес источника
- Надо ли инкрементировать адрес приемника

Еще глубже:
- Использовать ли FIFO
- При переполнении приемника что делать - ошибка или зациклить.

Осталось только выбрать, кто и как будет "дергать" DMA, чтобы он понимал, что ему надо сделать очередную операцию.

Я еще раз повторюсь - DMA ничего сортировать не будет! Он просто перекладывает из одного места в другое. Весь кайф DMA в том, что для перекладывания не используется процессорное время. Больше никакого кайфа в DMA нет.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Попробовал другой драйвер sdiosd.c . Они все на одно лицо, только с небольшими изменениями.

Кто нибудь может обьяснить почему команда не проходит?
Инициализация карты и периферии - ОК. А когда использую функцию чтения блока то первым делом посылается команда "0x10" (задать размер блока). Эта команда сразу после отправки показывает флаг CTIMEOUT, что по документам значит таймаут ожидания ответа на команду... Флаг выставляется моментально после установки команды в CMD регистр, это видно на картинке. Я так понимаю что отладчик тормозит МК , но не тормозит модуль SDIO и тот моментально все обрабатывает пока я клацаю мышью на кнопку "следующий шаг". Я пробовал и без отладчика, команда явно не проходит.
Структура отправки команды вроде заполнена правильно. Подскажите решение =( а то я так замучался с этим драйвером...


Вложения:
Комментарий к файлу: CTIMEOUT flag.
CTIMEOUT: Command response timeout
The Command TimeOut period has a fixed value of 64 SDIO_CK clock periods.

TimeOut.jpg
TimeOut.jpg [ 247.51 Кб | Просмотров: 10812 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 23 июн 2015, 22:11 
Старожил
Аватара пользователя

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 598
Откуда: Nowhere
После установки бита CPSMEN в CMD регистре карта отсылает команду и ждет ответа в течении 64 тактов SDIO. Если ответа нет, выставляется флаг CTIMEOUT.
Почему карта не отвечает на установку размера блока (CMD16) - вопрос, который удаленно решить сложно. CMD16 - это обязательная команда, даже залоченная карта должна ее отработать. Но также есть условие, что карта должна быть в "Transfer state", чтобы воспринять эту команду. Для SDHC карт для чтения/записи CMD16 вообще нет необходимости подавать (блок фиксирован на 512 байт). Для SDSC эту команду достаточно один раз после инициализации карты дать, каждый раз перед чтением/записью - лишнее.
И что-то мне подсказывает, что таки на этапе инициализации карты что-то не так. Повторюсь в который раз: CSD/CID регистры карты читаются верно? объем правильно определяется?


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf, ок, посмотрю на эти регистры SCD. Я понимаю что размер блока установить 1 раз можно. Специально ничего не трогаю в драйвере, чтобы понять как устроено.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf,
Что-то не получается=(. Инициализация показывает тип карты SC v1 (флешка у меня 1Гб). После инициализации команды CMD16 (размер блока) или CMD13 (статус карты) не хотят отвечать и высвечивается TimeOut. Я пробовал понизить скорость тактирования флешки, не помогло(. CID и СSD регистры пишут всякие значения.


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 598
Откуда: Nowhere
MIG29 писал(а):
CID и СSD регистры пишут всякие значения.

Этта пять! Я почему и спрашивал несколько раз про корректность определения объема карточки, ибо эта цифра расчитывается из CSD регистра и, если он прочитан неверно, то и объем карты будет отфонарным.

MIG29 писал(а):
После инициализации команды CMD16 (размер блока) или CMD13 (статус карты) не хотят отвечать и высвечивается TimeOut.

Я уже ничего не понимаю... CMD16 сработает только если карта в режиме transfer, иначе даст ошибку (но не timeout). CMD13 вообще в любое время должно работать. Если инициализация проходит успешно, но потом валятся таймауты... Карта нормально RCA отдает, может с ним косяк какой?
И таки да, банальный вопрос: а если другую карту попробовать?


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

Зарегистрирован: 11 окт 2013, 01:46
Сообщения: 234
Извините, не следил за ходом дискуссии, но буквально вчера тоже убил весь день на SD-карточку. Долго шаманил, пока наконец не сдался и не прикрутил подтяжку к +3.3 , как указано на STM-форуме - все заработало на ура.
https://my.st.com/public/STe2ecommuniti ... tviews=445
Пост почти в самом конце от clive1
На схеме указаны резюки на 47К, в разных источниках встречал цифры от 10К до 47К. Поставил у себя на 31К - полет отличный.
Изображение


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 598
Откуда: Nowhere
Hamper писал(а):
пока наконец не сдался и не прикрутил подтяжку к +3.3

Это стандартные грабли. Если карточка работает по SPI, то подтяжки не нужны, а если SDIO, то обязательны, спецификация говорит о диапазоне 10..100к (зависит от индуктивности линий). Плюс надо помнить, что на D3 внутри карты есть подтяжка (порядка 50к, но зависит от самой карты) и либо на эту линию подтяжку вешать не надо, либо подтяжку надо выключать (есть команда для этого). А народ часто берет всякие шилдики, расчитанные на SPI и тулит их к SDIO, результат немного предсказуем.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf,
Этот экземпляр карточки работал в компьютере и телефоне. И накануне я связывался с ней по SPI с другого чипа. Все работало, за исключением диких лагов чипа или карты памяти, предварительно глюки были из-за плохого питания. Теперь я выбрал другой чип с SDIO и поставил lc-фильтры (не знаю правильно ли).

Перезалил! Пардон, какая-то дичь отскриншотилась).


Вложения:
CID_CSD.jpg
CID_CSD.jpg [ 179.05 Кб | Просмотров: 10658 ]
CID.jpg
CID.jpg [ 102.19 Кб | Просмотров: 10658 ]


Последний раз редактировалось MIG29 27 июн 2015, 06:17, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SDIO interface for SD card
СообщениеДобавлено: 27 июн 2015, 06:06 
Только пришел

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Hamper, спасибо, подтяжки были предусмотрены на 11 К ом. Один резистор был недопаян, но это никак не изменило ситуацию.


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
Команда 13 (Card Status) проходит. Я не правильно писал аргумент...
Возвращает ответ R1. Первые 3 бита выставлены. Они описаны:
№2 - reserved for application specific commands.
№1, 0 - reserved for manufacturer test mode.

Добавил команду CMD7 (SELECT/DESELECT_CARD). После этого заработала CMD16 (SET_BLOCKLEN), CMD17 (READ_SINGLE_ BLOCK).
Простите, я как новичок, даже не подумал что нужно выбирать карту, думалось что само наличие RCA (Relative Card Address) предполагает что карта уже "выбрана".

...А дальше зависает в каком-то цикле. Буду разбираться теперь с обработкой буфера , прерываниями, DMA. Я теперь должен сделать обработчик прерывания от SDIO и настроить NVIC (Nested vectored interrupt controller) ?


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
После подачи команды CMD17 (READ_SINGLE_BLOCK) выставляется флаг DTIMEOUT.
Отладчик ST-Link v2 не тормозит процесс тактирования флешки от SDIO модуля, флаг срабатывает на следующий же шаг после отправки команды!

-Инструмент торможения есть? Как, например, для таймеров!
-Если бы данные поступили, флаг выставился бы RXOVERR (переполнение приемного буфера)?
-Почему появляется DTIMEOUT?

Я уже пробовал вытянуть код из STM32F10x_StdPeriph_Lib_V3.5.0. Даже скомпилировать не получается, он связан с отладочными платами? Косяк на косяке, не обьявленные макросы, функции...


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

Зарегистрирован: 17 дек 2014, 23:08
Сообщения: 598
Откуда: Nowhere
MIG29 писал(а):
Команда 13 (Card Status) проходит. Я не правильно писал аргумент... Добавил команду CMD7 (SELECT/DESELECT_CARD). После этого заработала CMD16 (SET_BLOCKLEN), CMD17 (READ_SINGLE_ BLOCK). Простите, я как новичок, даже не подумал что нужно выбирать карту, думалось что само наличие RCA (Relative Card Address) предполагает что карта уже "выбрана".

Ну вот, уже прогресс :) На SDIO шине может быть много устройств (и не только SD карточки), поэтому для обращения к конкретному нужен адрес, что и наблюдалось здесь: карта просто игнорировала запросы. CMD7 переводит карту в режим transfer, когда уже можно читать/писать блоки. Если же дать CMD7 с неверным RCA адресом, то карта перейдет в режим stand-by. Так же CMD7 с RCA равным нулю будет означать перевод всех устройств на шине в stand-by.

MIG29 писал(а):
-Инструмент торможения есть? Как, например, для таймеров!
-Если бы данные поступили, флаг выставился бы RXOVERR (переполнение приемного буфера)?
-Почему появляется DTIMEOUT?

- "Инструмент торможения" - отключение клока SDIO, но это не совсем то, "что для таймеров".
- Если бы данные поступили и забили FIFO буфер, то да, должен был бы появиться OVERRUN флаг.
- DTIMEOUT выставляется тогда, когда SDIO_DTIMER становится равным нулю. Это таймаут счетчик, который задается в клоках SDIO. По спецификации SD для чтения таймаут рекомендован 100мс и 250мс для записи. Чтобы верно заполнить SDIO_TIMER, надо узнать длительность клока SDIO и подобрать значение, чтобы получилась нужная задержка. Ну или вбить максимально возможное значение, чтобы SDIO тупил до последнего :)


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

Зарегистрирован: 06 апр 2014, 21:51
Сообщения: 26
LonelyWolf,
Увеличил время с 0xFFFFF (10 000) до 0xFFFFFFFF. Выставился флаг STBITERR (Start bit not detected on all data signals in wide bus mode).

Хрен редьки не слаще(.

100 мс , это вы меня разочаровали, мне нужно быстренько все делать.


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

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 343
Откуда: г.Таганрог/г.Геленджик/г.Одесса
Прочитал всю тему и голова пошла кругом. Нужна нормальная библиотека для SDIO с DMA на STM32F103. Сейчас у меня работает на поллинге плюс когда-то я выпилил из библиотек все, не относящееся к этому самому поллингу, надо было быстро запустить. Теперь хочу переделать по нормальному, повысить скорость чтения. Использую карточку с Fat32 и библиотеку чана. Кто делал подобное и что получилось?))

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2311
Я делал подобное - все получилось.
Даже при тактировании 25 МГц успевает звук играть, да ещё громкость регулировать воспроизведения wаv-файла (работа с типом float - каждый сеймпл умножаем на коэффициент)

http://www.youtube.com/watch?v=eSwLndtOFJ8

тут под видео ссылка есть на проек
http://www.youtube.com/watch?v=EYs3f4uwYTo

но я после исправил кое что при воспроизведении звука, но вам работа с SDIO нужна - её я не трогал


For STM32F103RET6 chip https://yadi.sk/d/9ZHLmTyYe77TL for STM32F4Discovery board https://yadi.sk/d/hBvA9YvyER3Sn


Вот инициализация
SD_Error SD_Init(void)
{
SD_Error errorstatus = SD_OK;

/* SDIO Peripheral Low Level Init */
SD_LowLevel_Init();

SDIO_DeInit();

errorstatus = SD_PowerON();

if (errorstatus != SD_OK)
{
/*!< CMD Response TimeOut (wait for CMDSENT flag) */
return(errorstatus);
}

errorstatus = SD_InitializeCards();

if (errorstatus != SD_OK)
{
/*!< CMD Response TimeOut (wait for CMDSENT flag) */
return(errorstatus);
}

/*!< Configure the SDIO peripheral */
/*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */
SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
SDIO_Init(&SDIO_InitStructure);

if (errorstatus == SD_OK)
{
/*----------------- Read CSD/CID MSD registers ------------------*/
errorstatus = SD_GetCardInfo(&SDCardInfo);
}

if (errorstatus == SD_OK)
{
/*----------------- Select Card --------------------------------*/
errorstatus = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
}

if (errorstatus == SD_OK)
{
errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);
}

/* Set Device Transfer Mode to DMA */
if (errorstatus == SD_OK)
{
errorstatus = SD_SetDeviceMode(SD_DMA_MODE);
}

return(errorstatus);
}


Но посношаться пришлось!

Я выкинул проверку пина присутствия карты и явно указал размер блока для чтения 512 байт в
disk_read () - иначе не работало!
Так что Вы предупреждены, возможны грабли из-за этого

DRESULT disk_read (
BYTE drv, /* Physical drive nmuber (0..) */
BYTE *buff, /* Data buffer to store read data */
DWORD sector, /* Sector address (LBA) */
BYTE count /* Number of sectors to read (1..255) */
)
{
SD_Error Status;
if( !count )
{
return RES_PARERR; /* countІ»ДЬµИУЪ0Ј¬·сФт·µ»ШІОКэґнОу */
}

switch (drv)
{

case 0:
if(count==1) /* 1ёцsectorµД¶БІЩЧч */
{
Status = SD_ReadBlock( buff ,sector << 9 , 512/* SDCardInfo.CardBlockSize*/ );
}
else /* ¶аёцsectorµД¶БІЩЧч */
{
Status = SD_ReadMultiBlocks( buff ,sector << 9 ,512/*SDCardInfo.CardBlockSize*/,count);
}
if(Status == SD_OK)
{
return RES_OK;
}
else
{
return RES_ERROR;
}

case 1:
break;

case 2:
break;

default:
break;

}

return RES_ERROR;
}


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

Зарегистрирован: 28 сен 2012, 22:11
Сообщения: 343
Откуда: г.Таганрог/г.Геленджик/г.Одесса
Спасибо, вечером с работы приду, покопаюсь)

_________________
Количество полученного опыта прямо пропорционально выведенному из строя оборудованию....


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

Зарегистрирован: 26 апр 2011, 23:07
Сообщения: 18
Откуда: Чебоксары
Доброго времени суток, тоже дошел до работы с SDIO на замену SPI и тоже столкнулся с проблемой, причем даже на начальном этапе. Вязать FatFs не планирую, нужна именно быстрая линейная запись. Взял пример от STM (тут выкладывался, но приклею еще раз
Вложение:
Комментарий к файлу: либа
SDIO.rar [23.24 Кб]
Скачиваний: 194
). Кристалл STM32F103RCT6.
Суть проблемы:
Валится в ошибку SD_ILLEGAL_CMD сразу после функции SD_Init();
Код:
SD_SetDeviceMode(SD_POLLING_MODE);
SD_ProcessIRQSrc();
while(1)
{
   Delay();
   Status = SD_Init();
   Status = SD_GetCardInfo(&SDCardInfo);
}

Валится где-то здесь:
Код:
if (errorstatus == SD_OK)
  {
    SDType = SD_HIGH_CAPACITY; /* SD Card 2.0 */
  }
  else
  {
    /* CMD55 */
    SDIO_CmdInitStructure.SDIO_Argument = 0x00;
    SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
    SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
    SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
    SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
    SDIO_SendCommand(&SDIO_CmdInitStructure);
    errorstatus = CmdResp1Error(SDIO_APP_CMD);
  }
  /* CMD55 */
  SDIO_CmdInitStructure.SDIO_Argument = 0x00;
  SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
  SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
  SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
  SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
  SDIO_SendCommand(&SDIO_CmdInitStructure);
  errorstatus = CmdResp1Error(SDIO_APP_CMD);

  /* If errorstatus is Command TimeOut, it is a MMC card */
  /* If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)
     or SD card 1.x */

Но самое парадоксальное в том, что если пройти код по шагам в дебаге, то всё нормально, инициализация проходит и CID вычитывается и статус SD_OK, а вот если запустить сразу и остановить дебаг сразу после SD_Init();, то SD_ILLEGAL_CMD.
Может кто подскажет что я делаю не так ?) Карты разные пробовал (2гб и 16гб), подтяжки есть, слот уже заменил на другой и провода укоротил до безобразия, осциллограф никаких завалов и просадок не показывает, да он так и на номинальные 25мгц не успевает выйти, на 400кгц это происходит еще. Пишу к кокосе.


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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