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 CMD1
cho chúng. Trước tiên bạn nên phát hành CMD8 0x1AA
sau 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:
CMD0
arg : 0x0
, CRC: 0x95
(hồi đáp 0x01
:) - lưu ý rằng trong trường hợp 0xFF
phả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.
CMD8
arg : 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ù 0x1AA
là 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. CMD55
arg : 0x0
, CRC: any, 0x65
thực sự (hồi đáp : 0x01
; CMD55
là 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 CMD1
với arg 0x0
[CRC 0xF9
] thay vì CMD55
/ ACMD41
)
3b. ACMD41
, arg : 0x40000000
, CRC: any, 0x77
thự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 0x0
arg [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).
CMD1
CMD0
CMD8
CMD55
ACMD41
CMD55
ACMD41
CMD0
CMD8
CMD1
CMD1
CMD55
ACMD41
CMD1
0x05
nn0
0xFF
CMD0
nCMD0
0xFF
0x01
CMD8
Lưu ý rằng các phản hồi có MSB được đặt nhưng 0xFF
thườ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 CMD
nế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ỉ CMD0
và CMD8
nê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ên và 7.2.1 Chọn chế độ và khởi với Hình 7-1 : Sơ đồ nhà nước SD Memory Card (chế độ SPI)
CMD8
phá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ý.