giao tiep voi sd card
Minh dang lam giao tiep voi sd card de doc du lieu file mp3 trong the nho' de phat ra am thanh.co' ai biet lam,hoac co' tai lieu ve mon' nay` ko chi giup minh voi'.
|
@trachao
Bạn xem ở đây nè, code viet cho atmega8. Sơ đồ kết nối chân như trong định nghĩa trong code nên mình không post sơ đồ mạch lên. Tài liệu thì có đầy trên mạng, bạn lên google kiếm. http://my.opera.com/lcdamptech/blog/...d-bang-atmega8 |
em đang dính bệnh rất lạ , gửi cmd0 để reset thẻ thì ok, cmd1 để chuyển sang trạng thái data transfer mode cũng ok, nhưng đến lúc gửi lệnh đọc single block (cụ thể là sector 0)thì luôn response về mã lỗi 0x20, là address error. Gửi lệnh đọc các sector khác cũng bị tình trạng tương tự. Không biết bác nào bị bệnh này chưa, cho em hỏi với...
|
code bạn tự viết hay dùng thư viện. Thư viện và code mẫu cho SD card rất nhiều trên Net, bạn có thể tham khảo thư viện MDD của microchip.
http://www.microchip.com/stellent/id...cName=en537044 |
code tham khảo của bác falleaf (dùng cho chú dsPIC30F4013).Cụ thể là trong thread này:
http://www.picvietnam.com/forum/showthread.php?t=1663 Code:
#define BLOCK_SIZE 512 status = SD_ReadBlock(0, buffer); Hàm SD_WriteCommand vẫn giữ nguyên. Hàm read đã có write dummy data (write FF) Còn lệnh nào có response R1 mà test đuợc không nhỉ. Tốc độ giao tiếp phụ thuộc thế nào với các loại thẻ khác nhau. Khởi tạo thẻ nhớ với tốc độ 150k, gửi lệnh cmd0 để reset thẻ, R1 = 0x01 (ok..đã in idle state). Sau đó gửi lệnh cmd1 để vào data transfer mode. Chuyển tốc độ lên 1.25MHz. R1 = 0x00 (đã vào mode transfer) Sau đó gửi lệnh CMD17 để đọc single block thì toàn response 0x20 Ở đây em chỉ đọc 512 byte bắt đầu từ địa chỉ 0x00, không biết đó có phải sector 0 hay ko. (em đã quét cả dải địa chỉ mà vẫn báo về như thế...) CRC có chú ý gì ko? |
Trích:
|
MPLAB IDE 8.36 với C30 version 3.20
Loại thẻ nào có thể ăn với lệnh CMD55+ACMD41...Em gửi lệnh này sau khi đã reset thẻ thì nó báo về R1 = 0x05 (illegal command + in idle state) |
Trích:
Bạn phải chờ tới khi card trả lời CMD55 hoặc timeout rồi mới gửi ACMD41 Bạn thử gửi ACMD41 với các tham số Code:
unsigned char ACMD41_SD_SEND_OP_COND[] = {41,0x40,0x00,0x00,0x00,0xFF}; |
Code:
// Send CMD55, required to precede all "application specific" commands Gửi ACMD41 trả về 0x05, in idle state and illegal command có phải lệnh CMD1 và CMD55+ACMD41 là tương đương nhau ? Bản MDD 1.2.1 down về, ko thấy support dòng dsPIC33, cũng ko thấy chỗ nào gán thanh ghi cho dspic33, mặc dù tiêu đề ghi là có hỗ trợ. Đương nhiên là có thể sửa từ PIC24, Hay là phần cứng có vấn đề gì (e chỉ nối MOSI, MISO, SS, CLK). Thằng này có tính năng remappable, nhưng em chỉ remap cho thằng MOSI, MISO, CLK, còn SS thì define cho 1 pin khác. |
Trích:
Trích:
Trích:
CMD55+ACMD41 để chuyển từ IDLE sang hoạt động và chỉ dùng cho thẻ SD Tuy nhiên vì thẻ SD tương thích với thẻ MMC nên mình nghĩ bạn có thể bỏ qua CMD55+ACMD41 và gửi lệnh SET_BLOCK_LEN = 512 (command 16), sau đó kết thúc phần init bằng 8 lần ghi 0xff. Đoạn code mẫu của anh Hiệp thiếu lệnh SET_BLOCK_LEN, có lẽ đây là lý do làm bạn nhận về mã lỗi địa chỉ sai. Trích:
Khi khởi động, card ở chế độ SD, do đó chân SDO của card là opendrain, bạn cần 1 con điện trở pull-up ở chân này, từ 10k-50k. |
Cảm ơn bác đã giúp. Đoạn gửi ACMD41 đúng là em hơi sơ xuất, em chỉ loop mỗi gửi ACMD41, đáng nhẽ phải loop cả CMD55 và ACMD41
Trích:
Trích:
Khi send 6 byte lệnh, có delay giữa các byte hay ko hay là gửi liên tiếp, Code:
unsigned char SD_WriteCommand(unsigned char* cmd) |
Trích:
Trích:
Và chú ý bạn phải gửi lệnh SET_BLOCK_LEN, đây là lệnh bắt buộc trong quá trình khởi tạo thẻ Bạn muốn tự viết driver thẻ? |
Trích:
Trích:
|
Trích:
Trích:
Mình nghĩ bạn dùng PIC33FJxxGP8xx, nếu vậy có lẽ chỉ cần thay file header và điều chỉnh lại các chân remap của SPI là xong! |
Em đã đọc được single block, nhưng em chưa hiểu lắm. Khi format thẻ với định dạng khác nhau thì đọc MBR có giống nhau không ? (theo em là có nhưng thực tế là đọc lần nào cũng như lần nào)
Em soi lại cại MDD file system, trong khi đợi data token.. (của lệnh CMD17 sau khi response = 0 thì đợi data token..) không thấy bọn nó cho chân SD_CS = 0; Không thấy bọn nó switch speed sau khi init thẻ xong. |
Múi giờ GMT. Hiện tại là 08:35 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam