0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270

Помогите разобратся SD картами.

09.11.2014, 13:35. Показов 8790. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал знакомство с SPI и собственно с SD картами.
Почитал даташиты и спецификации на карты, вроде бы все понятно,мне показалось...

Вообщем возникла пара вопросов:

- Если циклически слать CMD0 ответ будет всегда одинаковый? (до инициализации карты)
- Если на карту слать "ахинею" (FF, FF, FF, FF, FF, FF) вместо команд карта будет что ни будь отвечать?

P.S.
Может кто ни будь работал с TMS320С6455 ? и знает как натроить SPI без EDMA?)))))
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2014, 13:35
Ответы с готовыми решениями:

Помогите разобратся с #define
Доброго времени суток! Разбираюсь с понятием "виртуальный порт", пришел к выводу что очень удобно было бы задавать пины через...

Помогите разобратся с SWD протоколом
Вопрос в следующем. Нужно написать программатор по SWD. Начал читать и не совсем понятен процесс чтения регистров. Например мне нужно...

Помогите разобратся с оптопарой и симистором.
Пытаюсь сделать управление нагрузкой 220 с микроконтроллера. Оптопара мос3061, симистор ВТ137-600. ...

17
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2014, 14:30
Цитата Сообщение от fotom6
Начал знакомство с SPI и собственно с SD картами.
... ...
Если на карту слать "ахинею" (FF, FF, FF, FF, FF, FF) вместо команд карта будет что ни будь отвечать?
Это не ахинея, а стандартный способ получения статуса карты (OK, READY, ERROR, и т.п.). Причём отвечает карта не с первой попытки (в отличие от SPI-Ftosh, где всё получается синхронно сразу).
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
09.11.2014, 22:29
О разобрался))))

Да на CMD0 приходит всегда 1 ответ, даже до инициализации.

На "FF" карта никак не реагирует, что является отличным способом выдать тактирующую пачку.

Вообщем в итоге сделал так(условные обозначения):

send(CMD0) - 6 байт как и положено (40_00_00_00_00_95)
send(0xFF) - Выроботка "пачки тактов" для подумать(обработки полученной команды).
send(0xFF) - Выроботка "пачки тактов" для получения ответа(формат R1 -1 байт). 0xFF - 2 раза для получения 2-ух байтных ответов и т.д.
Считываю данные с регистра приема.

Контролировал процесс осцилом, все гуд)

Теперь осталось поставить файловую систему)))))
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
10.11.2014, 01:44
Для файловой системы пока рановато. Попробуйте пройти через всю инициализацию (причём не одной и той же карты, а разных типов).
Потом - попытайтесь прочитать сектор данных.
Тогда, может быть, поймёте, о чём я говорил :-)

Чёткий синхронный обмен (столько-то байт послать, столько-то получить в ответ) без повторных попыток и условных ветвлений в алгоритме - это возможно только с SPI-Ftosh, но не с SPI SD/MMC картой.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
13.11.2014, 11:32
Инициализация пройдена, организовано определение разных типов карт, индикация ошибок.
Но возникло несколько вопросов:

1)
Почему то контроллер читает ответ позже чем отвечает флешка, приходится посылать просто пустые "FF" и естественно терять время. Почему так происходит? CMD0 и ответ R1 :

http://s7.hostingkartinok.som/uptoods/thumbs/2014/11/333eb347b31659b4856489c0f451f203.png


C N байтными и более ответами тоже самое, то есть N (размер байт ответа) + 5 раз приходится посылать "FF"
, хотя судя по осциллограмме должно хватать N+1.

2) Как узнать диапазон доступных адресов блоков памяти? (английский не знаю и естественно очень тяжело читается даташит, и пока не наткнулся на такую инфу).

3) Можно ли как то узнать какие блоки заняты а какие свободны для записи не считывая всю флешку? (регистров подходящих не увидел в документации)

4) Также не удалось найти структура блока данных. Как я понял после CMD24 (запись 1 блока)
жду ответа 0х00, и шлю данные(512 байт) + CRC7 но в 2 байтах (0x00##|0x01)?

Подскажите пожалуйста или направьте в нужном направлении)
0
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
13.11.2014, 15:10
есть вот такой проект, проверенный годами: http://itm-chan.org/fsw/ff/00index_e.html .
есть там такая ссылка: Downtood: FatFs sample projects for various platforms. в ней есть пример работы с сд/ммц картой, по которому можно свериться с тем, что наделал ты.

Цитата Сообщение от fotom6
Почему то контроллер читает ответ позже чем отвечает флешка, приходится посылать просто пустые "FF" и естественно терять время. Почему так происходит?
флешка - тоже человек. ей надо подготовить данные, на это может уходить время. емнип, после того как дал команду, начинаешь слать FF (FF командой быть не может, т.к. у команд бит 7=0, а бит 6=1). карта тебе выдаст ответ как будет готова, а ответ ВСЕГДА начинается с байта, у которого бит 7 = 0. так что просто в цикле ждешь ответа.
Цитата Сообщение от fotom6
2) Как узнать диапазон доступных адресов блоков памяти?
есть команда для этого. см. примеры по ссылке выше.
Цитата Сообщение от fotom6
3) Можно ли как то узнать какие блоки заняты а какие свободны для записи не считывая всю флешку? (регистров подходящих не увидел в документации)
нет такого. карта предоставляет тебе просто память. используй ее как хочешь. кстати, распределение ресурса флеш карта делает прозрачно сама. даже если будешь писать в одно и то же место, карта сама это разрулит и дыры не будет.
Цитата Сообщение от fotom6
4) Также не удалось найти структура блока данных. Как я понял после CMD24 (запись 1 блока)
жду ответа 0х00, и шлю данные(512 байт) + CRC7 но в 2 байтах (0x00##|0x01)?
тоже смотри в примере. емнип, там команду послал, ответ получил, потом надо слать токен и только потом данные. вместо црц можно просто FF FF послать и всё.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
13.11.2014, 18:25
Цитата Сообщение от fotom6
2) Как узнать диапазон доступных адресов блоков памяти?
Блоки нумеруются с нуля и до максимального номера. Общее количество блоков на карте (и вообще, её структура и полезные характеристики) записаны в CSD-дескриптор карты. CSD читается соответствующей командой (код очень похож на код для чтения блока данных), размер дескриптора 16 байт, расшифровка которых зависит от типа карты (так, у MMC, SDv1 и SDv2 формат CSD различается).

Цитата Сообщение от fotom6
3) Можно ли как то узнать какие блоки заняты а какие свободны для записи не считывая всю флешку?
Без файловой системы - нет. А если искать свободные/занятые с точки зрения файловой системы и её же средствами, - то легко. Например, в системе FAT свободные кластеры помечены специальной сигнатурой в таблице распределения файлового пространства.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
16.11.2014, 15:11
Уперся в очередной непонятный тупик(

Имеется 2 флешки: SD(2.X версии) и SDHC.
Пишу 1 блок (512 байт) в разные адреса.
SD нормально работает. SDHC пишет только в 0x0000, в остальные адреса ничего не записывает
хотя в ответ шлет что все "ок" (0xE5 - данные приняты).

Подскажите в чем может проблема?
алгоритм записи:
- иницилиазация
- CMD24 (ответ "ок")
- старт байт (0xFE)
- data (512 байт) - ответ 0xE5 и линия в "0" ;
- Жду когда линия поднимется в "1" и запись следующего сектора.
0
Oxford
16.11.2014, 15:17
Я выкладывал драйвер. Скачайте изучите.
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
16.11.2014, 15:32
Цитата Сообщение от fotom6
SD нормально работает. SDHC пишет только в 0x0000, в остальные адреса ничего не записывает
хотя в ответ шлет что все "ок" (0xE5 - данные приняты).
может-таки пишет не туда куда вы думаете?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
16.11.2014, 15:46
Цитата Сообщение от Oxford
Я выкладывал драйвер. Скачайте изучите.
Сейчас найду, поковыряюсь.
Цитата Сообщение от Ymk
может-таки пишет не туда куда вы думаете?
Ну если верить Winhexу то везде 00 кроме нулевого сектора, который как раз единственный и перезаписывается.

Ну одна то флешка норм пишется же, разницы в записи сектора размером 512 байт в спецификациях 2.X и 3.X не обнаружил, значит должно все писатся.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
16.11.2014, 16:28
У sdHC-карт адресация на низком уровне - поблочная. А у не-HC карт - побайтовая (хотя и выравненная на границу блока 512 байт). То есть для чтения одного и того же сектора из SD и SDHC адресный параметр для последней должен быть в 512 раз меньше.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
16.11.2014, 17:03
Цитата Сообщение от OtyxPM
У sdHC-карт адресация на низком уровне - поблочная. А у не-HC карт - побайтовая (хотя и выравненная на границу блока 512 байт). То есть для чтения одного и того же сектора из SD и SDHC адресный параметр для последней должен быть в 512 раз меньше.
))))))) Спасибо)))) Заработало) Только убрал множетель адреса 512 и все ок))))

Но в доках не нашел упоминания об этом Оо Единственное что и раньше видел: "писать и читать можно только секторами по 512 байт".

Кстати с посылкой байт и получением ответа проблем не возникало, как Вы писали выше.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
18.11.2014, 15:33
Эх ну я и валенок, опять всплыл косяк который не могу осилить самостоятельно.

Вроде бы уже все прекрасно читается, пишется (по 1 блоку и мултиблочные операции).
Естественно начал все прикручивать к практическому применению и все...
В общем после записи или чтения (любой из операций) флешка перестает нормально отвечать
на любые команды. На CMD0 вообще не реагирует, на прочие используемые команды выдает:
SDHC - С1 3F
SD - F0 4F

Линия постоянно висит в "1" и с некоторым интервалом времени проскакивают указанные выше ответы.

Пробовал в конце операция чтения/записи и CMD12 слать и STOP байт (FD) и их одновременно.

Что это за ответы не понятно, так-как все форматы ответов должны начинаться с "0".
Цитата Сообщение от Oxford
Я выкладывал драйвер. Скачайте изучите.
А можно ссылку? Через поиск по форуму найти не удалось.
0
Oxford
18.11.2014, 15:59
найдете. здесь на форуме много чего есть учитесь искать.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
18.11.2014, 16:43
Цитата Сообщение от fotom6
после записи или чтения (любой из операций) флешка перестает нормально отвечать на любые команды
Вероятно, алгоритм чтения неправильный.

<ul>После CMD17 (READ_SINGLE_BLOCK)
<li>карта должна была ответить 0x00 (не обязательно сразу),</li><li>потом ответить 0xFE (опять-таки не сразу),</li><li>а после собственно чтения 512 байт данных надо было</li><li>прочитать ещё два байта CRC,</li><li>снять сигнал выборки CS,</li><li>после чего "добить" транзакцию посылкой одного байта 0xFF в карту.</li></ul>
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
18.11.2014, 17:09
Вот допустим процедура чтения N секторов.
SD.iter - просто промежуточный подсчет шагов.

while((*(int*)SPCR1&0x00000002)==0); Флаг готовности к чтению
while((*(int*)SPCR1&0x00020000)==0); Флаг готовности к записи

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void SD_CARD::RX_data (int adr, char num_data)//#WORCK#
{
char CMD_read[6]={0x00, 0x00, 0x00, 0x00, 0x00, 0x99};    //Шаблон команды для чтения.
for(char i=5, ii=0; i>1 ;i--)         // В шаблон добовляю адрес начального сектора чтения
{
CMD_read[i-1]=(adr>>8*ii);
ii++;
}
CMD_read[0]= num_data>1 ? CMD18[0]:CMD17[0];  // Если секторов больше 1 то CMD18
SD.iter=0;
for(char i=0; i<6; i++)
SD_CARD::TX_ (CMD_read[i]); // отправляю команду чтения.
SD_CARD::RX_(SD.card_tip>2 ? 2:1); // в зависимости от типа карты жду ответ .
if(SD.get[0]!=0x00)     // анализирую ответ
SD_CARD::error_();   // функция анализа ошибки
for(short i=num_data; i>0; i--) // Коли-во повторов зависит от кол-ва необходимых сектров
{
SD.iter=0;
while(SD.temp!=0xFE)  // жду старта посылки
{
*(int*)DXR1_SPI=0xFF;
*(int*)DXR1_SPI=0xFF;
while((*(int*)SPCR1&0x00000002)==0);
SD.temp=*(int*)DRR1_SPI;
while((*(int*)SPCR1&0x00020000)==0);
SD.iter++;
}
for(short ii=513; ii>=0; ii--)   //принимаю 512 байт + 2 байта CRC.
{
*(int*)DXR1_SPI=0xFF;
while((*(int*)SPCR1&0x00000002)==0);
SD.temp=*(int*)DRR1_SPI;
SD.get[ii]=SD.temp;
while((*(int*)SPCR1&0x00020000)==0);
}
}
}
Дергать CS не помогло.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 270
18.11.2014, 17:31
Цитата Сообщение от Oxford
найдете. здесь на форуме много чего есть учитесь искать.
Нашел))))
Есть интересные "ходы", обязательно запользую.
Улыбнуло:
//какая то проверка
if( (R2 & 0x1F) != 0x05)
Может стоит написать что-то типо: "Проверка получения данных флешкой"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2014, 17:31
Помогаю со студенческими работами здесь

Помогите разобратся с указателями на структуры и массивы.
Доброго всем времени суток! Собрал я себе LED куб 5*5*5 по схеме с радио кота, прошивка оттуда же. Все работает отлично. Захотелось...

USART в ATmega8515. Помогите разобратся
Здравствуйте! Нужно чтобы микроконтроллер выдавал в ком порт любой символ Пример кода взял из даташит на мегу8515, но почему-то...

STM32F407 помогите разобратся с тактированием/таймерами
Для платы STM32F4-Dyscovery (STM32F407 на борту) пытаюсь вручную настроит тактирование. Источник частоты: HSE(кварц на 8МГц) -&gt; PLL. ...

Помогите разобратся
Есть готовые html-страницы и зарегистрированный сайт который уже действует в интернете, причем работает на joomola. Как разместить готовые...

реестр ПоМогиТе разобратся
Пишу программу для зашиты пользователя с помощью добавления ключей в реестр. Пример: reg =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как украсить новогоднюю елку с Q# и Qiskit
EggHead 24.06.2025
Что может быть необычнее, чем применить законы квантовой механики для украшения новогодней елки? Пока другие развешивают обычные гирлянды, я решил объединить свою страсть к квантовым вычислениям с. . .
Системы нулевого доверия на C#
UnmanagedCoder 24.06.2025
Традиционная архитектура безопасности работает по принципу средневекового замка: создаём высокие стены вокруг корпоративной сети, укрепляем ворота межсетевыми экранами и системами обнаружения. . .
Снова не мой путь. Циклическое среднее, я обеими руками за проверку условия, в ракурсе данной задачи - циклическое среднее в топку.
Hrethgir 24.06.2025
Привет. Такой вопрос - нужно выводить среднее математическое между двумя направлениями, интервал значений которых может лежать в диапазоне одного оборота по кругу. Проблема заключается в том, что. . .
Деплой Flask приложения
py-thonny 23.06.2025
За годы работы с Flask я натыкался на одни и те же грабли достаточно часто, чтобы наконец научится их обходить. И сегодня хочу поделится опытом, который сбережет вам немало нервных клеток. Начнем с. . .
WebAssembly и контейнеры в .NET Aspire для оркестрации распределенных архитектур
ArchitectMsa 23.06.2025
Я наблюдаю, как WebAssembly (или просто WASM) постепенно выходит за рамки своего первоначального предназначения — исполнения кода на стороне браузера. Теперь эта технология проникает в серверную. . .
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru