Apa urutan perintah yang benar untuk inisialisasi kartu microSD di SPI?

18

Saya mencoba menghubungkan kartu microSD (2 GB, Kingston, Sandisk) dengan pengontrol Silicon Labs C8051F931 .

Saya sangat bingung tentang urutan yang harus saya ikuti untuk inisialisasi. Dalam buku Proyek Kartu SD Menggunakan Mikrokontroler PIC , halaman 135 menyebutkan:

Maka langkah-langkah untuk mengalihkan kartu SD ke mode SPI adalah sebagai berikut:
Power-up.
• Kirim setidaknya 74 pulsa clock ke kartu dengan CS dan Garis Data diatur ke logika "1."
• Tetapkan garis CD rendah.
• Kirim perintah CMD0 6-byte “40 00 00 00 00 95” untuk meletakkan kartu dalam mode SPI.
• Periksa respons R1 untuk memastikan tidak ada bit kesalahan yang disetel.
• Kirim perintah CMD1 berulang kali hingga bit “in-idle-state” di respons R1 diatur ke “0,”
• dan tidak ada bit kesalahan yang disetel. Kartu sekarang siap untuk operasi baca / tulis.

Saya mencoba ini, tetapi saya mendapatkan 01 bahkan untuk CDM1. 00 diharapkan.

Juga di sini saya melihat urutan perintah yang berbeda di mana ia mengirim CMD8 setelah CMD0. Tetapi buku itu mengatakan saya harus mengirim CMD1.

Apa urutan yang benar?

gpuguy
sumber

Jawaban:

34

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 CMD1untuk 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 0x1AAsetelah 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:

  1. CMD0arg:, 0x0CRC: 0x95(response 0x01:) - perhatikan bahwa dalam kasus 0xFFatau tanggapan kacau Anda cukup mengulangi langkah ini; lihat di bawah untuk info lebih lanjut.

  2. CMD8arg:, 0x000001AACRC: 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 0x1AAmerupakan 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. CMD55arg:, 0x0CRC: any, 0x65really (response 0x01:; CMD55menjadi awalan untuk setiap ACMD ; jika responsnya 0x05, Anda punya kartu lama - ulangi CMD1dengan arg 0x0[CRC 0xF9] alih-alih CMD55/ ACMD41)

    3b. ACMD41, arg:, 0x40000000CRC: any, 0x77sebenarnya (perhatikan bahwa argumen ini menganggap kartu adalah kartu HCS, yang biasanya merupakan kasus; gunakan 0x0arg [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 CMD1untuk 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 dariCMD1CMD1CMD55ACMD41CMD10x05nn00xFFCMD0nCMD00xFF0x01CMD8

Perhatikan bahwa respons yang memiliki set MSB tetapi 0xFFbiasanya 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 CMDjika 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 CMD0danCMD8 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)

vaxquis
sumber
4

Spesifikasi untuk Kartu SD tersedia di sdcard.org . Versi yang disederhanakan meninggalkan beberapa detail, tetapi Anda harus melihat misalnya pada gambar 7-2 di bagian 1, di mana urutan inisialisasi dijelaskan untuk kartu SDHC dan SD.

Kartu MicroSD <= 2 GB dapat berfungsi seperti kartu yang lebih lama, jadi kartu tersebut akan memberi Anda 0x00hasil CMD1 akhirnya . Ini mungkin memerlukan lebih dari beberapa percobaan ulang, karena kartu dapat menggunakan jam eksternal dari bus SPI untuk menggerakkan beberapa pemrosesan internal.

Turbo J
sumber
2

Menambah @vaxquis jawaban yang sangat baik, saya ingin mengutip grafik yang sesuai dari " Physical Layer Simplified Specification Version 4.10 , © Hak Cipta 2001-2013 SD Group (Panasonic, SanDisk, Toshiba) dan SD Card Association" (Gambar 7-2 : Aliran Inisialisasi Mode SPI):

SD Card SPI Urutan Init

Di sini Anda dapat melihat perintah mana yang harus dikirim dalam urutan mana dan apa tanggapannya tentang jenis kartu. Saya pikir itu diinginkan bahwa perangkat mendukung kartu sebanyak mungkin; dan selama menyangkut operasi dasar pembacaan dan penulisan blok 512 byte, itu harus dapat dilakukan untuk setidaknya semua kartu SD dan HC V1.x dan V2.0.

JimmyB
sumber
2

Saya menawarkan ini sebagai kemungkinan lain .. Dalam mode SPI, Samsung MicroSD EVO 32GB memerlukan semua kode perintah untuk memiliki kode CRC yang valid. Saya yakin mereka bukan satu-satunya. Saya membaca komentar di mana orang tersebut percaya semua kartu di atas 32GB mungkin seperti itu. Saya telah men-debug bug selama lebih dari seminggu. Kode saya tidak akan berfungsi sampai semua kode yang dikirim ke kartu memiliki kode CRC yang valid. Saya menggunakan ini untuk menghitung semua kode CRC https://github.com/hazelnusse/crc7/blob/master/crc7.cc Saya bahkan mencoba menggunakan perintah 59 untuk mematikan kode CRC, tidak. Saya harap ini menghemat banyak waktu dan usaha orang lain.

Kode inisialisasi saya dengan nilai 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)
Dave
sumber
-2

Apakah Anda yakin bus SPI Anda mencapai 400 kHz? Inisialisasi harus terjadi dengan bus SPI yang beroperasi pada 400 kHz hingga SD Card melaporkannya dalam keadaan siaga, di mana laju clock bus SPI dapat ditingkatkan (maksimum persisnya tampaknya bervariasi dari produsen ke produsen, tetapi sepertinya 12 MHz adalah taruhan yang aman untuk sebagian besar kartu).

Juga, menurut ini: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 adalah inisialisasi yang tepat. CMD8 hanya diperlukan untuk menanyakan kisaran voltase, yang seharusnya tidak menjadi masalah dengan kartu non-SDHC (<= 2GB).

Zuofu
sumber
sebenarnya, banyak kartu SD (kebanyakan yang lebih baru, Sony SR-32C4 32GB saya menjadi satu) tidak akan mulai sama sekali tanpa CMD8dikeluarkan sebelumnya. Juga, jam biasanya tidak menjadi masalah, asalkan itu dalam jangkauan yang masuk akal.
vaxquis
-3

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.

Peca
sumber
sudahkah Anda membaca pertanyaannya? OP dengan jelas mengatakan I tried this, but I am getting 01 even for CDM1- mendapatkan IDLE sebagai tanggapan CMD1di TIDAK OK. Anda tidak mengatasi masalah sebenarnya dengan "jawaban" Anda.
vaxquis