Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SD карта
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Paramedic
Решил попробовать поработать с SD картой по 4-х битному параллельному интерфейсу, используя GPIO. Кто-нибудь это делал? Достаточно ли инфы из открытых документов? Может где-нибудь есть примеры на эту тему? Подскажите плз.
NickNich
Цитата(Paramedic @ Feb 22 2008, 16:50) *
Решил попробовать поработать с SD картой по 4-х битному параллельному интерфейсу, используя GPIO. Кто-нибудь это делал? Достаточно ли инфы из открытых документов? Может где-нибудь есть примеры на эту тему? Подскажите плз.

Вполне достаточно. Тут нужно понять, что подразумевается под "открытой документацией". Например, скачанного из инета SanDisk SD Card Product Manual, в котором аффтары практически полностью пересказали стандарт 1.01, достаточно чтобы сделать универсальный контроллер SD-карты.
aaarrr
Но лучше зайти на FTP и взять полный стандарт.
sergeeff
Уже многократно писалось на форуме, что "дерганье" ножками GPIO быстрее 0,9 us (микросекунд) не получается. Так что такой вариант 4-проводой реализации протокола обмена с SD - путь в никуда.
aaarrr
Цитата(sergeeff @ Feb 23 2008, 11:51) *
Уже многократно писалось на форуме, что "дерганье" ножками GPIO быстрее 0,9 us (микросекунд) не получается.

Где не получается - на всех-всех ARM'ах?

Цитата(sergeeff @ Feb 23 2008, 11:51) *
Так что такой вариант 4-проводой реализации протокола обмена с SD - путь в никуда.

Согласен. Подходит разве что для изучения интерфейса с целью последующей реализации в программируемой логике.
ГУ-49А
Цитата(sergeeff @ Feb 23 2008, 10:51) *
Уже многократно писалось на форуме, что "дерганье" ножками GPIO быстрее 0,9 us (микросекунд) не получается. Так что такой вариант 4-проводой реализации протокола обмена с SD - путь в никуда.

На быстром GPIO (FIO) очень даже получается дёргать даже каждые 5 тактов. И не просто дёргать, а выводить любые данные из памяти вплоть до 16 бит на сэмпл. И не просто выводить, а ещё и другими делами заниматься параллельно. При частоте процессора в 70 МГц (для некоторых LPC, например, LPC2101/02/03) это даёт тактовую частоту 14 МГц. Всё зависит от типа контроллера и конкретной задачи...
zltigo
Цитата(ГУ-49А @ Feb 23 2008, 17:05) *
а ещё и другими делами заниматься параллельно.

Никакими "другими делами" ни "параллельно", ни "перепендикулярно" при махании ножками на максимальной скорости Вы не заниматься будете.
Посему тупое махание четырьмя битами и реальная фоновая пересылка через SPI на максимальной скорости SD карточки ЦЕЛОГО БЛОКА ИНФОРМАЦИИ (даже, если этот блок 8bit, а не 16, как у большиства котроллеров, и SPI не поддерживается ни FIFO ни DMA) совершенно не сопоставимы по эффективности.
Цитата
Всё зависит от типа контроллера и конкретной задачи...

Да ничего не зависит, при наличии аппаратного SPI - без вариантов.
Цитата
для некоторых LPC, например, LPC2101/02/03

Для тех-же LPC переключаютесь в 16bit режим, заливаете FIFO под завязку и спокойно реально другими делами занимаетесь, А не пытаетесь изобразить диаграмму работы SD контроллера с данными, клоками и битовыми(не байтовыми!) потоками. Там никакие 14MHz и близко не лежат.
ГУ-49А
Цитата(zltigo @ Feb 23 2008, 16:38) *
Никакими "другими делами" ни "параллельно", ни "перепендикулярно" при махании ножками на максимальной скорости Вы заниматься не будете.
...Да ничего не зависит, при наличии аппаратного SPI - без вариантов.

Во-первых, позвольте поблагодарить вас за особую учтивость и толерантность ваших высказываний.
Во-вторых, я лишь указал на практическую возможность подобного подхода, не ставя под сомнение эффективность встроенной периферии.
В то же время, существуют случаи, когда всё же имеет смысл отказаться от аппаратного SPI в пользу его программной реализации (или параллельного доступа). Подобный случай я недавно приводил в ветке про быстрый тайминг FIO (необходимость ждать 7 тактов только для старта пересылки по SSP ведёт к увеличению кванта времени мультизадачности, в отличие от более гибкой программной реализации SPI с квантом в 3 такта).
zltigo
Цитата
Во-первых, позвольте поблагодарить вас за особую учтивость и толерантность ваших высказываний.

Имеет место быть недостаточность вышеупомянутого sad.gif sad.gif sad.gif, к моему глубочайшему сожалению.
Цитата(ГУ-49А @ Feb 23 2008, 18:01) *
Во-вторых, я лишь указал на практическую возможность подобного подхода

Практическая возможность махать ножками никем не отрицалась, обращалось внимание на банальную неэффективность такого подхода.
Цитата
В то же время, существуют случаи, когда всё же имеет смысл отказаться от аппаратного SPI в пользу его программной реализации (или параллельного доступа).

Вынужден напомнить, что на данный момент речь идет о совершенно конкретном применении.
Впрочем, я готов обсудить и другие "случаи".
Цитата
Подобный случай я недавно приводил в ветке про быстрый тайминг FIO (необходимость ждать 7 тактов только для старта пересылки по SSP ведёт к увеличению кванта времени мультизадачности...

7 тактов, для обращения к "обычной переферии" безусловно особой радости не приносит, но и печали тоже. По любому выигрыш 4x тактов с мотивировкой для уменьшения кванта мультизадачности выглядит абсолютно притянутым за уши, поскольку время реакции на прерывание + время шедулера + переключения контекстов имеют даже совсем другой порядок. А если к этому добавить возникающую и требующую, как правило, компенсации неатомарность операции ногомахательства, то все становится еще натянутее.
ГУ-49А
Цитата(zltigo @ Feb 23 2008, 18:10) *
7 тактов, для обращения к "обычной переферии" безусловно особой радости не приносит, но и печали тоже. По любому выигрыш 4x тактов с мотивировкой для уменьшения кванта мультизадачности выглядит абсолютно притянутым за уши, поскольку время реакции на прерывание + время шедулера + переключения контекстов имеют даже совсем другой порядок. А если к этому добавить возникающую и требующую, как правило, компенсации неатомарность операции ногомахательства, то все становится еще натянутее.

Мультитаск по таймеру - оно, конечно, так. Но я имел в виду другое: если "мультизадачность" реализована, что называется, вручную, простым перемежанием кода, и надо строго соблюдать тайминг высокоприоритетной задачи ("задача" в этом контексте скорее логическая сущность, в коде-то всё перемешано), то и 1 лишний такт может испортить нам картину. Взять, хотя бы, мой недавний случай - синхронный вывод в порт на фоне вывода в SPI. Есть там 3 варианта:
1) выводить в порт по таймеру (через FIQ) - мне не удалось и до 2 МГц тактовой добраться, на фоне 7-митактовых команд. В коде всё красиво, да результат не тот...
2) выводить в порт каждые 9 тактов, перемежая код и используя аппаратный SPI-вывод.
3) выводить в порт каждые 5 тактов, перемежая код и используя программно-эмулированный SPI.

Вот вам и разница.

Конечно, как уже писалось, идеологически более верным в таких случаях является выбор контроллера (и другого железа) с неким запасом производительности по отношению к данному ТЗ. Но! Это не означает, что все попытки "вопреки" выжать максимум из имеющегося более слабого (и дешевого!) железа подобным способом (пусть, извращённым) надо по-снобистски решительно отвергать.
ИМХО, более широкий спектр инженерных методов, наличие неординарных идей в голове - это залог более эффективного решения нетривиальной задачи. Как бы то ни было, можно много насоветовать в форуме по методологии, но конечный выбор всегда нужно делать самому...
zltigo
Цитата(ГУ-49А @ Feb 24 2008, 00:26) *
Есть там 3 варианта:

4) Использовать для синхронного порта SSP подпитываемого байтами за время, пока его FIFO не успеет опустошиться.
Цитата
...по отношению к данному ТЗ.

Очень инетесно, что там в оставшиеся от эмуляции многомегабитных синхронного порта и SPI, такт-другой сей контроллер "по TЗ" делает? Может вместо него со всем этим пару триггеров (утрирую) справились???
ГУ-49А
Цитата(zltigo @ Feb 23 2008, 23:55) *
4) Использовать для синхронного порта SSP подпитываемого байтами за время, пока его FIFO не успеет опустошиться.

Увы, но "подпитка" занимает 7 тактов, а поскольку подпитывать нужно постоянно, то это равносильно вышеописанному 2-му варианту, т.е. вывод в порт за 9 тактов вместо 5-ти...
Цитата(zltigo @ Feb 23 2008, 23:55) *
Очень интересно, что там в оставшиеся от эмуляции многомегабитных синхронного порта и SPI, такт-другой сей контроллер "по TЗ" делает? Может вместо него со всем этим пару триггеров (утрирую) справились???

Если Вы про мой случай, то во время вывода в порт и SPI он просто ещё другими "ногами дрыгает"... А так, вся основная его работа - это при поступлении EINTs. Весь вывод прекращается, и он решает, что делать дальше: заполняет данные для последующей генерации в порт и SPI. На рассыпухе совсем не хочется такое делать, уж поверьте... Впрочем, это темы топика не касается.
zltigo
Цитата(ГУ-49А @ Feb 24 2008, 14:28) *
Увы, но "подпитка" занимает 7 тактов, а поскольку подпитывать нужно постоянно, то это равносильно вышеописанному 2-му варианту, т.е. вывод в порт за 9 тактов вместо 5-ти...

За 9 тактов подпитываем 16-ю битами, т.е на передачу одного бита информации по SPI тратим 0,56 такта контроллера. Вместо 5*2 = 10 тактов. Так о чем мы это вообще разговариваем?
Цитата
На рассыпухе совсем не хочется такое делать, уж поверьте...

Не делайте, но зачем при этом и над контроллером, и главное, над собой издеватся?
ГУ-49А
Цитата(zltigo @ Feb 24 2008, 15:30) *
Так о чем мы это вообще разговариваем?

Что ж, давайте ещё раз напомню, в чём заключалась моя задача. Нужно было делать одновременно 2 вещи:
1) Выводить в порт FIO 16 бит информации;
2) Выводить в SPI по 8 бит данных.
Причём, выводить в порт FIO как можно быстрее (это приоритетная задача). Дык вот, если использовать аппаратный SSP, то пока мы кидаем в него данные, проходит 7 тактов, следовательно, мы не можем слать в порт FIO чаще, чем за 7+2 такта (2 идёт на сам вывод в порт), т.е. за 9 тактов. Если же мы используем программный SPI, то шлём эти биты вручную, да, менее эффективно, чем по SSP, но зато у нас появляется возможность выводить в FIO каждые 3+2 такта, т.е. за 5 тактов. Жертвуем при этом скоростью вывода в SPI (примерно 60 тактов за бит, что в моём случае полностью устраивает). Но куда важнее мне было получить максимальную скорость вывода в FIO, что я и сделал. Именно поэтому я и писал, что существуют те редкие случаи, когда целесообразнее использовать программный SPI, и в этом нет ничего страшного.

Если говорить о скорости передачи по SPI, то, например, программный параллельный 4-битный вывод за 5 тактов вполне окажется быстрее последовательного (и размер буфера можно уж поболее SSP-шного сделать). Нужно ли это автору этой темы - другой вопрос...
zltigo
Цитата(ГУ-49А @ Feb 24 2008, 17:06) *
Что ж, давайте ещё раз напомню,

Что значит еще раз? Впервые поминаются 16 ПАРАЛЛЕЛЬНО выводимых бит БЕЗ сопровождающего их клока. Впервые озвучивается, что скорость SPI (c БЫСТРОЙ эмуляции которого здесь, вынужден напомнить, все и началось,) значения не имеет. По преждему НИКАК не оговаривается, что делает контроллер, кроме махания ножками за пять тактов, но правда ранее звучало, что есть некие неназванные паузы в этой ногомахалке на подготовку данных. Короче, что имеем - некую вещицу, которая машет 18 ногами по заранее подготовленной порции данных, при этом две из 18 ног изображают некую последовательность совпадающуюю с кастрированным наполовну SPI интефейсом.
Собственно об SPI интерфейсе на самом деле речь и не идет sad.gif.
Цитата
...программный параллельный 4-битный вывод за 5 тактов ....

Уже обращал внимание - не за 5, а за 5*2, ибо данные на синхронных интерфейсах соопровождаются клоками. Клоки, естественно должны быть сдвинуты по фазе. Посему 5 тактов-записали данные + 5 тактов записали клок. Правда можно (но кривовато) старужи немножко рассыпухи навесить smile.gif, для сдвига фазы.
Цитата
....вполне окажется быстрее последовательного...

Не окажется ни при каких условиях. Цифры-бы хоть посмотрели sad.gif. Даже при тупой слепой и глухой передаче одного и того-же байта не окажется, не говоря уже о том, что при передаче надо еще назад читать и анализировать битовый, даже не байтовый поток.
GetSmart
Если передавать через SSP, то самая быстрая передача 16-битного слова займёт 32 такта. Процессор потратит на неё 3+7 тактов. FIFO буфер имеет 8 слов и максимальное свободное время, которое можно выиграть при этом = 32*8 - 10*8 = 176 тактов. В реале может быть 120..150. При этом можно выполнять полноценную программу с прерываниями на вывод данных через SSP.

ГУ-49А, это не "Ваш" случай. Ваш метод здесь однозначно проигрывает. Не спорю, у него есть "право на жизнь", но только когда единственное его достоинство выше множества всех недостатков.
ГУ-49А
Цитата(zltigo @ Feb 24 2008, 17:49) *
Что значит еще раз? .... Собственно об SPI интерфейсе на самом деле речь и не идет sad.gif.

Постараюсь быть кратким. Действительно, я подробно всё не описал. По той причине, что, как я полагал, с вашей стороны был только праздный интерес к моей уже реализованной задаче, и никакие серьёзные обсуждения именно моего случая не планировал.
Цитата(zltigo @ Feb 24 2008, 17:49) *
Правда можно (но кривовато) старужи немножко рассыпухи навесить smile.gif, для сдвига фазы.

По идее, можно ещё запустить стробо-клок на выходах MATx.y таймера, со двигом пару тактов. Но это так, досужие размышления...

Цитата(GetSmart @ Feb 24 2008, 18:27) *
ГУ-49А, это не "Ваш" случай. Ваш метод здесь однозначно проигрывает. Не спорю, у него есть "право на жизнь", но только когда единственное его достоинство выше множества всех недостатков.

С этим полностью согласен. Я лишь "протестовал" против этого:
а) ..."дерганье" ножками GPIO быстрее 0,9 us (микросекунд) не получается.
б) ...Да ничего не зависит [от типа контроллера и конкретной задачи], при наличии аппаратного SPI - без вариантов.
zltigo
Цитата(ГУ-49А @ Feb 24 2008, 20:35) *
С этим полностью согласен. Я лишь "протестовал" против этого:
...
б) ...Да ничего не зависит [от типа контроллера и конкретной задачи], при наличии аппаратного SPI - без вариантов.

По пункту a) - это не мое утверждение, по б) - совершенно БЕЗ ВАРИАНТОВ и не надо всякие оговорочки в квадратные скобки вставлять - речь шла и идет о реализации на махании ножками КОНКРЕТНОЙ задачи - функций SD контроллера.
KAlex
Цитата(Paramedic @ Feb 22 2008, 16:50) *
Решил попробовать поработать с SD картой по 4-х битному параллельному интерфейсу, используя GPIO. Кто-нибудь это делал? Достаточно ли инфы из открытых документов?

У меня есть дока "Product ManualSDCardv2.2final" от 29.07.05 , 2.2метра. Делал все по ней, все работает, неточностей не обнаружено. Выложить?
Vitaliy_ARM
Цитата(KAlex @ Feb 25 2008, 12:38) *
У меня есть дока "Product ManualSDCardv2.2final" от 29.07.05 , 2.2метра. Делал все по ней, все работает, неточностей не обнаружено. Выложить?


Давайте, посмотрим smile.gif
KAlex
Цитата(Vitaliy_ARM @ Feb 25 2008, 13:31) *
Давайте, посмотрим smile.gif
Paramedic
Спасибо за ответы, не ожидал что такая дискуссия получится :)
На самом деле ситуация именно такова, что аппаратный SPI занят и требуется сгородить что-то максимально быстрое путём дёрганья ножек из программы, поэтому и остановился на четырёхбитном режиме.
А подсчёт CRC можно выключить в четырёхбитовом режиме? Команда вроде бы такая есть...
zltigo
Цитата(Paramedic @ Feb 26 2008, 09:15) *
На самом деле ситуация именно такова, что аппаратный SPI занят и..

На самом деле, аппаратный SPI занятым быть почти не может smile.gif посадите карточку параллельно уже имеющимуся SPI девайсу на свою софтовую выборку и все. По любому, если будете время на дергание ножками тратить, то особо использовать в это время имеющиеся SPI-и целей не удастся.
Paramedic
Цитата(zltigo @ Feb 26 2008, 10:39) *
На самом деле, аппаратный SPI занятым быть почти не может :) посадите карточку параллельно уже имеющимуся SPI девайсу на свою софтовую выборку и все. По любому, если будете время на дергание ножками тратить, то особо использовать в это время имеющиеся SPI-и целей не удастся.

Ну не совсем так. На аппаратном SPI висит аудио-кодек с весьма загруженным потоком данных, к тому же являющийся на шине мастером. А SD карта будет, естественно, слэйвом...
zltigo
Цитата(Paramedic @ Feb 26 2008, 10:50) *
На аппаратном SPI висит аудио-кодек с весьма загруженным потоком данных...

А что есть чипы с одним единственым SPI интерфейсом на борту? Меньше двух как-то не встречал - очень странно.
Paramedic
Цитата(zltigo @ Feb 26 2008, 11:48) *
А что есть чипы с одним единственым SPI интерфейсом на борту? Меньше двух как-то не встречал - очень странно.

Есть такие. Из армов, например, AT91SAM7L64. В конечом итоге можно, конечно, перепрыгнуть на контроллер с двумя SPI...
zltigo
Цитата(Paramedic @ Feb 26 2008, 11:58) *
В конечом итоге можно, конечно, перепрыгнуть на контроллер с двумя SPI...

Ну поскольку у Вас, полагаю, кодек не просто так в никуда поток гонит, то перепрыгнуть может нужно не только на контроллер со вторым SPI, но и с железным SD контроллером на борту. Благо такие уже не совсем редкость.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.