Skip to content

Instantly share code, notes, and snippets.

Created August 31, 2017 05:00
Show Gist options
  • Save anonymous/81a96b0e29ddb1a7f3a26111605a3fa8 to your computer and use it in GitHub Desktop.
Save anonymous/81a96b0e29ddb1a7f3a26111605a3fa8 to your computer and use it in GitHub Desktop.
Инициализация карты mmc sdc

Инициализация карты mmc sdc - Как проводить инициализацию SD карты?


Инициализация карты mmc sdc



Шаг №19. Подключение карты SD к AVR. Протокол SPI. Часть 4
Как использовать карты MMC/SDC
MMC(SD) и AVR. Часть 1. Инициализация и идентификация.
How to Use MMC/SDC
Работа с SDC/MMC на примере драйвера под Z-Controller (Z80)
087-ATtiny2313 SD Card Talking Device.













Как читать регистры SD карты на примере регистра CID? Итак, как всегда, первым делом я укажу официальной источник информации по SD картам , который расскажет о том как работать с данными картами памяти. В результате вы скачаете pdf документ — спецификацию на SD карты, в ней все подробным образом раскачано какие бывают карты и как с ними работать. Vdd — разъем питания, от 2. Входные данные и тактовый сигнал, также должен быть в этом диапазоне. Как подключить SD карту? Принцип прост, если нам нужно считать что-либо , то мы отсылаем команду-запрос на чтение определенного блока памяти, далее карта возвращает этот блок данных. Если нужно записать что-то , то мы отправляем команду-запрос на запись с указанием куда писать данные. Далее после небольшого ожидания, отправляем блок данных который нужно записать на карту. В результате переданной команды, SD карта через некоторое время которое может длиться от 0 до 8 байт или от 0-ля до 8-ми пакетов SPI возвращает ответ. Ответ может быть как отчет об ошибках так и отчет о удачной полученной команды. После переданной команды , SD карте можно передавать данные для записи или получать считанные данные. Данные передаются всегда блоками по байт или по пакетов SPI. Приведу некоторые, наиболее часто используемые, полных список вы можете найти в спецификации на SD карты. Сначала идет 01 , далее индекс команды , который соответствует порядковому номеру команды , то есть CMD0, CMD1, CMD2, CMD3 и т. На этом кончился первый байт команды, далее идет 4-е байтовый аргумент. Последний байт это контрольная сумма по алгоритму CRC. А как любой компьютер его надо еще запустить или проинициализировать, причем в нужном нам режиме. Я приведу порядок действий , который нужно совершить с SD картой , для её инициализации. После подключения карты к питанию нужно дождаться пока питающие напряжение на карте не достигнет рабочего, обычно для этого надо подождать несколько миллисекунд. Далее, нужно установить на контактах карты CS и DI для контролера это выход MOSI и любой тот выход которые вы используете как CS на контролере логическую единицу и подать на контакт CLK — 74 синхроимпульса для контролера это выход SCK , можно и больше, главное, чтоб не меньше. После чего CS нужно установить в нулевой уровень. Установить логическую единицу на выход контролера CS проблем быть не должно , а вот как установить логическую единицу на MOSI и подать е синхроимпульса может немного озадачить. Обычно это делается так: Далее на CS устанавливают логический ноль. Мы просто взяли один из наименьших вариантов, хотя работать будет при любом количестве больше чем и итераций. Далее, нужно подать команду CMD0 с пустым аргументом и соответствующим CRC равным 0x95 для программного сброса , SD карта должна вернуть байт ответа с значением 0x Это означает, что карта перешла в режим SPI , она находится в состояние покоя и готова к процессу инициализации. В состояние покоя, карта может принимать только CMD0 , CMD1 , CMD Для запуска инициализации нужно узнать что за версия карты: Узнать версию, мы можем с помощью команды CMD8. Ответ 0x01 скажет нам, что карта версии v. Постоянно посылаем карте команду CMD1 с пустым аргументом и любым CRC , до тех пор пока не получим байт ответа с значением 0x00 , что означает инициализация завершена. Шлем CMD55 с пустым аргументом и любым CRC , далее шлем 0xFF до тех пор, пока не получим ответ 0x После чего, шлем команду CMD41 с пустым аргументом и любым CRC , далее шлем 0xFF два раза , на второй раз смотрим ответ , если он равен 0x00 , то значит карта инициализирована успешно. Все, инициализация завершена, теперь можно передавать и считать данные с SD карты. Но учтите, простой карты после инициализации должен быть не более 5 мс , иначе вам нужно заново подать команду инициализация SD карты, то есть CMD1 или ACMD41 в зависимости от версии. Один блок данных по умолчанию равен байт то есть данные будут помещаться в пакетов SPI. В большинство современных SD карт, то есть поколения SDHC , SDXC см. Мы разберемся как писать данные по одному блоку , как записать сразу множество блоков читайте в документации. Для записи данных по одному блоку, используется команда CMD24 , в качестве её аргумента используется:. Адресуются сектора в SD побайтно , то есть размер одного сектора — один байт. Но так как данные в SD карту пишутся не побайтно, а блоками, с размером байт, то адрес сектора фактически означает — адрес первого байта блока. Блоки нумеруются с нуля. Пример для ясности, мы хотим записать данные в первый блок размер блока по умолчанию байт , адрес блока — 0х Откуда я взял 0x? Это число вшестнадцатиричной системе исчисления. Выставляем на CS логический ноль после инициализации была выставлена единица. Далее отправим карте команду CMD24 с аргументом — адрес сектора с которого мы будем писать наш блок данных. CRC код у нас произвольный, так как в режиме SPI карта его не учитывает. Пример, нам нужно записать блок данных, начиная с первого сектора SD карты. Мы отправляем карте CMD24 c адресом 0x и произвольным CRC. Первый, второй, третий байт адреса и т. Для нашего случая запись блока данных, то есть CMD24 подходит метка , то есть 0xFE. В качестве CRC , мы будем использовать произвольное число 0x00 , так как в режиме SPI карта не учитывает CRC. Например нам нужно записать блок данных, состоящий из ть 0xAB , для этого на SD карту мы посылаем следующие SPI пакеты:. Байт приема данных должен придти сразу после окончания пакета данных, он имеет следующую структуру. Если данные приняты, байт приема данных должен иметь вид или 0x Окончание записи данных занимает некоторое время. Пока микросхема SD карты занята записью данных, на выходе карты мы получаем 0xFF. Наша задача подавать 0xFF на карту и ожидать пока она не закончит запись , то есть пока мы на выходе не получим 0x После чего можно отправлять новую команду с новыми данными, начиная с пункта 1. Читать данные можно аналогично как и писать: Повторю, один блок данных по умолчанию равен байт то есть данные будут помещаться в пакетов SPI. В большинство современных SD карт , то есть поколения SDHC , SDXC см. Мы разберемся как читать данные по одному блоку , как прочесть сразу множество блоков читайте в документации. Чтение как и запись происходит по аналогии, но я на всякий случай опишу также подробно для тех кто попал сюда по ссылке с начало поста. Для чтения данных по блокам, используется команда CMD17 , в качестве её аргумента используется:. Но так как данные в SD карту считываются не побайтно, а блоками, с размером байт, то адрес сектора фактически означает — адрес первого байта блока. Пример для ясности, мы хотим прочитать первый блок размер блока по умолчанию байт , адрес блока — 0х Это число в шестнадцатиричной системе исчисления. Далее отправим карте команду CMD17 с аргументом — адрес сектора с которого начинается считываемый блок данных. Пример, нам нужно прочесть блок данных, начинающийся с первого сектора SD карты. Мы отправляем карте CMD17 c адресом 0x и произвольным CRC. Для нашего случая чтение блока данных, то есть CMD17 подходит метка , то есть 0xFE. После чего, нам нужно еще подождать 2-а байта , это CRC код, мы его не проверяем, но принять обязаны. Итак, выложу полный код в котором мы сначала запишем блок данных в SD карту, а потом прочтем его. В SD карте есть программно доступные регистры, в которых храниться параметры карты и её настройки. Мы можем читать регистры и узнать какую-нибудь полезную информацию. Регистров около и, в спецификации вы можете узнать о каждом из них. Чтение регистров, похоже на чтение блока памяти, отличие заключается лишь в размере возвращаемых данных. Для того, что бы прочесть регистр CID , карте необходимо послать команду CMD В результате чего, SD карта вернет пакет данных с размером 16 байт. Определить начало пакета мы можем по метке 0xFE. Приведу сразу полный код чтения CID на Arduino. Расшифровать данные регистра можно на сайте http: Проверить приведенные здесь исходные коды вы можете в программе Proteus. В проекте к ножкам MISO , MOSI , SCL и 6-ой ноге в качестве CS микроконтроллера ATmegaP подключена SD карта с именем М1. Так же хочу оставить несколько своих заметок: Запись блока, строка while SPI. Посмотрев на те ответы, что получал я и полистав документацию 7. Дело в том, что ответ же там 8 бит, а анализировать нужно только 5 младших в то время как 3 старших не определены. К примеру, та карта с которой работал я в этот момент выдавала ответ 0xE5. Что вполне вписывается в спецификацию, но не работает с предложенным кодом. Запись блока, следующая строка while SPI. А карта оставалась не готовой. Касательно ограничения карты в 5 мс после инициализации. Возможно это специфика конкретной карты? Да и в спецификации я таких ограничений в разделе SPI я не обнаружил. И все таки, хочу сказать, что то обстоятельство что код не заработал сразу заставило меня порядком покопаться и разобраться в спецификациях обнаружив попутно много интересного. В качестве вывода информации можно использовать монитор Arduino в таком виде вместо digitalWrite 4, HIGH ;:. CID регистр имеет длину бит, структура регистра описана в конце поста, там же дан сайт для расшифровки CID. Размер с 16ГБ на 10ГБ. Читаю весь SCD, а записать по CMD27 не получается. Напишу может кому-то еще будет полезно. В случае с SDHC и SDXC не нужно выщитывать никаких смещений в байтах, а передавать значения сразу в секторах. Вот бы еще код для тех кто не знает CI может случайно для asm. У меня еще вопрос, уже по инициализации SD карты Вашим кодом. Посылается CMD8, у меня в железе карточка отвечает 0х01, т. Ставлю в код после while SPI. Почитал даташит на SD, нашел что R1 0х01 действителен только для CMD0, для остальных команд R1 должен быть 0х00, поменял в коде — ответа нет. У меня две карты microSD 1 и 2Гб и ни с одной нет ответа. В инете много статей на тему инициализации SD, но все соскакивают на CMD1. Может мне поискать именно ММС карточку? Данный пост я уже писал давно и много чего уже подзабыл, в тонкостях. Мой код у вас не работает? Ответ R7 после CMD8 равен FF 01 00 00 Ладно, пойду искать ММС. Вы можете использовать следующие теги: Записки инженера Доступным языком заметки по IT технологиям. Как проводить инициализацию SD карты? Как писать данные на SD карту? Как читать данные с SD карты? Работаем с LCD дисплеем на основе микроконтроллера — HD ч. Автор, а как с вами связаться? Добрый день Слава, я вам ответил на почтовый ящик. Еще раз — спасибо! Спасибо вам за комментарий! Здоровая критика очень полезна для меня. Обязательно обращу внимание на свои ошибки. В качестве вывода информации можно использовать монитор Arduino в таком виде вместо digitalWrite 4, HIGH ;: Изменить значения регистра CID можно? Если можно напишите как. CID регистр имеет длину бит, структура регистра описана в конце поста, там же дан сайт для расшифровки CID http: Насколько я знаю изменять CID нельзя. Разбить партишен не подходит. Нужно записать в регистр другое значение. Уважаемый Арм, к сожалению ассемблерного кода нет михаил пишет: Вы имеете ввиду можно-ли писать в for два действия? Редко, но иногда для сокращения строк в коде так пишут. Подписаться и читать нас можно в:


Сварка пластиковых труб своими руками видео
Творожное тестос яйцом
Табличное значение критерия стьюдента зависит
Абаеведение календарные планы 9 класс
Игры с приятной графикой на пк
Электросталь на карте московской области
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment