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

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

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

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

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

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

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

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

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

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

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

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

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

Да на 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 4
Для файловой системы пока рановато. Попробуйте пройти через всю инициализацию (причём не одной и той же карты, а разных типов).
Потом - попытайтесь прочитать сектор данных.
Тогда, может быть, поймёте, о чём я говорил :-)

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

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 6
есть вот такой проект, проверенный годами: 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 7
Цитата Сообщение от fotom6
2) Как узнать диапазон доступных адресов блоков памяти?
Блоки нумеруются с нуля и до максимального номера. Общее количество блоков на карте (и вообще, её структура и полезные характеристики) записаны в CSD-дескриптор карты. CSD читается соответствующей командой (код очень похож на код для чтения блока данных), размер дескриптора 16 байт, расшифровка которых зависит от типа карты (так, у MMC, SDv1 и SDv2 формат CSD различается).

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

Имеется 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 9
Я выкладывал драйвер. Скачайте изучите.
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,230
16.11.2014, 15:32 10
Цитата Сообщение от fotom6
SD нормально работает. SDHC пишет только в 0x0000, в остальные адреса ничего не записывает
хотя в ответ шлет что все "ок" (0xE5 - данные приняты).
может-таки пишет не туда куда вы думаете?
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 270
16.11.2014, 15:46 11
Цитата Сообщение от Oxford
Я выкладывал драйвер. Скачайте изучите.
Сейчас найду, поковыряюсь.
Цитата Сообщение от Ymk
может-таки пишет не туда куда вы думаете?
Ну если верить Winhexу то везде 00 кроме нулевого сектора, который как раз единственный и перезаписывается.

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

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

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

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

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

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

Что это за ответы не понятно, так-как все форматы ответов должны начинаться с "0".
Цитата Сообщение от Oxford
Я выкладывал драйвер. Скачайте изучите.
А можно ссылку? Через поиск по форуму найти не удалось.
0
Oxford
18.11.2014, 15:59 15
найдете. здесь на форуме много чего есть учитесь искать.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
18.11.2014, 16:43 16
Цитата Сообщение от 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
Регистрация: 07.02.2106
Сообщений: 270
18.11.2014, 17:09 17
Вот допустим процедура чтения N секторов.
SD.iter - просто промежуточный подсчет шагов.

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

Код
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
Регистрация: 07.02.2106
Сообщений: 270
18.11.2014, 17:31 18
Цитата Сообщение от Oxford
найдете. здесь на форуме много чего есть учитесь искать.
Нашел))))
Есть интересные "ходы", обязательно запользую.
Улыбнуло:
//какая то проверка
if( (R2 & 0x1F) != 0x05)
Может стоит написать что-то типо: "Проверка получения данных флешкой"
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2014, 17:31
Помогаю со студенческими работами здесь

STM32F407 помогите разобратся с тактированием/таймерами
Для платы STM32F4-Dyscovery (STM32F407 на борту) пытаюсь вручную настроит тактирование. Источник...

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

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

Помогите разобратся с кодом.
Что нужно сюда дописать что бы этот код грамотно выдергивал то что мне нужно? &lt;? $content =...

помогите разобратся с терминологией
Сколько пользуюсь компом, но многих вещей не знаю. Стыдно, конечно, но узнать всеравно нужно,...

Помогите разобратся с ботами..
Значит так, держал сайты на виртуальном хосте и не знал бед. Купил сервачок свой, настроил и залил...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru