Trích:
Nguyên văn bởi bien_van_khat
Khởi tạo thành công thì bạn mới có thông tin về phân vùng, ví dụ vị trí bảng FAT, kích thước FAT, kích thước cluster, ..... Ko có thì sao mà đọc được dữ liệu
|
Thế thì những thẻ ko có MBR thì chịu không đọc đuợc à. Hay là ko đọc MBR nữa mà nhảy thẳng vào boot sector của partition...
Hiện tại code em mặc dù đọc file ok, nhưng rất củ chuối:
Quá trình khởi tạo thẻ của em như sau:
- Gửi CMD0 bằng cách điều khiển I/O thông thường..(Viết truyền nhận SPI thủ công, bằng cách dịch bít). Thấy trả về 0x01, thẻ đã đuợc reset.
- Sau đó, khởi tạo SPI, dùng hàm truyền, nhận SPI trong file spi.c. (2 hàm này bọn nó ko kiểm tra các bít SPIRBF, SPITBF, hàm read cũng chẳng có write 0xFF, em cho thêm vào thì chạy ok). Gửi lại 2 lệnh CMD0 để reset (response = 1 ,reset), rồi CMD1 khởi tạo thẻ (response = 0, kết thúc init)
-Sau đó em test lệnh đọc 1 sector(CMD17)
gửi cmd17 (res 0, ko lỗi) sau đó đợi token (đợi 0xFE), có token rồi bắt đầu đọc liên tiếp 512 byte dữ liệu.
Nói tóm lại là em viết phải viết lại hàm SendMMCCmd() và MDD_SDSPI_SectorRead(). Mặc dù về cơ chế của nó cũng chẳng khác gì của mình
Vấn đề là em muốn sửa lại ko dùng điều khiển I/O nữa, nói chung là dùng toàn bộ thư viện.
Hiện tượng hiện tại là: nếu bỏ đoạn dùng I/O, reset vẫn chạy bình thường. Nhưng rút thẻ ra cắm lại, thì đến chỗ gửi cmd0 bằng SPI thì toàn trả về 0....(Nếu có đoạn code kia thì cắm, rút mái thoải, vẫn ok)
Thêm nữa, trong thư viện, đường SS =0 mỗi khi bắt đầu gửi lệnh và =1 mỗi khi gửi xong. Trong giải thuật đọc 1 sector, đến phần đợi data_token, đường SS bị nâng lên 1. VẬy đường SS này có ảnh hưởng thế nào đến việc response của thẻ.