Насправді більшість інформації / коду, які ви можете знайти при ініціалізації 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 слід:
CMD0
arg:, 0x0
CRC: 0x95
(відповідь :) 0x01
- зауважте, що у випадку 0xFF
зіткнення або відповіді вам просто слід повторити цей крок; див. нижче для отримання додаткової інформації.
CMD8
arg:, 0x000001AA
CRC: 0x87
(відповідь:, 0x01
після чого відлуння аргументу, в цьому випадку 0x000001AA
) - хоча може здатися, що ця команда є необов'язковою, вона є абсолютно обов'язковою для нових карт. Хоча 0x1AA
тут загальне значення аргументу, ви можете фактично передавати й інші значення; див. "Таблиця 7-5: Операція карткою для CMD8 в режимі SPI", стор. 108 в специфікації для деталей.
3а. CMD55
arg:, 0x0
CRC: будь-який, 0x65
власне (відповідь 0x01
:; CMD55
будучи префіксом до кожного ACMD
; якщо відповідь є 0x05
, у вас є стара карта - повторіть CMD1
з arg 0x0
[CRC 0xF9
] замість CMD55
/ ACMD41
)
3б. ACMD41
, arg:, 0x40000000
CRC: будь-який, 0x77
насправді (зауважте, що цей аргумент передбачає, що карта є HCS, що зазвичай є випадком; використовуйте 0x0
arg [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̲ [високо], мав перенапруга на деяких штифтах тощо) - просто дайте йому деякий час, промийте та повторіть разів. Поражена відповідь на інколи цілком гарна - якщо ви надіслали її кілька разів, а відповідь все ще не є ані ні , спробуйте йти вперед . Якщо це працює - вам добре піти; якщо цього немає - він, ймовірно, зламаний .нCMD0
0xFF
0x01
CMD8
Зауважте, що відповіді, встановлені 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)
CMD8
попереднього оформлення. Крім того, годинник зазвичай не є проблемою, якщо він знаходиться в межах розумного діапазону.