Sebenarnya, sebagian besar info / kode yang dapat Anda temukan pada inisialisasi SD adalah tanggal atau tidak, karena mendahului SDHC & SDXC oleh tahun. Prosedur ini lebih rumit saat ini, karena memaksa Anda untuk berurusan dengan perangkat keras lama dengan cara yang kompatibel dengan mundur.
Pertama, seperti yang disebutkan oleh orang lain, pilih laju clock awal yang rendah (umumnya dalam kisaran 100 kHz - 400 kHz; gunakan 400 kHz jika mungkin); Anda akan dapat beralih ke jam yang lebih tinggi nanti, jika perangkat memungkinkan untuk itu. Sementara kartu-kartu baru dapat dengan aman menahan clocking MHz-ish, yang lebih tua akan mengeluh (yaitu tidak berkomunikasi atau mengembalikan sampah).
Hal berikutnya adalah Anda tidak boleh menggunakannya CMD1
untuk menginisialisasi kartu SD / SDHC / SDXC kecuali kartu Anda tidak mengenali CMD55
/ ACMD41
; seperti yang disebutkan dalam spesifikasi Kartu SD:
Dalam beberapa kasus CMD1 tidak direkomendasikan karena mungkin sulit bagi tuan rumah untuk membedakan antara MultiMediaCard dan SD Memory Card.
Beberapa pengendali (kebanyakan kartu berkapasitas lebih baru dan lebih tinggi) hanya akan tinggal di IDLE jika Anda mengeluarkannya CMD1
. Anda harus mengeluarkan dulu CMD8 0x1AA
setelah reset ( CMD0
), dan kemudian mencoba untuk menggunakan CMD55 + ACMD41
. Jika dan hanya jika itu gagal, gunakan CMD1
.
tl; dr untuk menginisialisasi kartu dalam mode SPI Anda harus:
CMD0
arg:, 0x0
CRC: 0x95
(response 0x01
:) - perhatikan bahwa dalam kasus 0xFF
atau tanggapan kacau Anda cukup mengulangi langkah ini; lihat di bawah untuk info lebih lanjut.
CMD8
arg:, 0x000001AA
CRC: 0x87
(response 0x01
:, diikuti oleh echo of arg, dalam hal ini 0x000001AA
) - walaupun sepertinya perintah ini opsional, itu sepenuhnya wajib untuk kartu yang lebih baru. Meskipun 0x1AA
merupakan nilai arg yang umum di sini, Anda sebenarnya dapat melewati nilai-nilai lain juga; lihat "Tabel 7-5: Operasi Kartu untuk CMD8 dalam Mode SPI", hal. 108 dalam spesifikasi untuk detail.
3a. CMD55
arg:, 0x0
CRC: any, 0x65
really (response 0x01
:; CMD55
menjadi awalan untuk setiap ACMD
; jika responsnya 0x05
, Anda punya kartu lama - ulangi CMD1
dengan arg 0x0
[CRC 0xF9
] alih-alih CMD55
/ ACMD41
)
3b. ACMD41
, arg:, 0x40000000
CRC: any, 0x77
sebenarnya (perhatikan bahwa argumen ini menganggap kartu adalah kartu HCS, yang biasanya merupakan kasus; gunakan 0x0
arg [CRC 0xE5
] untuk kartu yang lebih lama). Jika responsnya baik 0x0
, Anda baik-baik saja; jika itu 0x01
, goto 3a; jika itu 0x05
, lihat catatan di atasnya (dalam 3a.); jika tidak ada, ada yang salah dengan itu (juga lihat di bawah).
Sebagian besar kartu memerlukan langkah 3a / 3b (atau CMD1
untuk kartu lama) untuk diulang, biasanya setidaknya satu kali, bahkan jika Anda menunggu beberapa waktu di antara mereka ; yaitu urutan sebenarnya adalah CMD0
/ CMD8
/ CMD55
/ ACMD41
/ CMD55
/ ACMD41
(atau CMD0
/ CMD8
/ tidak muncul (yaitu jika perangkat tetap dalam mode IDLE karena beberapa alasan). Juga, menerima dariCMD1
CMD1
CMD55
ACMD41
CMD1
0x05
nn0
0xFF
CMD0
nCMD0
0xFF
0x01
CMD8
Perhatikan bahwa respons yang memiliki set MSB tetapi 0xFF
biasanya tidak menyarankan bahwa SPI Anda mengalami pergeseran pencatatan jam kerja (sebagai akibat dari penurunan Vcc, yang terjadi secara rutin ketika Anda melakukan hotplug SD). Untuk memperbaikinya, Anda dapat mencoba mengatur ulang perangkat sepenuhnya (power on / off, deassert / menegaskan S̲S̲ dll.); itu biasanya bekerja.
Juga, kata spec
Setelah transaksi bus Kartu Memori SD terakhir, tuan rumah diharuskan, untuk menyediakan 8 (delapan) siklus clock untuk kartu untuk menyelesaikan operasi sebelum mematikan jam.
Itu bisa bekerja tanpanya, tetapi karena 8 siklus = 1 byte keluaran SPI, tidak akan banyak sakit dan hanya baik untuk memilikinya.
Perhatikan bahwa Anda harus menyatakan S̲S̲ (alias CS) rendah setidaknya sebelum dan setelah masing CMD
- masing - itu benar-benar wajib jika CMD0
(perangkat tidak akan hidup tanpa itu) dan, pada kenyataannya, diperlukan untuk semua yang lain CMD
jika Anda memiliki standar -Kartu SD yang sesuai. Menghubungkan S̲S̲ kartu ke GND secara permanen mungkin terlihatmenjadi ide yang baik jika kartu tersebut adalah satu-satunya klien SPI yang akan dihubungi oleh host Anda, karena itu akan menghemat kedua pin keluaran UC & kebutuhan untuk mengelolanya dengan kode sama sekali, dan karena kartu harus menganggap itu dipilih semua waktu. Pada kenyataannya, beberapa kartu (jika tidak sebagian besar dari mereka) benar-benar mengharapkan kemiringan tinggi ke rendah untuk hidup alih-alih hanya mendeteksi rendah, dan dengan demikian marah jika Anda tidak mengaktifkan bit S̲S̲ sama sekali, dan kemudian tertinggal jam atau ludah sampah; beberapa kartu (biasanya yang lebih baru) harus berfungsi, beberapa (lebih tua) mungkin tidak, YMMV (lagi). Namun, untuk konfigurasi SPI yang lebih kuat (> 1 perangkat slave) ingatlah untuk menegaskan pin rendah sebelum transaksi aktual dengan kartu SD yang diberikan.
Selain itu, sementara spec mengatakan itu hanya CMD0
danCMD8
harus memiliki CRC dalam mode SPI, beberapa kartu SD (seperti yang Transcend) tampaknya memerlukan CRC yang tepat untuk CMD55
/ ACMD41
- jika Anda ingin berada di sisi yang aman, cukup gunakan nilai yang telah dihitung sebelumnya untuk mereka.
Juga, meskipun SPI tidak memerlukan pullup / down dengan sendirinya, melemparkan 47k pullup pada MISO mungkin merupakan ide yang bagus; beberapa perangkat meninggalkan pin DO mereka Z tinggi dalam keadaan tertentu (misalnya tidak diinisialisasi), dan pin mengambang selalu dapat menjadi sumber masalah aneh. Jika UC Anda memiliki 3,3 Vcc, Anda dapat menggunakan pullup internal; jika 5V, jangan lakukan itu kecuali jika garis MISO Anda memiliki terjemahan logika 5-> 3.3V yang tepat.
Bacaan lebih lanjut:
Cara Menggunakan MMC / SDC
Spesifikasi SD Bagian 1 Lapisan Fisik Sederhana Spesifikasi Sederhana - bagian paling penting 6.4.1 Daya dan 7.2.1 Pemilihan Mode dan Inisialisasi dengan Gambar 7-1 : Diagram Status Kartu Memori SD (mode SPI)
CMD8
dikeluarkan sebelumnya. Juga, jam biasanya tidak menjadi masalah, asalkan itu dalam jangkauan yang masuk akal.Mungkin ini sudah terlambat, tetapi respons dari kartu itu OK! Setelah CMD0, respons harus 0x01 - ini berarti kartu IS dalam keadaan IDLE dan siap untuk bekerja. Jika Anda memiliki sesuatu seperti 0b00000101, 1 pada tempat ke-2 mengatakan bahwa ini adalah perintah ilegal dan 1 pada tempat 0-s mengatakan bahwa sard masih dalam keadaan IDLE dan siap untuk bekerja. Jika responsnya 0x00 itu berarti kartu TIDAK dalam keadaan IDLE dan Anda harus mengirim perintah RESET lainnya.
sumber
I tried this, but I am getting 01 even for CDM1
- mendapatkan IDLE sebagai tanggapanCMD1
di TIDAK OK. Anda tidak mengatasi masalah sebenarnya dengan "jawaban" Anda.