Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SD Card - програмная реализация интерфейса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4, 5
John Silver
Спасибо за ответ.
Попробую, хотя меня берут сомнения в целесообразности. Ведь я пользуюсь только функцией rcvr_spi, и в конце всегда вычитываю буфер приема, откуда взяться невычитанным данным.
Или я что-то не учел?

Нашел баг в либе FatFs.
Код
Fres = f_getfree(0, &p1, &pfs);
    CardSize = (DWORD)(pfs->max_clust - 2) * pfs->csize / 2;
    FreeSize = p1 * pfs->csize / 2;
    BuzySize = CardSize - FreeSize;


Для MMC и SDv1 свободное место считает нормально. Для SDv2 - врет (карта почти пустая, а из 2 ГБ высчитывает свободных ~200 кБ).
John Silver
Контроль буфера приема перед новым чтением с карты, ситуацию не поменял.

Убрал задержки после изменения CS, оставил задержку только в фукции чтения SPI.
Уменьшил задержку:
80 мкс - все читает, SDv2 врет свободное место
60 мкс - все читает, SDv2 врет свободное место
50 мкс - SDv2 читает нормально свободное место
40 мкс - SDv2 читает нормально свободное место
25 мкс - не инициализирует
почистил контакты
30 мкс - все читает
20 мкс - не инициализирует
10 мкс - не инициализирует
Остановлся на 40мкс. Хотя раньше на 50мкс уже ничего не проходило.

Функция f_getfree(0, &p1, &pfs) нормально работает.

Вобщем мистика.
aaarrr
Таки да, мистика. Особенно вылезающие проблемы при увеличении задержки.

Карта случайно не пучком проводов подключена?
John Silver
Шлейф, примерно 10 см.
MOSI и CLK идут сначала на дисплей, с него на карту. MISO и CS сразу на карту.

Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла

На 400 кГц инициализация не проходит, всмысле, довольно низкая частота.
А вообще, конечно, надо будет напрямую к разъему подпаяться короткими проводами, авось сдесь собака и порылась.
aaarrr
Цитата(John Silver @ Nov 8 2008, 02:14) *
А вообще, конечно, надо будет напрямую к разъему подпаяться короткими проводами, авось сдесь собака и порылась.

Да уж, весьма вероятно sad.gif
И еще рекомендую поставить 10к pull-up'ы на все линии SD-карты, в том числе и неиспользуемые.
zltigo
Цитата(John Silver @ Nov 8 2008, 02:14) *

C этих фотографий и следовало начинать, а не морочить голову....
John Silver
Укоротил провода.
Поставил задержку 20 мкс - не инициализирует.
Нажмите для просмотра прикрепленного файла

1. На 400 кГц - 10 см это не длина.
2. Задержка стоит после посылки каждых 8 бит, т.е. 8 бит проходят нормально, а потом вдруг длинные провода начинаю искажать сигнал?
3. Задержка на всех частотах одинаковая. Написал это и подумал, что надо сделать разные задержки для разных частот, может это даст пищу для размышлений.
John Silver
Проверил.
Во время инициализации поставил задержку 40 мкс (уменьшать не пробовал).
После инициализации задержку поставил 0 мкс (т.е. только вызов Delay_mks(0)).

После перепайки картоприемника, при вставке SDv2, вешается дисплей, видимо много жрет и просаживает питание. Потом надо будет навешать кондеров.

Вощем уже можно нормально работать.
aaarrr
Цитата(John Silver @ Nov 8 2008, 16:32) *
1. На 400 кГц - 10 см это не длина.

Дело не в килогерцах, а в быстрых фронтах. Такой дизайн работать не должен вообще.
John Silver
ИМХО в данном случае дело не в проводах. Как сделаю целевую плату обязательно отпишусь.

Вы лучше скажите, многоуважаемые гуру, как происходит работа с картой в библиотеке FatFs.
Основной вопрос: как и как часто происходит перезапись FAT?
При каждой записи в файл, или при пересечении границ сегмента, или только при вызове f_sync (FIL*)?
Я чет пока немогу вкурить все эти FAT, MBR, PBR....

У меня задача логить ~100 байт в файл с интервалом в 10с. Возникает вопрос: долго карта выдержит?
Wano
Цитата(John Silver @ Nov 9 2008, 01:29) *
У меня задача логить ~100 байт в файл с интервалом в 10с. Возникает вопрос: долго карта выдержит?



Друг в Минске работает на конторе, пишут нижний уровень для контроллеров карточек SD. Говорит, там имеются алгоритмы слежения за числом обращений к секторам. Миллион циклов перезаписи вполне может быть и не пределом.По этому поводу хочу спросить про такую идею:
Если заранее создать файл n-ого размера и заполнить его нулями. Значит FAT таблица будет создана и при последующей записи в этот файл она меняться не будет. Выходит это 100% защита от повреждения FAT таблиц при пропадания питания . Также это уменьшение обращений к таблицам, что экономит ресурс. Или чего-то не так smile.gif ?
aaarrr
Цитата(Wano @ Nov 9 2008, 19:22) *
Или чего-то не так smile.gif ?

Все почти так, только с таким файлом на PC не очень удобно работать, и 100% защиты от повреждения FAT при пропадании питания это, конечно, не дает.
LordVader
Может кому будет полезно... Иногда бывают проблемы с инициализацией. ВРоде бы всё по даташитам, но конкретная карточка не инициализируется, хоть убей. Иногда помогает инициализация на низких скоростях, как в этом топике обсуждается.

Но есть методы борьбы без снижения скорости: один метод предложен и проверен тут: http://dlcorp.ucoz.ru/_fr/2/MMCSDCard.pdf (страница 5, сверху). Другой метод - настоить ваш SPI так, чтобы последний переданный бит оставался на выходе SPI MOSI после конца обмена. Тоже помогает, но может статься, что это невозможно в данном МК. Тогда первый метод из ПДФки прокатывает.

PS: оба эти метода проверил и применяю лично. Помогают.
John Silver
Честно говоря меня этот код из даташита настораживает, никаких проверок Response, только b!=0xFF. Как то нехорошо...
В чем суть метода? Ловить 0xFF перед проверкой Response?
Хотя это не для меня, у меня вечный 0xFF в ответе.

Кстати по последнему разбору, у меня требуется задержка только для команды CMD0.
Чет у меня впечатление, что с питанием нехорошо, на выходных посмотрю.
LordVader
Цитата(John Silver @ Nov 11 2008, 13:21) *
Честно говоря меня этот код из даташита настораживает, никаких проверок Response, только b!=0xFF. Как то нехорошо...
В чем суть метода? Ловить 0xFF перед проверкой Response?
Хотя это не для меня, у меня вечный 0xFF в ответе.

Кратко суть такова:
послать команду
поймать респонс как по даташиту
перед посылкой следующей команды слать ФФ, пока в ответ тоже не придёт ФФ

Цитата
Кстати по последнему разбору, у меня требуется задержка только для команды CMD0.
Чет у меня впечатление, что с питанием нехорошо, на выходных посмотрю.

Именно, проблема только при инициализации, насколько я помню,
Leopold111
Всем спасибо!!! Вопрос решил. Сделал внешнее питание (от USB) на lm317. Все пошло!!! Инициаллизируется CMD1. Все отвечает и принимает. Оказалось карточка отвечает и без питания. Чудо, но факт! Отрубаю питание и возвращаюсь в старое состояние. Так что смотрите питание.
aaarrr
Цитата(Leopold111 @ Nov 11 2008, 20:13) *
Оказалось карточка отвечает и без питания. Чудо, но факт! Отрубаю питание и возвращаюсь в старое состояние.

Совсем без питания она отвечать не может, естественно. Просто карта у Вас запитывается паразитным образом через линии интерфейса.
John Silver
Цитата(John Silver @ Nov 9 2008, 01:29) *
Как сделаю целевую плату обязательно отпишусь.


Таки сделал плату.
Теперь задержка понадобилась и в CMD16.

Задержка после каждых 8 бит
CMD0:
10 мкс - не проходит
20 мкс - не проходит
30 мкс - Ок
40 мкс - Ок
CMD16:
0 мкс - не проходит
10 мкс - не проходит
20 мкс - не проходит
30 мкс - Ок
40 мкс - Ок
Остальные команды:
0 мкс - Ок
07.gif
Hermes
Цитата(aaarrr @ Dec 28 2006, 19:50) *
А мои - бесплатными. cool.gif Новый год, все-таки. santa2.gif.
Вот оно - Нажмите для просмотра прикрепленного файлаПишите, если будут вопросы.

а можно и мне ? smile.gif
aaarrr
Цитата(Hermes @ Dec 24 2008, 23:20) *
а можно и мне ? smile.gif

Те исходники уже не откопаю, но могу предложить наиболее полезную часть, на которую так любят забивать в "бесплатных примерах" - подсчет CRC для команд и данных.

Код
//******************************************************************************

u_int sd_crc7(u_char *buff, u_int len)
{
    u_int a, crc = 0x00;

    while(len--)
    {
        crc ^= *buff++;
        a = 0x08;
        do
        {
            crc <<= 0x01;
            if(crc & 0x100) crc ^= 0x12;
        } while(--a);
    }
    return (crc & 0xfe);
}

//******************************************************************************

const u_short sd_crc16_table_a[0x10] =
{
    0x0000, 0x1231, 0x2462, 0x3653,
    0x48c4, 0x5af5, 0x6ca6, 0x7e97,
    0x9188, 0x83b9, 0xb5ea, 0xa7db,
    0xd94c, 0xcb7d, 0xfd2e, 0xef1f
};

const u_short sd_crc16_table_b[0x10] =
{
    0x0000, 0x1021, 0x2042, 0x3063,
    0x4084, 0x50a5, 0x60c6, 0x70e7,
    0x8108, 0x9129, 0xa14a, 0xb16b,
    0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

u_int sd_crc16(u_char *buff, u_int len)
{
    u_char data;
    u_short crc = 0x00;

    while(len--)
    {
        data = *buff++ ^ (crc >> 0x08);
        crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8);
    }
    return crc;
}

//******************************************************************************
gnomik_
Здравствуйте. Очень уж надо поработать с SD картой совсем даже не в SPI режиме. Если кому не жалко поделитесь пожалуйста полным(не обрезанным) даташитом. help.gif


Спасибо тому, кто отзовется.
jorikdima
Цитата(gnomik_ @ Nov 9 2009, 07:11) *
Здравствуйте. Очень уж надо поработать с SD картой совсем даже не в SPI режиме. Если кому не жалко поделитесь пожалуйста полным(не обрезанным) даташитом. help.gif

Даташитом на что? На интерфейс с СД?
http://www.sdcard.org/developers/
gnomik_
На интерфейс с SD card, где не пропущена организация обмена в SD mode rolleyes.gif
По обмену по SPI информации достаточно, но по SD режиму она минимальна.
Возникают вопросы по расчету CRC (если по 4-м линиям) и много других.
Paramon
Цитата(etoja @ Dec 29 2006, 10:43) *
В файле "sd_spi_ep93xx.rar ", присланном aaarrr нет файловой системы. Есть только
функции чтения и записи блока.




прошу прощения от всех ПАРАМОНОВ в мире, но попробуйте опытный образец(давнишний),
но AAARRR не ругайте, он мне давно помог.(Они, Они Мессир!)
попробуйете,может я сплоховал.
то,что есть.
/это не основа,но "мусор" или правда для пытливого мозга./
если посмотроите, то как в ms dos, (TEST не dcx`n)
библиотека без особых переделок годится во многом./

(прошу прощения утром будет посылка) /нет связи/'
zltigo
Цитата(gnomik_ @ Nov 9 2009, 13:21) *
Возникают вопросы..

Ответ простой - SD софтрово реализовывать бессмысленно. Ну а железный контроллер на то и контроллер, что многое что делает.
gnomik_
CRC7 считаем по команде.
CRC16 по данным. Правильно?
При обмене по 4-м линиям CRC Считается по каждой линии. Правильно?
При этом для каждой линии расчитывать CRC7 или CRC16 или какой другой CRC?

Спасибо. rolleyes.gif
aaarrr
1-3 - правильно, 4 - CRC16, естественно.
gnomik_
Цитата(aaarrr @ Nov 11 2009, 00:12) *
1-3 - правильно, 4 - CRC16, естественно.


Спасибо.

Разбираюсь с инициализацией.

А по линиям раскидывать и считать CRC - хитрый алгоритм предвидится однако biggrin.gif
Golikov A.
Всем привет! у меня 8 конкретных вопросв по поводу работы СД карты в SPI режиме

1. Почему без посылки 0xFF, то есть без 8 пустых клоков на шине между командами, команды перестают работать, есть официальное объяснение этого факта?

2. После передачи пакета данных, токен данные приняты-отвергнуты появлется сразу или может быть пауза из передаваемых 0xFF

3. 55 команда вызывается 1 раз перед циклом вызовов 41 команды, или надо вызвать перед каждой 41 командой?

4. В описании написано что следует включить поддержку контрольной суммы перед использованием 41 команды, как это трактовать?

5. Есть карты СД версии младше 1.10, или это были ММЦ карты?

6. Обязательно ли поле диапазона питания для 41 команды для карт версии 2.Х?

7. Видел кто-то в официальных доках что необходимо посылать 0xFF перед пакетом данных на запись в СД карту?

8. В ответе на 58 команду не появляется старшие биты, про бит карты высокой емкости понятно карта 2 Гб, но почему нет бита установившегося питания?
даже после 8 команды поданой после 41. Не все карты поддерживают?

вроде бы все.

П.С.
уточнения
в спи режиме после ответов Р1, Р2.. и так далее нет контрольной суммы?
после команды перед ответом может быть от 0 до 8 0xFF, это правильные официальные сведения? что не больше 8?
gnomik_
Здравствуйте.

Работал с SD картой в SPI режиме, использовал схему подключения микроконтроллера к SD карте через делители.

Подскажите пожалуйста кто какую схему использует для подключения SD карты к 5-ти вольтовому микроконтроллеру для работы в SD-mode?
Интересует схема при роботе и по DAT0 и по 4-м линиям DAT(если схема подключения при этом меняется).

Спасибо за помощь.
aaarrr
Цитата(gnomik_ @ Dec 20 2009, 08:15) *
Подскажите пожалуйста кто какую схему использует для подключения SD карты к 5-ти вольтовому микроконтроллеру для работы в SD-mode?

Боюсь что по понятным причинам никто такое подключение не делает. Уже и Level Translator'ы пятивольтовые потихоньку уходят.
gnomik_
Цитата(aaarrr @ Dec 21 2009, 02:20) *
Боюсь что по понятным причинам никто такое подключение не делает. Уже и Level Translator'ы пятивольтовые потихоньку уходят.


Какие причины? Ситуации разные бывают.

Я так понимаю, что все выводы DAT и CMD к 3.3в примерно 10Ком резисторами подтягивать надо, а CLK не надо, правильно?

Посоветуйте пожалуйста какие в этом случае Level Translator'ы лучше применить из распространенных.

Спасибо.
zltigo
Цитата(gnomik_ @ Dec 21 2009, 12:17) *
Какие причины? Ситуации разные бывают.

Реальных ситуаций на самом деле немного, а уж совсем "разные" это только в воспаленном уму образуются sad.gif.
Софтовая реализация SD сама по себе уже неразумна, а уж в сочетании с чем-то пятивольтовым тем более.
gnomik_
Цитата(zltigo @ Dec 21 2009, 19:49) *
Реальных ситуаций на самом деле немного, а уж совсем "разные" это только в воспаленном уму образуются sad.gif.
Софтовая реализация SD сама по себе уже неразумна...


Тут вроде тема: "SD Card - програмная реализация интерфейса, У кого нибудь есть примеры реализации взаимодействия с SD Card?", или нет?

Но все равно спасибо. rolleyes.gif
KAlex
В ветке "для начинающих" выкладывал исходники.
http://electronix.ru/forum/index.php?showtopic=70358
gnomik_
Цитата(KAlex @ Dec 22 2009, 18:30) *
В ветке "для начинающих" выкладывал исходники.
http://electronix.ru/forum/index.php?showtopic=70358


Спасибо.

Вот еще бы совет по подключению к MK для реализации SD-mode... rolleyes.gif
KAlex
Как в ДШ нарисовано, так и подключал.
gnomik_
Цитата(KAlex @ Dec 23 2009, 18:33) *
Как в ДШ нарисовано, так и подключал.


Ваш МК был 3-х вольтовый? У меня 5-ти вольтовый. Интересно согласование. rolleyes.gif
Может у меня ДШ не того...Может я чего не доглядел. Да и английский не русский?

Спасибо.
blackfin
Цитата(gnomik_ @ Dec 24 2009, 07:34) *
Ваш МК был 3-х вольтовый? У меня 5-ти вольтовый. Интересно согласование. rolleyes.gif

Стр. 99, Рис. 4-1. Как-то, так.. rolleyes.gif
gnomik_
Цитата(blackfin @ Dec 24 2009, 15:33) *
Стр. 99, Рис. 4-1. Как-то, так.. rolleyes.gif


Спасибо за ссылку. Жаль, что там только MMC и SPI. rolleyes.gif
gnomik_
Выложите пожалуйста, кому не жалко, значение посчитанного CRC16 (полином для SD), для 512 байт заполненных одним значением, например 0хDD или 0х0C или любыми другими значениями. Желательно несколько значений. Хочу функцию проверить.

Спасибо. rolleyes.gif
aaarrr
Считать лень. Можете просто сравнить с этой функцией:
CODE

const unsigned short sd_crc16_table_a[16] =
{
0x0000, 0x1231, 0x2462, 0x3653,
0x48c4, 0x5af5, 0x6ca6, 0x7e97,
0x9188, 0x83b9, 0xb5ea, 0xa7db,
0xd94c, 0xcb7d, 0xfd2e, 0xef1f
};

const unsigned short sd_crc16_table_b[16] =
{
0x0000, 0x1021, 0x2042, 0x3063,
0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b,
0xc18c, 0xd1ad, 0xe1ce, 0xf1ef
};

unsigned short sd_crc16(unsigned char *buff, unsigned int len)
{
unsigned char data;
unsigned short crc = 0;

while(len--)
{
data = *buff++ ^ (crc >> 8);
crc = (sd_crc16_table_a[(data & 0xf0) >> 4] ^ sd_crc16_table_b[data & 0x0f]) ^ (crc << 8);
}
return crc;
}


Оказывается, я ее уже выкладывал в этой теме. Хоть бы поискали.
gnomik_
Цитата(aaarrr @ Jan 3 2010, 00:20) *
Считать лень. Можете просто сравнить с этой функцией:
..............
Оказывается, я ее уже выкладывал в этой теме. Хоть бы поискали.


Моя реализация отличается от вашей. Цели не было брать чужой (правильный) код.

Хотел только узнать готовые значения для проверки своих реализаций функции расчета CRC16(SD).

Для CRC7 добрые люди выкладывали, а вот для CRC16(SD) че-то не нашел.

Спасибо. rolleyes.gif
aaarrr
Подход какой-то странный - чем искать кем-то зачем-то подсчитанные значения, просто берете любую чужую функцию, и считаете ей значение для чего угодно.
KAlex
В свое время тоже намучился с CRC.
Выбирая между табличным и вычислителным методами пришел к компромиссу.
Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней.
И код компактный, и работает быстро.
Код
#define CRC16_POLYNOMIAL 0x1021
static unsigned short crc16_syndrome_table[256];

void gen_crc16_syndrome_table(void) {
  unsigned int c;
  unsigned int n;
  unsigned char k;
  unsigned int poly; // polynomial exclusive-or pattern
  
  poly = CRC16_POLYNOMIAL;
  for (n=0; n<256; n++) {
    c = n << 8;
    for(k=0; k<8; k++)
      c = c & (0x8000) ? poly ^ (c << 1) : (c << 1);
    crc16_syndrome_table[n] = c;
  }
}

unsigned short crc16(unsigned char * pcBlock, unsigned short len) {
  unsigned short crc = 0xFFFF;
  while (len--) crc = (crc << 8) ^ crc16_syndrome_table[(crc >> 8) ^ *pcBlock++];
  return crc;
}
zltigo
Цитата(KAlex @ Jan 3 2010, 13:45) *
Выбирая между табличным и вычислителным методами пришел к компромиссу.
Как мне кажется оптимальным будет вычисление таблицы в ОЗУ и дальнейшая работа с ней.

Экономия, допустим, Flash и повышение быстродействия (не всегда) путем засирания драгоценной для микроконтроллеров RAM таблицей это компромисс? Между чем и чем? Пример, именно компромисса между полным табличным и вычислительным методом приводил aaarrr. Причем с привязкой к конкретному вопросу, а не просто "CRC". Компромиссным вариантом в некоторых случаях может быть и развертывание побитного цикла.
gnomik_
Цитата(aaarrr @ Jan 3 2010, 18:54) *
...... просто берете любую чужую функцию, и считаете ей значение для чего угодно.


Зачем чужую? Своя есть. Хочу проверить как работает.
Ведь чужих вариантов тоже не один. rolleyes.gif

В ДШ есть пример: 512 по 0хFF, хотел проверить другие наборы.
KAlex
Цитата(zltigo @ Jan 3 2010, 15:04) *
Экономия, допустим, Flash и повышение быстродействия (не всегда) путем засирания драгоценной для микроконтроллеров RAM таблицей это компромисс?

А я и не претендовал на истину в последней инстанции. biggrin.gif
Это для моей конкретной задачи. RAMа много, ROMа мало. Вот и выкручиваюсь как могу.
И код выкладывал не для того, чтобы похвалиться. А для того, что может быть кому пригодится.
gnomik_
Цитата(KAlex @ Jan 5 2010, 18:55) *
А я и не претендовал на истину в последней инстанции. biggrin.gif
Это для моей конкретной задачи. RAMа много, ROMа мало. Вот и выкручиваюсь как могу.
И код выкладывал не для того, чтобы похвалиться. А для того, что может быть кому пригодится.


Я думаю вы сделали все правильно. Спасибо вам за ваш код.
Он пригодится.

Помогать сложно. Критиковать просто...
gnomik_
При инициализации в SD-mode карта отвечает на команды, но ответы странные:

на CMD8 отвечает 00 00 00 02 00 FF
на CMD55 отвечает 2C 00 00 00 00 7F
на ACMD41 отвечает 3F 81 FE 00 03 FF
на CMD2 выдает 14 байт, а не положенные 17(если конечно хвост не сплошные FF - что тоже странно)

Чего-то не понимаю, а чего не понимаю, еще не понимаю biggrin.gif

Может у кого было подобное, помогите советом, подскажите чего делать.? rolleyes.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.