Яка правильна послідовність команд для ініціалізації картки microSD в SPI?


18

Я намагаюся інтерфейсувати карту microSD (2 Гб, Kingston, Sandisk) з контролером Silicon Labs C8051F931 .

Мене дуже бентежить послідовність, яку я повинен дотримуватися для ініціалізації. У книзі Проекти SD-карт за допомогою мікроконтролера PIC на сторінці 135 згадується:

Отже, кроки для переключення SD-карти в режим SPI повинні бути такими:
Включення живлення.
• Надішліть щонайменше 74 тактових імпульсу на карту з CS та Data Outlines, встановленими на логіку "1."
• Встановіть лінію CD на низькому рівні.
• Надішліть 6-байтну команду CMD0 “40 00 00 00 00 95”, щоб перевести картку в режим SPI.
• Перевірте відповідь R1, щоб переконатися, що біти помилок не встановлені.
• Відправляйте команду CMD1 кілька разів, поки біт "в режимі очікування" у відповіді R1 не встановиться на "0"
• і не встановлено бітів помилок. Картка тепер готова до операцій читання / запису.

Я спробував це, але отримую 01 навіть для CDM1. 00 очікується.

Також тут я бачу іншу послідовність команд, де він відправляє CMD8 після CMD0. Але в книзі сказано, що я мушу надсилати CMD1.

Яка правильна послідовність?

Відповіді:


34

Насправді більшість інформації / коду, які ви можете знайти при ініціалізації SD, або датовані, або неточні, оскільки вони передують SDHC та SDXC роками. Наразі ця процедура є складнішою, оскільки вона змушує вас поводитися зі старим обладнанням, сумісним назад.

По-перше, як зазначають інші, виберіть низьку початкову тактову частоту (як правило, в діапазоні 100 кГц - 400 кГц; по можливості використовуйте 400 кГц); згодом ви зможете перейти на більш високі годинники, якщо пристрій це дозволяє. Незважаючи на те, що нові картки можуть безпечно протистояти тактовій частоті МГц, старші будуть скаржитися (тобто не спілкуватись та не повертати сміття).

Наступне - ви не повинні використовувати CMD1для ініціалізації карт SD / SDHC / SDXC, якщо ваша карта не розпізнає CMD55/ ACMD41; як зазначено в специфікації SD Card:

У будь-якому з випадків CMD1 не рекомендується, оскільки хосту може бути важко розрізнити MultiMediaCard та SD-карту пам'яті.

Деякі контролери (в основному новіші та більші картки ємністю) просто залишатимуться в IDLE, якщо ви CMD1їх видасте . Спершу слід видати CMD8 0x1AAпісля скидання ( CMD0), а потім спробувати використовувати CMD55 + ACMD41. Якщо і тільки якщо це не вдасться, використовуйте CMD1.

tl; dr для ініціалізації карти в режимі SPI слід:

  1. CMD0arg:, 0x0CRC: 0x95(відповідь :) 0x01- зауважте, що у випадку 0xFFзіткнення або відповіді вам просто слід повторити цей крок; див. нижче для отримання додаткової інформації.

  2. CMD8arg:, 0x000001AACRC: 0x87(відповідь:, 0x01після чого відлуння аргументу, в цьому випадку 0x000001AA) - хоча може здатися, що ця команда є необов'язковою, вона є абсолютно обов'язковою для нових карт. Хоча 0x1AAтут загальне значення аргументу, ви можете фактично передавати й інші значення; див. "Таблиця 7-5: Операція карткою для CMD8 в режимі SPI", стор. 108 в специфікації для деталей.

    3а. CMD55arg:, 0x0CRC: будь-який, 0x65власне (відповідь 0x01:; CMD55будучи префіксом до кожного ACMD ; якщо відповідь є 0x05, у вас є стара карта - повторіть CMD1з arg 0x0[CRC 0xF9] замість CMD55/ ACMD41)

    3б. ACMD41, arg:, 0x40000000CRC: будь-який, 0x77насправді (зауважте, що цей аргумент передбачає, що карта є HCS, що зазвичай є випадком; використовуйте 0x0arg [CRC 0xE5] для старих карт). Якщо відповідь є 0x0, ви все в порядку; якщо це 0x01, goto 3a; якщо це так 0x05, див. примітку до нього вище (у 3а.); якщо це ні, то з цим щось не так (див. також нижче).

Більшість карток вимагаютьCMD1 повторення етапів 3a / 3b (або для старих карт), як мінімум, хоча б один раз, навіть якщо ви зачекаєте деякий час між ними ; тобто фактична послідовність: CMD0/ CMD8/ CMD55/ ACMD41/ CMD55/ ACMD41(або CMD0/ CMD8/ CMD1/ CMD1) - щоб бути впевненим, спробуйте CMD55/ ACMD41(або CMD1якщо ви отримали 0x05від них) разів (виберіть за своєю причиною; насправді досить часто потрібно чекати пару сотень мс, якщо пристрій знаходиться відразу після включення, тому націліться на це), з невеликими затримками між спробами, якщо хочете, і припускайте, що не вдасться, якщо відповідьнн0не відображається (тобто якщо пристрій перебуває в режимі IDLE з якихось причин). Крім того, прийом 0xFFвід CMD0звичайних, якщо пристрій раніше знаходився в якомусь "дивному" стані (наприклад, повісив трубку, знеструмлював S̲S̲ [високо], мав перенапруга на деяких штифтах тощо) - просто дайте йому деякий час, промийте та повторіть разів. Поражена відповідь на інколи цілком гарна - якщо ви надіслали її кілька разів, а відповідь все ще не є ані ні , спробуйте йти вперед . Якщо це працює - вам добре піти; якщо цього немає - він, ймовірно, зламаний .нCMD00xFF0x01CMD8

Зауважте, що відповіді, встановлені MSB, але 0xFFзазвичай не означають, що ваш SPI змінився в тактовому режимі (як результат, наприклад, падіння Vcc, що відбувається звичайно, коли ви робите гарячі штрихи SD). Щоб виправити це, ви можете спробувати повністю скинути пристрій (увімкнення / вимкнення живлення, вимкнення / затвердження S̲S̲ тощо); зазвичай це працює.

Також специфікація говорить

Після останньої транзакції шини картки пам'яті SD, хост повинен надати 8 (вісім) тактових циклів, щоб картка завершила операцію, перш ніж вимкнути годинник.

Він може працювати і без нього, але оскільки 8 циклів = 1 байт виводу SPI, це не зашкодить багато, і це просто добре мати.

Зауважте, що вам слід стверджувати, що S̲S̲ (він же CS) є низьким принаймні до і після кожного CMD- це цілком обов'язково у випадку CMD0(пристрій не вмикається без нього) і насправді потрібно для всіх інших CMD, якщо у вас є стандарти -сумісна SD-карта. Постійне підключення S theS̲ картки до GND може здатисябути хорошою ідеєю, якщо картка є єдиним клієнтом SPI, до якого хостик коли-небудь підключиться, тому що це заощадить вам і вихідний контактний вивід UC, і необхідність керувати ним кодом взагалі, і тому що карта повинна припускати, що вона вибрана всім того часу. Насправді деякі карти (якщо не більшість з них) насправді очікують, що нахил від високого до низького увімкнеться замість того, щоб просто виявити низький, і таким чином розлютитися, якщо ви взагалі не перемкніть S̲S̲ біт, а потім і не будете відставати годинники або плювати сміття; деякі (як правило, новіші) карти повинні працювати, деякі (старші) можуть не, YMMV (ще раз). Однак для будь-якої більш надійної конфігурації SPI (> 1 підлеглий пристрій) не забудьте стверджувати штифт перед будь-якою фактичною транзакцією з даною SD-карткою.

Крім того, хоча специфікація говорить про те, що CRC має бути CMD0і CMD8повинен мати лише режим SPI, деякі SD-карти (як-от Transcend), здається, вимагають належної CRC для CMD55/ ACMD41- якщо ви хочете бути в безпечній стороні, просто використовуйте для них попередньо обчислене значення.

Крім того, хоча SPI не потребує підтягувань / падінь самостійно, кидання 47-дюймового підключення на MISO може бути хорошою ідеєю; деякі пристрої залишають свій DO-контакт високим Z за певних обставин (не ініціалізується, наприклад), а плаваючі штифти завжди можуть бути джерелом дивних проблем. Якщо ваш ЦК має 3,3 Вц, ви можете використовувати внутрішні підтягувачі; якщо це 5V, не робіть цього, якщо ваша лінія MISO вже не має правильного 5-> 3.3V логічного перекладу.

Подальше читання:

Як користуватися MMC / SDC

Специфікації SD Частина 1 Спрощений фізичний рівень Спрощена специфікація - головне розділи 6.4.1 Увімкнення живлення та 7.2.1 Вибір та ініціалізація режимів на рисунку 7-1 : Діаграма стану картки пам'яті SD (режим SPI)


4

Характеристики для SD-карт доступні на sdcard.org . Спрощена версія залишила деякі деталі, але вам слід подивитися, наприклад, малюнок 7-2 у частині 1, де послідовності ініціалізації пояснюються для SDHC та SD карт.

Картки MicroSD <= 2 Гб можуть працювати як більш старі картки, тому вони повинні дати 0x00результат у CMD1 результаті . Для цього може знадобитися більше декількох спроб, оскільки картка може використовувати зовнішній годинник з шини SPI для керування деякою внутрішньою обробкою.


2

Додавши до @vaxquis чудову відповідь, я хотів би навести відповідну діаграму з " Спрощеної специфікації для фізичного рівня версії 4.10 , © Copyright 2001-2013 Група SD (Panasonic, SanDisk, Toshiba) та асоціації SD-карт" (рис. 7-2 : Потік ініціалізації режиму SPI):

Послідовність дії SPI SD Card SDI

Тут ви можете побачити, які команди надсилати в якому порядку і що відповіді повідомляють нам про тип картки. Я думаю, бажано, щоб пристрій підтримував якомога більше карт; і якщо мова йде про основні операції з читання і запису блоків 512 байт, це повинно бути виконано принаймні для всіх карт V1.x і V2.0 SD і HC.


2

Я пропоную це як іншу можливість .. У режимі SPI Samsung MicroSD EVO 32GB вимагає, щоб усі коди команд мали дійсні коди CRC. Б'юсь об заклад, що вони не єдині. Я прочитав коментар, де людина вважала, що всі картки вище 32 ГБ можуть бути саме таким. Я налагоджую помилку більше тижня. Мій код не працює, поки всі коди, надіслані на карту, не мають дійсних кодів CRC. Я використовував це для обчислення всіх кодів CRC https://github.com/hazelnusse/crc7/blob/master/crc7.cc, я навіть намагався за допомогою команди 59 відключити коди CRC, nope. Я сподіваюся, що це заощадить комусь іншому багато часу та сил.

Мій код ініціалізації зі значеннями CRC ..

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

Ви впевнені, що ваша шина SPI працює на частоті 400 кГц? Ініціалізація повинна відбуватися з шиною SPI, яка працює на частоті 400 кГц, поки SD Card не повідомить, що вона знаходиться в режимі очікування, після чого тактова частота шини SPI може бути збільшена (точний максимум, здається, залежить від виробника до виробника, але здається, що 12 МГц - безпечна ставка для більшості карт).

Також відповідно до цього: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 - це правильна ініціалізація. CMD8 необхідний лише для запиту діапазону напруги, що не повинно бути проблемою для карт, що не є SDHC (<= 2 Гб).


насправді багато SD-карти (в основному новіші, моя Sony SR-32C4 32GB є однією) взагалі не запускатимуться без CMD8попереднього оформлення. Крім того, годинник зазвичай не є проблемою, якщо він знаходиться в межах розумного діапазону.
vaxquis

-3

Можливо, це вже пізно, але відповідь з картки в порядку! Після CMD0 відповідь має бути 0x01 - це означає, що карта знаходиться в режимі бездіяльності та готова до роботи. Якщо у вас є щось на зразок 0b00000101, 1 на другому місці говорить про те, що це незаконне командування, а 1 на 0-му місці говорить, що sard IS все ще знаходиться в режимі IDLE і готовий до роботи. Якщо відповідь 0x00, це означає, що картка НЕ ​​перебуває в режимі бездіяльності і вам потрібно надіслати ще одну команду RESET.


ви читали питання взагалі? OP ясно сказав I tried this, but I am getting 01 even for CDM1- отримання IDLE у відповідь CMD1на NOT OK. Ви не вирішуєте його справжню проблему своєю "відповіддю".
vaxquis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.