Перейти к содержанию
    

Дак тогда ошибки будут возможны, поскольку как microSD отличит CRC от данных(интересуют случаи когда контроль отключён и включён)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А точно, что-то я про это забыл. Всё теперь понятно, буду пробовать что-то записать и считать пока в одноблочном режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот кусок кода определения типа и размера карты из содержимого 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 - посекторная.

Изменено пользователем polyname

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А адрес блока для команд 17,18, 24 как формируется, если блок по 512 байт? Т.е. посылаю команду и указываю для первого блока адрес 1, а для второго 2 или 1, а затем 513?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для карт V1 (<4G) передается адрес байта - 0, 512, 1024, ... (т.е. номер сектора сдвигается на 9бит)

для V2 (>=4G) - 0,1,2,3...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализация прошла, а вот запись что-то не проходит. Послал Data Token как для команды 24, на следующей посылке получил ответ нули (вопрос на какой посылке надо считать ответ token? ) и затем получаю всякие разные данные при отправке моих посылок всего 512 байт это нормально? после отправки СRC в ответе все FF. Карточка на 1Гб, карточка на 2Гб вообще отказалась сброситься.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос на какой посылке надо считать ответ token?
первый полученный байт с нулевым битом 7 - это R1:

cresp.png

 

после получения R1 перед передачей Data Packet нужно послать минимум 1 пустой байт 0xFF:

ws.png

также неплохо посылать 0xFF после каждой команды.

Изменено пользователем polyname

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делаю следующее:

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

Изменено пользователем Kruftin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Карточка на 2Гб почему-то совсем не откликается на CMD0 (

 

Всё работает :yeah: была ошибка в коде...

Изменено пользователем Kruftin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос в следующем: при записи по SPI я пишу несколько мегабайт и на пути могут встретиться бэд кластеры, то они будут проигнорированы(заменены контроллером внутри микроСД на рабочие) или просто запись в них не пройдёт и надо для всех данных включить CRC?

Изменено пользователем Kruftin

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё вопрос по многоблочному чтению:

после посылки команды CMD12 на завершение чтения приходит ответ 0х00, а затем на линии держится высокий уровень, т.е. нет ожидания в один байт и сигнала busy, но всё считалось и верно. Может кто сталкивался с этим?007.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...