реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> запись по SPI, microSD
Kruftin
сообщение Mar 20 2013, 05:32
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Дак тогда ошибки будут возможны, поскольку как microSD отличит CRC от данных(интересуют случаи когда контроль отключён и включён)?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 20 2013, 06:21
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А как она может "не отличить", если размер блока фиксирован?
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Mar 20 2013, 06:25
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



А точно, что-то я про это забыл. Всё теперь понятно, буду пробовать что-то записать и считать пока в одноблочном режиме.
Go to the top of the page
 
+Quote Post
polyname
сообщение Mar 20 2013, 07:39
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



вот кусок кода определения типа и размера карты из содержимого 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 - Mar 20 2013, 07:45
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Mar 22 2013, 09:13
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



А адрес блока для команд 17,18, 24 как формируется, если блок по 512 байт? Т.е. посылаю команду и указываю для первого блока адрес 1, а для второго 2 или 1, а затем 513?
Go to the top of the page
 
+Quote Post
polyname
сообщение Mar 22 2013, 12:37
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



для карт V1 (<4G) передается адрес байта - 0, 512, 1024, ... (т.е. номер сектора сдвигается на 9бит)
для V2 (>=4G) - 0,1,2,3...
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Mar 23 2013, 10:04
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Инициализация прошла, а вот запись что-то не проходит. Послал Data Token как для команды 24, на следующей посылке получил ответ нули (вопрос на какой посылке надо считать ответ token? ) и затем получаю всякие разные данные при отправке моих посылок всего 512 байт это нормально? после отправки СRC в ответе все FF. Карточка на 1Гб, карточка на 2Гб вообще отказалась сброситься.
Go to the top of the page
 
+Quote Post
polyname
сообщение Mar 23 2013, 12:32
Сообщение #23


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



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


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

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

Сообщение отредактировал polyname - Mar 23 2013, 12:35
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Mar 24 2013, 07:09
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Я делаю следующее:
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.

Сообщение отредактировал Kruftin - Mar 24 2013, 09:56
Прикрепленные файлы
Прикрепленный файл  token.txt ( 3.6 килобайт ) Кол-во скачиваний: 24
 
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Mar 25 2013, 07:02
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



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

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

Сообщение отредактировал Kruftin - Mar 25 2013, 11:40
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Apr 3 2013, 12:57
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



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

Сообщение отредактировал Kruftin - Apr 4 2013, 10:55
Go to the top of the page
 
+Quote Post
Kruftin
сообщение Apr 5 2013, 09:19
Сообщение #27


Частый гость
**

Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365



Ещё вопрос по многоблочному чтению:
после посылки команды CMD12 на завершение чтения приходит ответ 0х00, а затем на линии держится высокий уровень, т.е. нет ожидания в один байт и сигнала busy, но всё считалось и верно. Может кто сталкивался с этим?
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 16:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016