Trình tự lệnh chính xác để khởi tạo thẻ nhớ microSD trong SPI là gì?


18

Tôi đang cố gắng giao diện thẻ nhớ microSD (2 GB, Kingston, Sandisk) với bộ điều khiển Silicon Labs C8051F931 .

Tôi rất bối rối về trình tự mà tôi phải tuân theo để khởi tạo. Trong cuốn sách Các dự án thẻ SD sử dụng vi điều khiển PIC , trang 135 có đề cập:

Do đó, các bước để chuyển thẻ SD sang chế độ SPI phải như sau:
Bật nguồn.
• Gửi ít nhất 74 xung đồng hồ đến thẻ với CS và Data Outlines được đặt thành logic 1. 1.
• Đặt dòng CD ở mức thấp.
• Gửi lệnh 6 byte CMD0 40 40 00 00 00 95 95 để đặt thẻ ở chế độ SPI.
• Kiểm tra phản hồi R1 để đảm bảo không có bit lỗi nào được đặt.
• Gửi lệnh CMD1 liên tục cho đến khi bit bit ở trạng thái nhàn rỗi trong phản hồi R1 được đặt thành Số 0, Số liệu
• và không có bit lỗi nào được đặt. Thẻ đã sẵn sàng cho các hoạt động đọc / ghi.

Tôi đã thử điều này, nhưng tôi nhận được 01 thậm chí cho CDM1. 00 dự kiến.

Cũng ở đây, tôi thấy một chuỗi lệnh khác, nơi anh ta gửi CMD8 sau CMD0. Nhưng cuốn sách nói rằng tôi phải gửi CMD1.

Trình tự đúng là gì?

Câu trả lời:


34

Trên thực tế, hầu hết các thông tin / mã bạn có thể tìm thấy khi khởi tạo SD là ngày hoặc không chính xác, vì nó có trước SDHC & SDXC theo năm. Quy trình ngày nay phức tạp hơn, vì nó buộc bạn phải xử lý phần cứng cũ theo cách tương thích ngược.

Thứ nhất, như được đề cập bởi những người khác, chọn tốc độ xung nhịp ban đầu thấp (thường trong dải 100 kHz - 400 kHz; sử dụng 400 kHz nếu có thể); bạn sẽ có thể chuyển sang đồng hồ cao hơn sau này, nếu thiết bị cho phép. Mặc dù các thẻ mới có thể chịu được xung nhịp MHz một cách an toàn, nhưng cũ hơn sẽ phàn nàn (tức là không liên lạc hoặc trả lại rác).

Điều tiếp theo là bạn không nên sử dụng CMD1để khởi tạo thẻ SD / SDHC / SDXC trừ khi thẻ của bạn không nhận ra CMD55/ ACMD41; như đã nói trong thông số kỹ thuật của thẻ SD:

Trong mọi trường hợp, CMD1 không được khuyến nghị vì máy chủ có thể khó phân biệt giữa MultiMediaCard và Thẻ nhớ SD.

Một số bộ điều khiển (hầu hết các thẻ dung lượng mới hơn và cao hơn) sẽ chỉ ở trong IDLE nếu bạn cấp CMD1cho chúng. Trước tiên bạn nên phát hành CMD8 0x1AAsau khi thiết lập lại ( CMD0), sau đó thử sử dụng CMD55 + ACMD41. Nếu và chỉ khi thất bại, sử dụng CMD1.

tl; dr để khởi tạo thẻ ở chế độ SPI, bạn nên:

  1. CMD0arg : 0x0, CRC: 0x95(hồi đáp 0x01:) - lưu ý rằng trong trường hợp 0xFFphản hồi bị cắt xén, bạn chỉ cần lặp lại bước này; Xem bên dưới để biết thêm.

  2. CMD8arg : 0x000001AA, CRC: 0x87(hồi đáp : 0x01, theo sau là tiếng vang của arg, trong trường hợp này 0x000001AA) - trong khi có vẻ như lệnh này là tùy chọn, nó hoàn toàn bắt buộc đối với các thẻ mới hơn. Mặc dù 0x1AAlà một giá trị arg phổ biến ở đây, bạn thực sự có thể vượt qua các giá trị khác; xem "Bảng 7-5: Hoạt động thẻ cho CMD8 ở Chế độ SPI", trang. 108 trong spec để biết chi tiết.

    3a. CMD55arg : 0x0, CRC: any, 0x65thực sự (hồi đáp : 0x01; CMD55là tiền tố cho mọi ACMD ; nếu phản hồi là 0x05, bạn đã có một thẻ cũ - lặp lại CMD1với arg 0x0[CRC 0xF9] thay vì CMD55/ ACMD41)

    3b. ACMD41, arg : 0x40000000, CRC: any, 0x77thực sự (lưu ý rằng đối số này giả sử thẻ là HCS, thường là trường hợp này, sử dụng 0x0arg [CRC 0xE5] cho thẻ cũ). Nếu phản hồi là 0x0, bạn ổn; nếu đó là 0x01, goto 3a; nếu có 0x05, hãy xem ghi chú về nó ở trên (trong 3a.); nếu không, có gì đó không ổn với nó (cũng xem bên dưới).

CMD1CMD0CMD8CMD55ACMD41CMD55ACMD41CMD0CMD8CMD1CMD1CMD55ACMD41CMD10x05nn00xFFCMD0nCMD00xFF0x01CMD8

Lưu ý rằng các phản hồi có MSB được đặt nhưng 0xFFthường không gợi ý rằng SPI của bạn có sự thay đổi về xung nhịp (kết quả là giảm Vcc, xảy ra thường xuyên khi bạn thực hiện các nút nóng SD). Để khắc phục, bạn có thể thử thiết lập lại hoàn toàn thiết bị (bật / tắt nguồn, xác nhận lại / xác nhận S̲S̲, v.v.); nó thường hoạt động.

Ngoài ra, thông số kỹ thuật nói

Sau giao dịch bus SD Thẻ nhớ cuối cùng, máy chủ được yêu cầu, cung cấp 8 (tám) chu kỳ đồng hồ để thẻ hoàn thành thao tác trước khi tắt đồng hồ.

Nó có thể hoạt động mà không có nó, nhưng vì 8 chu kỳ = 1 byte đầu ra SPI, nó sẽ không bị tổn thương nhiều và thật tốt khi có nó.

Lưu ý rằng bạn nên khẳng định SS̲ (còn gọi là CS) thấp ít nhất trước và sau mỗi lần CMD- điều đó hoàn toàn bắt buộc trong trường hợp CMD0(thiết bị sẽ không bật nếu không có) và thực tế, bắt buộc đối với tất cả các thiết bị khác CMDnếu bạn có tiêu chuẩn thẻ SD -compliant. Kết nối SS̲ của thẻ với GND vĩnh viễn có vẻ nhưlà một ý tưởng tốt nếu thẻ là ứng dụng khách SPI duy nhất mà máy chủ của bạn sẽ kết nối, vì nó sẽ giúp bạn tiết kiệm cả pin đầu ra uC và cần phải quản lý nó bằng mã, và vì thẻ nên cho rằng nó đã được chọn của thời gian Trong thực tế, một số thẻ (nếu không phải hầu hết trong số chúng) thực sự mong đợi độ dốc từ cao đến thấp thay vì chỉ đơn giản là phát hiện thấp, và do đó tức giận nếu bạn không chuyển bit SS̲, và sau đó bị lag đồng hồ hoặc nhổ rác; một số thẻ (thường mới hơn) sẽ hoạt động, một số (cũ hơn) có thể không, YMMV (một lần nữa). Tuy nhiên, đối với mọi cấu hình SPI mạnh hơn (> 1 thiết bị phụ), hãy nhớ xác nhận mức pin thấp trước bất kỳ giao dịch thực tế nào với thẻ SD đã cho.

Bên cạnh đó, trong khi thông số kỹ thuật nói rằng chỉ CMD0CMD8nên có CRC ở chế độ SPI, một số thẻ SD (như thẻ Transcend) dường như yêu cầu CRC thích hợp cho CMD55/ ACMD41- nếu bạn muốn ở bên an toàn, chỉ cần sử dụng giá trị được tính toán trước cho chúng.

Ngoài ra, trong khi SPI không yêu cầu pullups / downs, thì ném 47k pullup lên MISO có thể là một ý tưởng hay; một số thiết bị để lại chân DO cao Z trong các trường hợp cụ thể (không được khởi tạo, ví dụ) và chân nổi luôn có thể là nguồn gốc của các sự cố lạ. Nếu uC của bạn có 3,3 Vcc, bạn có thể sử dụng pullups nội bộ; nếu là 5V, đừng làm điều đó trừ khi dòng MISO của bạn đã có bản dịch logic 5-> 3.3V thích hợp.

Đọc thêm:

Cách sử dụng MMC / SDC

SD Thông số kỹ thuật Phần 1 Giản lớp vật lý đơn giản Thông số kỹ thuật - quan trọng nhất là phần 6.4.1 Sức mạnh lên7.2.1 Chọn chế độ và khởi với Hình 7-1 : Sơ đồ nhà nước SD Memory Card (chế độ SPI)


4

Thông số kỹ thuật cho Thẻ SD có sẵn trên sdcard.org . Phiên bản đơn giản hóa bỏ qua một số chi tiết, nhưng bạn nên tìm ví dụ trong hình 7-2 trong phần 1, trong đó trình tự khởi tạo được giải thích cho thẻ SDHC và thẻ SD.

Thẻ MicroSD <= 2 GB có thể hoạt động như thẻ cũ, vì vậy cuối cùng chúng sẽ cho bạn 0x00kết quả . Điều này có thể cần nhiều hơn một vài lần thử lại, vì thẻ có thể sử dụng đồng hồ bên ngoài từ bus SPI để điều khiển một số xử lý nội bộ.CMD1


2

Thêm vào câu trả lời xuất sắc của @vaxquis, tôi muốn trích dẫn biểu đồ tương ứng từ " Thông số kỹ thuật đơn giản hóa lớp vật lý Phiên bản 4.10 , © Bản quyền 2001-2013 Nhóm SD (Panasonic, SanDisk, Toshiba) và Hiệp hội thẻ SD" (Hình 7-2 : Luồng khởi tạo chế độ SPI):

Trình tự khởi đầu SPI thẻ SD

Tại đây bạn có thể xem các lệnh sẽ gửi theo thứ tự nào và câu trả lời cho chúng tôi biết về loại thẻ. Tôi nghĩ rằng một thiết bị hỗ trợ càng nhiều thẻ càng tốt; và miễn là nói đến các hoạt động cơ bản của việc đọc và ghi các khối 512 byte, điều đó có thể thực hiện được cho ít nhất là tất cả các thẻ SD và HC v1.x và V2.0.


2

Tôi cung cấp điều này như một khả năng khác .. Trong chế độ SPI, Samsung MicroSD EVO 32GB yêu cầu tất cả các mã lệnh phải có mã CRC hợp lệ. Tôi cá là họ không phải là người duy nhất. Tôi đã đọc một bình luận trong đó người tin rằng tất cả các thẻ trên 32 GB có thể là như vậy. Tôi đã sửa lỗi trong hơn một tuần. Mã của tôi sẽ không hoạt động cho đến khi tất cả các mã được gửi vào thẻ có mã crc hợp lệ. Tôi đã sử dụng điều này để tính toán tất cả các mã CRC https://github.com/hazelnusse/crc7/blob/master/crc7.cc Tôi thậm chí đã thử sử dụng lệnh 59 để tắt mã CRC, không. Tôi hy vọng điều này sẽ giúp người khác tiết kiệm rất nhiều thời gian và công sức.

Mã khởi tạo của tôi với các giá trị 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

Bạn có chắc chắn xe buýt SPI của bạn ở mức 400 kHz? Việc khởi tạo phải xảy ra với bus SPI chạy ở tốc độ 400 kHz cho đến khi Thẻ SD báo cáo nó ở trạng thái không hoạt động, khi đó tốc độ xung nhịp bus SPI có thể tăng lên (mức tối đa chính xác có thể thay đổi tùy theo nhà sản xuất, nhưng có vẻ như 12 MHz là đặt cược an toàn cho hầu hết các thẻ).

Ngoài ra, theo điều này: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 là khởi tạo thích hợp. CMD8 chỉ được yêu cầu để truy vấn phạm vi điện áp, đây không phải là vấn đề với thẻ không phải SDHC (<= 2GB).


thực tế, nhiều thẻ SD (chủ yếu là những thẻ mới hơn, Sony SR-32C4 32GB của tôi là một) sẽ không bắt đầu mà không được CMD8phát hành trước. Ngoài ra, đồng hồ thường không phải là một vấn đề, miễn là trong phạm vi hợp lý.
vaxquis

-3

Có lẽ điều này là quá muộn, nhưng phản hồi từ thẻ là OK! Sau CMD0, phản hồi phải là 0x01 - điều này có nghĩa là thẻ IS ở trạng thái IDLE và sẵn sàng hoạt động. Nếu bạn có thứ gì đó như 0b00000101, số 1 ở vị trí thứ 2 nói rằng đây là lệnh bất hợp pháp và số 1 ở vị trí 0 nói rằng Sard vẫn ở trạng thái IDLE và sẵn sàng làm việc. Nếu phản hồi là 0x00, điều đó có nghĩa là thẻ KHÔNG ở trạng thái IDLE và bạn phải gửi lệnh RESET khác.


bạn đã đọc câu hỏi nào chưa? OP nói rõ ràng I tried this, but I am getting 01 even for CDM1- nhận được IDLE để phản hồi CMD1trong KHÔNG OK. Bạn không giải quyết vấn đề thực sự của anh ấy với "câu trả lời" của bạn.
vaxquis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.