Перейдем к программной части. Сначала нам нужно инициализировать контроллер. Для этого линии PA0 - PA2 порта PA программируем на выход, линии PD4 - PD6 - на вход, линии PF0 - PF2 порта PF - на вход АЦП. Сигналы на используемые линии портов PB, PC и PE подаются, когда возникают внешние прерывания (для порта PC), инициируется чтение/запись на карту памяти (порт PC) или обмен данными по каналу USART(порт PE).
Рассмотрим, как инициализировать карту, и писать/читать из нее. Для перехода в режим SPI нужно дождаться, пока питающее напряжения на карте достигнет 3В (несколько миллисекунд, после включения) и подать более 74 импульса на выводе SCK, при высоком уровне на SS и MOSI выводах
. После нужно выставить на SS
нулевой уровень, далее карта входит в режим SPI, теперь для успешной работы следует подать команды сброса и инициализации CMD0, CMD1прежде, чем мы сможем писать/читать данные из карты. Команд для карты довольно много, часть из них приведена в таблице ниже:
Команд много, но основанная масса работы производится командами CMD0, CMD1
(сброс и инициализация) CMD17
(чтение), CMD24
(запись).
Рассмотрим формат команды для SD карты.
Сперва идет индекс команды. Индекс команды в десятичном виде определяется как 64+имя команды
. Далее следует 4 байта аргументов (данные, адрес), после следует 7-ми битная контрольная сумма. После успешной отправки команды следует послать байтовую паузу из 8*N тактовых импульсов (N - целое), после чего карта ответит. Ответ может быть типа R1,R2,R3
. В нашем случае, ответы будут только типа R1
. Поэтому рассмотрим только его.
Старший бит R1
всегда равен 0. Назначения остальных битов хорошо видно с рисунка.
Рассмотрим процесс инициализации карты памяти командами CMD0, CMD1
. Сперва, при высоком уровне на выводах SS
и MOSI
подаем 80 тактовых импульсов на вывод SCK
. Далее на все время работы с картой сажаем SS
на землю, подаем команду CMD0
, контрольная сумма для которой равна 0x95
(контрольная сумма в нашем случае нужна только для команды CMD0
, в остальных случаях она не проверяется, поэтому все время будем использовать 0х95 как контрольную сумму). Далее, после байтовой паузы, карточка должна ответить 0х01, что означает, что она вошла в SPI режим и готова принимать команды. Теперь подаем команды CMD1
, и после паузы ожидаем от карточки ответа 0х00, которые говорит о том, что карта готова к обмену данными.
Обмен данными между картой памяти и микроконтроллером будет производиться стандартными блоками по 512 байт. Адресация карты побайтная, начиная с нуля, но считывать данные можно только блоками. Адресом блока служит первый его байт. То есть 0-й блок имеет адрес 0х0000, 1-й блок - 0х0200, 2-й блок - 0х400 и т.д. (справедливо для размера блока 512 байт). В SDHC картах адресация поблочная, адресом блока служит его номер. Операция чтения блока производится в следующем порядке. Подается команда CMD17
, байтовая пауза, если принимается ответ 0х00, то после еще одной байтовой паузы принимается блок данных, структура которого показана ниже.
Некое подобие временной диаграммы операции чтения можно посмотреть на рисунке ниже
Как видно, блок начинается с байта 0хFE (для команд CMD17/18, CMD24
), далее идет 512 байт информации и 2 байта контрольной суммы (которая по умолчанию не используется). Операция записи производиться похоже, команда CMD24
Внедрение технологии спектрального уплотнения на участке ст. Свердловск – ст. Тюмень
В последние два десятилетия прошедшего и в начале текущего века
происходит смена эпохи индустриально-технологического развития передовых
государств эпохой и ...
Цифровой КИХ-фильтр для частотной селекции измерительных сигналов
Цифровой фильтр (ЦФ) - устройство, пропускающее, либо подавляющее заданные в цифровой форме сигналы в определенной полосе частот. В отличие от аналоговых фильтров, у кото ...
Построение телефонной сети малого предприятия на программной АТС Asterisc
В настоящее время телекоммуникационные технологии находятся на столь высоком
уровне развития, что внедряются абсолютно в любые устройства, начи ...