12.08.2010

MicroSD shield (1)

Попытки интегрировать в Arduino поддержку SD-карт начались достаточно давно, и давно же увенчались успехом. Пусть вас не смущает обилие элементов на новой Ethernet Shield - ничего сложного в этом нет.

Я решил разобрать технологию доступа к SD на примере изделия libellium-а - известной испанской фирмы, занимающейся разработками в области мониторинга состояния окружающей среды. К счастью, одной из побочных ветвей их деятельности является Arduino и все с ним связанное. Их microSD шилд выглядит так:



Как видите, ничего хитроумного в этом шилде - нет. При подключении SD-карты к Arduino надо помнить пару моментов:
  1. Питание карты - 3.3В;
  2. Обмен происходит по шине SPI, требуется согласование сигналов по уровням.
Поддержка SPI в контроллерах ATmega совпадает по пинам с разъемом внутрисхемного программирования, так что можно подключаться к digital 10-12. Теоретически, питание +3.3В можно брать с питающей колодки Arduino Duemilanova, но тут, на мой взгляд, сложилась парадоксальная ситуация - хотя во многих платах и клонах Arduino пин трехвольтового питания присутствует, все шилды в обязательном порядке забивают игнорируют эту возможность и используют свой собственный регулятор +3.3В. 

Для работы надо соединить две линии сигналов данных (MISO/MOSI), тактовые (SCK) и выбор приемника (SS). Правда, тут нас ждет небольшая проблема согласования сигналов по уровням. 

Как известно, в Arduino мы имеем дело с КМОП-логикой, управляемой напряжением - один уровень соответствует логическому нулю, другой - логической единице. Реально же, при определении состояния входа КМОП, логические уровни зависят от напряжения питания, граница проходит по Vcc/2. И действительно, если мы обратимся к документации, то увидим, что логической единицей для ATmega будет напряжение более 2,5 В, а нулем - менее 2,5 В (естественно, при Vcc=5В). И в то же время, при работе в качестве выхода, КМОП будет формировать для логической единицы напряжение близкое к Vcc, а для нуля - к GND.

У работающего в SD-карте трехвольтового КМОП-а на выходе формируется логическая единица с уровнем = Vcc = 3,3В, что больше 2,5В и будет правильно восприниматься пятивольтовым входом. Но пятивольтовая единица на трехвольтовом входе крайне нежелательна, поэтому надо изыскать способ преобразовать ее в диапазон 1,65..3,3 В. Конечно, на эту тему существует обширнейшее семейство чипов, которые "в лучшем виде" организуют такие преобразования, но они в данном случае не потребуются. Для относительно невысоких скоростей обмена, можно прибегнуть к тривиальному делителю напряжения на резисторах

Я взял на себя смелость перерисовать схему устройства, тем более, что там всё просто:



Увы, я не смог идентифицировать чип в корпусе SOT23-5, хотя это явно регулятор напряжения. На нем написано "PHUI", и ни один из справочников по SMD о такой комбинации не знал. Пришлось его заменить на близкий по смыслу и корпусу NCP1400 (чип IC1 по схеме).

Updated: чип этот все-таки удалось идентифицировать - это LP2985-33BVR! Более подробно - здесь.

Делители напряжений на плате представляют пары SMD-резисторов 10K/15K - R3/R4, R5/R6 и R2/R7. Кроме сигналов SPI, слот SD-карты умеет сообщать о наличии в нем карты (сигнал CD), и этот дополнительный сигнал притянут к Vcc через R1, поскольку представляет из себя простой механический контакт, разрываемый во время вставки карты. Конденсаторы C1 и C2 выступают в качестве фильтров по питанию.

Само питание на плату подается двумя разными способами:
  1. С цифрового пина digital8 (не так уж много microSD надо для работы)
  2. C гребенки ICSP



Переключение осуществляется джампером JP4, в позиции 1-2 он подает на вход IC1 напряжение с digital8, в позиции 2-3 - со 2-го контакта разъема IСSP-6:



Дополнительная колодка JP5 (сигналы CD и SS) нужна в двух случаях:
  1. При подключении через ISP-6 (место SS занял необходимый для программирования RESET, а места для сигнала CD уже и вовсе нет);
  2. При подключении к Arduino Mega (там пин SS находится в другом месте).
При этом, линии +5В, +3.3В и GND выводятся на JP2 - просто так, на всякий случай.

Картинки вариантов подключения:





Можно использовать пин-экстендер:



В этом случае можно подключаться игнорируя шилд, у которого не заняты колодки digital 13-8, типичный пример - Arduino Motor Shield:



1 комментарий: