Меню

Напряжение питания карты памяти



Подключение SD и SDHC карт памяти к микроконтроллерам ATmega8 / Atmega32

На сегодняшний день карты памяти SD (microSD) стали очень дешевыми и доступными, являются хорошим вариантом для увеличения памяти в своих проектах на микроконтроллерах и встраиваемых системах. В этом проекте мы рассмотрим методы подключения данных типов карт к микроконтроллерам AVR ATmega8, ATmega32 компании Atmel. Основной целью является изучение интерфейса SD карт и понимание процесса передачи данных в «сыром» (без спецификации) формате и в формате файловой системы FAT32.

подключение SD карт памяти к микроконтроллеру AVR

Как известно, карты памяти SD совместимы с интерфейсом SPI, поэтому их легко можно подключить к микроконтроллеру и наладить с ними обмен данными. Адаптеры для карт типа microSD также являются доступными, из такого адаптера мы можем изготовить слот для карты microSD для нашего макета. На фотографиях ниже показан внешний вид изготовленного адаптера для подключения к макетной плате.

В проект изначально использовалась карта памяти microSD объемом 1 ГБайт. Микроконтроллер – ATmega8 или ATmega32, работающий на частоте 8 МГц от внутреннего RC осциллятора. Кроме того, для подключения макета к персональному компьютеру для мониторинга данных использовался интерфейс RS-232. Для преобразования логических уровней интерфейса используется микросхема MAX232. Для питания схемы необходим стабилизированный источник питания 3.3 В (микросхема MAX232 рассчитана на напряжение питания 5 В, однако, как показала практика, сохраняет работоспособность при 3.3 В). Подключение карты памяти по 7-проводной схеме, согласно распиновке (см. рис).

интерфейс SD карт памяти

Принципиальная схема для микроконтроллера ATmega8.

Подтягивающие резисторы R1, R2 номиналом 51 кОм интерфейса SPI придают лучшую стабильность при работе с различными картами. Стабилитроны D1, D2 предназначены для защиты карты памяти при работе внутрисхемного программатора (ISP). Выводы микросхемы MAX232 VCC и GND на схемах не указаны, но их необходимо подкличить к соответствующим точкам схемы.

Принципиальная схема для микроконтроллера ATmega32

Принципиальная схема для микроконтроллера ATmega32 (добавлены часы реального времени на микросхеме DS1307)

Как вы заметили, питание последнего варианта устройства осуществляется от источника 12 В, а на плате установлены два регулятора напряжения 5.0 В (LM7805) и 3.3 В (LM1117-3.3). Для питания интерфейса SD карты используется 3.3 В, вся остальная часть схемы питается от источника 5.0 В. Микросхема часов реального времени DS1307 в стандартном включении и подключена к интерфейсу I2C микроконтроллера.

Сперва был изучен «сырой» формат передачи данных, на примере операций чтения любого блока данных, чтения и записи нескольких блоков данных, стирания нескольких блоков, записи данных в любой блок памяти SD. Устройство, собранное на макетной плате, подключалось к компьютеру по интерфейсу RS-232. Для отображения прочитанных данных с карты памяти, а также для ввода и записи данных на карту используется программа HyperTerminal (или аналогичная) на компьютере.

После удачной реализации обмена данными без спецификации, карта памяти была отформатирована (FAT32) в операционной системе Windows XP, затем на карту были записаны несколько текстовых файлов, директорий и другие типы файлов (в корневую директорию карты). После этого были написаны подпрограммы и функции по работе с файловой системой FAT32 для чтения файлов, для получения списка файлов на карте памяти (с использованием HiperTerminal), для получения информации о полном и свободном объеме памяти.

Вид окна программы HiperTerminal с функциями по работе с картой памяти SD:

Пользователю предлагаются свыше 10 опций по работе с картой памяти (для варианта с часами).

Опции 0 – 4 – это низкоуровневые функции. Gосле использования опций 0 – 3 Вам необходимо переформатировать карту перед использованием FAT32 подпрограмм.
Опции 5 – 9 – относятся к файловой системе FAT32. На данный момент поддерживаются только короткие имена файлов (8 Байт — имя файла, 3 Байта – расширение файла). Если будут записаны файлы с длинными именами, то они будут отображены в терминальной программе в коротком формате. Для тестирования этих опций не забудьте отформатировать карту в файловой системе FAT32, записать несколько директорий и текстовых файлов.

Описание опций:

0 – Erase Blocks – стирание выбранного количества блоков начиная с указанного.
1 – Write Single Block — запись данных в блок с определенным адресом. Данные вводятся с клавиатуры в программе Hiperterminal;
2 – Read Single Block – чтение данных с блока с определенным адресом. Прочитанные данные отображаются в окне терминальной программы;
3 — Writing multiple blocks – запись нескольких блоков, начиная с определенного адреса;
4 — Reading multiple blocks – чтение нескольких блоков, начиная с определенного адреса.

Примечание. Здесь функции работы с несколькими блоками (опции 3 и 4) отключены из-за нехватки памяти микроконтроллера ATmega8, поскольку эти функции не нужны для тестирования файловой системы FAT32. Для включения этих опций необходимо удалить макрос в файле SD_routines.h (#define FAT_TESTING_ONLY). И, если Вы используете ATmega8, на время тестирования опций 3 и 4 библиотека FAT32 может быть удалена с целью освобождения памяти микроконтроллера.

5 – Get File List – отображает список доступных директорий и файлов с занимаемым ими объемом памяти (в корневой директории карты);
6 – Read File – чтение указанного файла и отображение содержимого в окне терминальной программы;
7 – Create File – создать/добавить файл с указанным именем;
8 – Delete File – удалить все файлы файл с указанным именем;
9 – Read SD Memory Capacity – информация о полном и свободном объеме карты памяти (используется FSinfo сектор SD карты).

Читайте также:  Автоматический стабилизатор напряжения ресанта 10000вт

В терминальной программе последовательный порт настраивается на скорость обмена 19200 бод, без контроля потока и без проверки четности.

Для версии с часами реального времени (DS1307) на микроконтроллере ATmega32 свойства создаваемых или обновляемых файлов привязываются к дате и времени (дата создания/изменения), эти свойства прописываются в файловой таблице и могут быть проверены с помощью компьютера, а также часы могут быть полезны при сборе данных. В меню опций в терминальной программе добавлены три опции:

a – Show Date&Time – по этой команде в окне терминальной программы отображается текущая дата и время;
b – Update Date – обновить дату;
с – Update Time – обновить время.

Также в верхней части отображается информация об определенной карте памяти:

Исходные файлы проекта:
Для разработки ПО и компиляции использовался Си компилятор WinAVR совместно с AVRStudio
Версия 2.4 (ATmega32, поддержка часов реального времени, поддержка SDHC) от 17 мая 2010 г..
Версия 2.3 (ATmega32, поддержка SDHC) от 09 мая 2010 г.

Версия 2.1 для микроконтроллера ATmega8, без поддержки SDHC:

  1. SD_main.c
  2. SD_routines.c & SD_routines.h
  3. FAT32.c & FAT32.h (версия 2.1, последнее обновление — 13 сентября 2009)
  4. SPI_routines.c & SPI_routines.h
  5. UART_routines.c & UART_routines.h
  6. Makefile
  7. HEX file (версия 2.1, последнее обновление — 13 сентября 2009)

Версии 2.3, 2.4 тестировались на микроконтроллере ATmega32, но могут быть адаптированы под любой контроллер с памятью SRAM не менее 1 КБайт и Flash-памятью программ не менее 16 КБайт.

Дополнительные материалы:

Перевод: Vadim по заказу РадиоЛоцман

Источник

MMC(SD) и AVR. Часть 1. Инициализация и идентификация.

Пришло время поговорить о картах памяти формата MMC и SD(а также все их варианты типа mini, micro и т.д.). Использую их в своих проектах довольно таки давно, поэтому вроде как для меня в этом вопросе ничего сложного нет. Поэтому данная статья рассчитана на тех, кому этот вопрос кажется интересным(новым, незнакомым, сложным). Если такие комрады имеются, милости прошу под кат…
Долго чесались руки написать данную статейку, да все не было времени. Вот сейчас на работе вроде бы расслабон, поэтому начну излагать материал. Сразу оговорюсь, что на звание ОБУЧАТЕЛЯ не претендую, но постараюсь донести материал как можно доступнее.
И так, карта MMC как SD, по своей природе имеют собственный протокол общения с внешним миром, но уважаемые товарищи разработчики этого формата карт вложили одну очень приятную плюшку в эти карты, а именно работа по SPI. Однажды узнав об этом, я подумал, а не использовать ли мне эту феньку и не заюзать это в своем курсовом? Сказано — сделано. Первым делом обратился к datasheet’у на данные девайсы и все вроде как стало понятно, но без гвоздей, как говориться не обошлось.
На рисунке 1 представлена стандартная карта памяти MMC и SD, а также назначение их выводов.
SD MMC pinout
Как можно увидеть из рисунка, обе эти карты имеют выводы для подключения по SPI. Долго тянуть не будем и подключим все это дело по схеме, указанной ниже:
SD MMC schematic
Как обычно печатку не прилагаю, поскольку использую давно провереный девайсик, фотку которого можно увидеть здесь
Вот мы вроде бы все подключили как указано выше. Сейчас перейдем к описанию самой работы с картой памяти. Режим SPI является вторичным (опциональный) протоколом связи с картой памяти. Этот режим является, как бы, подмножеством MMC протокола и разработан для связи по каналу SPI, который присутствует в большинстве современных МК.
Сам по себе SPI стандарт подразумевает только физическую связь между устройствами и не является полноценным протоколом передачи данных. Поэтому SPI интерфейс в картах MMC и SD имеет свои особенности. Стоит отметить, что при работе с картой памяти по интерфейсу SPI доступны не все возможности карты, но, как правило, эти возможности и не нужны.
И так, в то время как протокол MMC основывается на командах и битовых потоках, которые начинаются со старт бита и заканчиваются стоп битом, SPI режим является байт-ориентированным. Это значит, что каждая команда или блок данных состоят из 8-ми битных байтов. Так же как и в протоколе MMC в SPI режиме общение с картой состоит из команды, ответа на команду и знаков(tokens) от блоков данных. МК контролирует весь обмен информацией между собой любимым и картой памяти.
Есть несколько основных аспектов при работе с картой памяти в режиме SPI:
— Выбранная карта памяти всегда отвечает на посланную ей команду
— Используются дополнительные 8-ми, 16-ти и 40-ка байтные структуры как ответ на посланную команду
— В случае ошибки при получение команды или данных от МК, карта памяти ответит структурой содержащей описание ошибки

Читайте также:  Напряжение аккумулятора снятого с авто

Следует знать, что в режиме SPI поддерживаются только команды чтения/записи в режиме одного блока или нескольких блоков (в режиме MMC поддерживается режим последовательной чтения/записи). Размер блока для чтения/записи может быть размером в сектор карты памяти и размером в 1 байт. Поддержка операций частичного чтения/записи блока данных хранится в регистре CSD карты памяти.
Чуть не забыли поговорить о регистрах, которые содержит карта памяти стандарта MMC(SD). Этих регистров чуть больше, чем перечислю я, но те, которые я не укажу либо не особо нужны, либо не доступны в режиме SPI. Основными регистрами, которые представляют для нас интерес являются следующие:

— CID (Card identification data): содержит данные, по которым можно идентифицировать карту памяти (серийный номер, ID производителя, дату изготовления и т.д.)
— CSD (Card-specific data): содержит всевозможную информацию о карте памяти (от размера сектора карты памяти до потребления в режиме чтения/записи).
— OCR (Operation Conditions Register): содержит напряжения питания карты памяти, тип питания карты памяти, статус процесса инициализации карты.

Подробнее об этих регистрах мы поговорим чуть позже, когда коснемся написания прошивки для МК.
Теперь наступило время узнать о том, как эти самые карты включить в режиме SPI. По умолчанию, карта MMC(SD), при подаче на ее напряжения питания, запускается в режиме протокола MMC. Карта перейдет в режим SPI в случае, когда сигнал на выводе _CS будет иметь низкий уровень (карта памяти выбрана) и при этом на карту будет послана команда сброса CMD0. В случае приема CMD0, карта проверяет состояние линии _CS. Если логический уровень на этом выводе равен «1», то на посланную команду карта памяти не ответит и останется в режиме MMC. Если же карта, приняв CMD0, определит, что на выводе _CS низкий уровень, то она переключиться в режим SPI и ответит на посланную команду ответом R1 (По всем видам ответов и token’ов поговорим позже). Единожды перейдя в режим SPI, карта памяти останется в этом режиме до следующего выключения и включения питания, т.е. перейти в режим MMC из режима SPI программным способом не получится!
Вроде бы основные вступительные моменты мы обговорили и теперь коснемся набора команд, доступных в режиме SPI. Велосипед изобретать не буду, а просто приведу таблицу из datasheet’а.

Многие, наверное, заметили, что в таблице пропущены некоторые команды. Как я говорил ранее, в режиме SPI недоступны некоторые функции, которые доступны в режиме MMC. Поэтому некоторые команды так же не доступны. Так же из таблицы видно, что у всех команд в поле «Resp» присутствует аббревиатура R1(2, 3, 7 и др.). Это и есть так называемый ответ карты на посылаемую ей команду. Приведу небольшой пример обмена информацией с картой памяти для иллюстрации описанного выше.

MMC SD cmd resp

Рассмотрим подробнее данный пример. Мы видим, что мы отправляем карте (линия DataIn) некоторою команду, приняв которую, карта через некоторый промежуток времени выдаст ответ (линия DataOut). Размер ответа зависит от посылаемой команды и имеет свой формат. Приведу формат ответов, которые мы можем получить от карты памяти.

SD MMC R1

SD MMC R2

SD MMC R3

Теперь коснемся самих команд для карты памяти. Из таблицы команд видно, что у каждой команды есть свой индекс. Это значение используется для получения истинного значения команды, которую необходимо отправить в карту памяти. Общий вид команды представлен ниже (команда в режиме SPI имеет длину в 6 байт):

Стоит отметить, что в протоколе MMC весь обмен данными завершается полем CRC, которое является необходимым. Что касается режима SPI, то по умолчанию при переходе в этот режим, контроль CRC отключен. Исключение составляют команды CMD0 и CMD8, поскольку они отправляются в карту, которая еще находится в режиме MMC, поэтому поле CRC для этих команд должно быть верным. Поскольку CMD0 отправляется единожды и все 6 байт этой команды известны заранее и не меняются, то в поле CRC для любой команды мы будем отправлять CRC для команды CMD0 (оно равняется 0x95). Что касается CMD8, то поле CRC в ней не является константой и зависит от передаваемых параметров. Хочу заметить, что проверку поля CRC можно активировать и в режиме SPI. Делается это при помощи соответствующей команды (CMD59).
Немного разобравшись с теорией, посмотрим на процесс инициализации карты памяти. Попробую представить это в виде блок-схемы. Вот что получилось у меня вымутить из datasheet’а (излагаю только суть, за вычетом некоторых моментов, которые я распишу после блок-схемы):

SD MMC Init strap

Ну вот, скажут некоторые, нарисовал не пойми чего, а вы тут разбирайтесь;) Но все не так уж и плохо. Первое, что необходимо пояснить в этой схеме это то, что карты как бы того не хотелось, бывают разные (поэтому наверное они и называются по разному). И на этой схеме мы видим, что бывает их ни много ни мало, а целых 4: MMC, SD версии 1.х стандартной емкости, SD версии 2.х стандартной емкости и карта SD версии 2.х повышенной емкости (SD карты расширенной емкости или SDHC). Все бы ничего, но все они требуют разной инициализации и это самое обидное. В принципе, есть общий способ инициализации всех их кроме SDHC, но он не есть правильный, поскольку работать с картой SD версии 2.х стандартной емкости и картой MMC как с одинаковыми картами неправильно (отличие в структурах CID и CSD). Конечно, можно построить алгоритм для работы с каждой картой по отдельности, но мы пойдем универсальной дорогой(и самой трудной на первый взгляд).
Из приведенной структуры намечается следующий путь работы (я буду указывать основные моменты, которые необходимо выполнять, но они не указаны на данной схеме). Мы определили, что в разъем картоприемника вставили какую-то фигню. Мы в свою очередь делаем следующее: подаем питание в пределах от 2.7-3.6 В, ожидаем

Читайте также:  Понижение напряжения по постоянному току

1мс (точно не знаю сколько, но чтобы питание устаканилось). SPI настроен как полагается (я думаю все умеют это делать) и вывод _CS карты памяти выставлен в логическую “1”. После этого нам необходимо подать минимум 74 тактовых импульса на линию SCLK SPI. Выполнив все это мы выставляем логический “0” на вывод _CS карты памяти и отсылаем команду CMD0. Из таблицы команд видим, что ответом на CMD0 является R1, структуру которого мы знаем. Немного отступлю от мысли и обращу внимание на то, что все ответы содержат в себе первым байтом R1, 7-й бит которого всегда является 0. Таким образом, мы можем отличать ответы от идущий по линии MISO байтов 0xFF. Итак, приняв R1, проверяем бит «In idle state» на равенство «1». Если это так, то карта находится на этапе инициализации. А вот теперь пришел первый этап определения типа карты памяти. Посылаем команду CMD8, которая указывает карте поддерживаемые МК напряжения питания для ее и спрашивает у выбранной карты может ли она работать в данном диапазоне напряжений, дожидаемся ответа R7. Как видно из блок-схемы, карты памяти стандарта MMC и SD версии 1.х эту команду не поддерживают и, соответственно, в своем ответе будут содержать бит «illegal command». Если сказанное ранее верно, то установленная карта либо MMC, либо SD версии 1.х. Теперь пришло время распознать, какая именно из этих двух типов карт вставлена в картоприемник. Для этого отправим карте памяти команду ACMD41, которая инициирует процесс инициализации карты. Эта команда посылается в цикле либо для ее выполнения взводится таймер, по которому проверяется ответ на эту команду. В любом случае, карта MMC не поддерживает ACMD41 и вернет «illegal command» в своем ответе. В таком случае вставленная карта есть MMC и для ее инициализации потребуется команда CMD1 (так же посылается в цикле, пока ответ на нее не будет равен 0). Получив ответ на CMD1 равный 0х00 карта MMC готова к работе. Если ответ на ACMD41 не содержит никаких установленных битов (т.е. равен 0х00), то карта SD версии 1.х и она готова к работе. Теперь вернемся чуть выше и предположим, что в ответ на команду CMD8 не содержал бит «illegal command», т.е. у нас карта памяти формата SD версии 2.х стандартной емкости(SDSC версии 2.х) или SDHC. Следующим шагом в таком случае есть отправка команды ACMD41 с параметром, указывающим карте памяти, поддерживает ли наше устройство карты памяти SDHC. Вне зависимости от того, есть поддержка SDHC или ее нет, мы циклически отправляем эту команду карте то тех пор, пока она (карта) не закончит процесс инициализации. Когда ответ от ACMD41 будет равен 0х00, карта памяти проинициализирована и готова к работе. Но для того, чтобы узнать, какая у на карта, мы отправим ей команду CMD58. Ответом от этой команды есть R3, который в свою очередь содержит регистр OCR. Проанализировав OCR на установку бита CSS можно определить тип карты: CCS == 1 – карта SDHC или SDXC, CCS == 0 – карта SDSC. Чтобы не быть голословным, приведу мой участок кода инициализации карты памяти:

Закончив процесс идентификации(тип карты памяти) и инициализации, можно приступать к работе с картой памяти: вычисление объема, чтение и запись данных и т.д.Но это уже вопрос следующей статьи. Жду комментариев и вопросов. Критика и советы оч приветствуются!

P.S. Забегая немного вперед, пару скринов чтения информации с карты памяти:

SD MMC PC Info

Да. и если можно, объясните мне, чайнику, как залить видео? СПС =)

Источник