Kruftin 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба Дак тогда ошибки будут возможны, поскольку как microSD отличит CRC от данных(интересуют случаи когда контроль отключён и включён)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба А как она может "не отличить", если размер блока фиксирован? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 20 марта, 2013 Опубликовано 20 марта, 2013 · Жалоба А точно, что-то я про это забыл. Всё теперь понятно, буду пробовать что-то записать и считать пока в одноблочном режиме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
polyname 0 20 марта, 2013 Опубликовано 20 марта, 2013 (изменено) · Жалоба вот кусок кода определения типа и размера карты из содержимого CSD (в 16-байтовом массиве sd.csd): struct { U8 ver; //CSD version: CSD_V1, CSD_V2 U8 csd[16]; //last CSD state (CMD9) U32 sectors; //number of sectors } sd; enum {CSD_V1=0, CSD_V2=1}; void sd_update_csd(void) { sd.sectors = 0; if (sd_ok()) { sd.ver = sd.csd[0] >> 6; if (sd.ver == CSD_V1) { U32 size = 1UL << (sd.csd[5] & 0xF); size *= 1UL << (((sd.csd[9] & 0x3) << 1) + (sd.csd[10] >> 7) + 2); size *= (U32)((((U16)(sd.csd[6] & 3)) << 10) + ((U16)sd.csd[7] << 2) + ((U16)(sd.csd[8] & 0xC0) >> 6) + 1); sd.sectors = size >> 9; } else if (sd.ver == CSD_V2) { sd.sectors = ((((U32)(sd.csd[7] & 0x3F)) << 16) + (((U32)sd.csd[8]) << 8) + (U32)sd.csd[9]) << 10; } } } Для CSD_V1 используется побайтовая адресация (адрес сектора нужно сдвигать влево на 9 бит при чтении/записи), для CSD_V2 - посекторная. Изменено 20 марта, 2013 пользователем polyname Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба А адрес блока для команд 17,18, 24 как формируется, если блок по 512 байт? Т.е. посылаю команду и указываю для первого блока адрес 1, а для второго 2 или 1, а затем 513? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
polyname 0 22 марта, 2013 Опубликовано 22 марта, 2013 · Жалоба для карт V1 (<4G) передается адрес байта - 0, 512, 1024, ... (т.е. номер сектора сдвигается на 9бит) для V2 (>=4G) - 0,1,2,3... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 23 марта, 2013 Опубликовано 23 марта, 2013 · Жалоба Инициализация прошла, а вот запись что-то не проходит. Послал Data Token как для команды 24, на следующей посылке получил ответ нули (вопрос на какой посылке надо считать ответ token? ) и затем получаю всякие разные данные при отправке моих посылок всего 512 байт это нормально? после отправки СRC в ответе все FF. Карточка на 1Гб, карточка на 2Гб вообще отказалась сброситься. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
polyname 0 23 марта, 2013 Опубликовано 23 марта, 2013 (изменено) · Жалоба вопрос на какой посылке надо считать ответ token?первый полученный байт с нулевым битом 7 - это R1: после получения R1 перед передачей Data Packet нужно послать минимум 1 пустой байт 0xFF: также неплохо посылать 0xFF после каждой команды. Изменено 23 марта, 2013 пользователем polyname Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 24 марта, 2013 Опубликовано 24 марта, 2013 (изменено) · Жалоба Я делаю следующее: 1)Послал команду CMD24( в качестве ответа получил нули см пункты 2-3) 2)Послал 0xFF 2 раза 3)Послал token 0xFE 5)Затем передаю данные пакета циклом по 32 бита за посылку for(i=0;i<128;i++) Первые 20 байт - это принятые данные после посылок(посылаю всегда 0xABCDEF12 ), остальное то, что принято после посылки token(т.е. во время посылки нули) и каждой посылки данных + CRC(и вопрос ещё как я понял по умолчанию СRC отключён?) Ещё раз всё поправил ка надо и в итоге после посылки token 0xFE на 5-ом принятом байте(в это время посылаются данные на запись) вижу значение 0x09, которое говорит об ошибки token - out of range. token.txt Изменено 24 марта, 2013 пользователем Kruftin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 25 марта, 2013 Опубликовано 25 марта, 2013 (изменено) · Жалоба Карточка на 2Гб почему-то совсем не откликается на CMD0 ( Всё работает :yeah: была ошибка в коде... Изменено 25 марта, 2013 пользователем Kruftin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 3 апреля, 2013 Опубликовано 3 апреля, 2013 (изменено) · Жалоба Вопрос в следующем: при записи по SPI я пишу несколько мегабайт и на пути могут встретиться бэд кластеры, то они будут проигнорированы(заменены контроллером внутри микроСД на рабочие) или просто запись в них не пройдёт и надо для всех данных включить CRC? Изменено 4 апреля, 2013 пользователем Kruftin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kruftin 0 5 апреля, 2013 Опубликовано 5 апреля, 2013 · Жалоба Ещё вопрос по многоблочному чтению: после посылки команды CMD12 на завершение чтения приходит ответ 0х00, а затем на линии держится высокий уровень, т.е. нет ожидания в один байт и сигнала busy, но всё считалось и верно. Может кто сталкивался с этим? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться