Giả sử đã khởi tạo MMC, chúng ta sẽ bàn tiếp đến các hàm đọc và ghi sector cho MMC.
- Do đọc dễ hơn ghi, nên tôi nói hàm read_sector trước.
Command đọc 1 sector là Command 17. 17(dec) = 0x11(hex) = 0001 0001
Ghép với byte command 0x01.... ta có : 0x0101 0001 = 0x51
Vậy lệnh đọc là : CMD17( 0x51, byte4..1,0x00)
Có một điều hơi khó hiểu chỗ này, các bác cẩn thận này:
Các byte4-1 là địa chỉ theo byte, nhưng MMC lại đọc theo sector. Có nghĩa là: giả sử chúng ta cần đọc sector0 = 512byte đầu tiên, MMC sẽ gửi dữ liệu bắt đầu từ byte số 0. Vậy 4byte này là 0x00 0x00 0x00 0x00 = 0!
Nhưng giả sử chúng ta muốn đọc sector 1, là 512byte tiếp theo, MMC sẽ gửi từ byte thứ 512 đến byte 1023, vậy 4byte này phải trỏ đến byte thứ 512 và như vậy có giá trị là: 0x00 0x00 0x02 0x00 = 0x200 = 512.
Vậy nếu chúng ta có 4 thanh ghi 8bit từ r20-r23 lưu địa chỉ byte, để chuyển thành sector muốn đọc ta làm thêm 1 hàm shift_mmc như sau:
Khi đó, Muốn đọc sector 0, r23..r20 = 0x00 0x00 0x00 0x00
Muốn đọc sector 1, r23..r20 = 0x00 0x00 0x00 0x01 0x00
Áp dụng hàm shift_mmc cho trường hợp này:
r20 = 0x00
r21 = 0x01, lsl r21 = 0x02
rol r22 = 0x00
rol r23 = 0x00
---> r23..r20 = 0x00 0x00 0x02 0x00
Các bác có thể thử với một vị trí sector bất kỳ để hiểu đoạn này
Như vậy, lệnh đọc sector MMC sẽ là: (giả sử sector 1)
- Do đọc dễ hơn ghi, nên tôi nói hàm read_sector trước.
Command đọc 1 sector là Command 17. 17(dec) = 0x11(hex) = 0001 0001
Ghép với byte command 0x01.... ta có : 0x0101 0001 = 0x51
Vậy lệnh đọc là : CMD17( 0x51, byte4..1,0x00)
Có một điều hơi khó hiểu chỗ này, các bác cẩn thận này:
Các byte4-1 là địa chỉ theo byte, nhưng MMC lại đọc theo sector. Có nghĩa là: giả sử chúng ta cần đọc sector0 = 512byte đầu tiên, MMC sẽ gửi dữ liệu bắt đầu từ byte số 0. Vậy 4byte này là 0x00 0x00 0x00 0x00 = 0!
Nhưng giả sử chúng ta muốn đọc sector 1, là 512byte tiếp theo, MMC sẽ gửi từ byte thứ 512 đến byte 1023, vậy 4byte này phải trỏ đến byte thứ 512 và như vậy có giá trị là: 0x00 0x00 0x02 0x00 = 0x200 = 512.
Vậy nếu chúng ta có 4 thanh ghi 8bit từ r20-r23 lưu địa chỉ byte, để chuyển thành sector muốn đọc ta làm thêm 1 hàm shift_mmc như sau:
clr r20
lsl r21
rol r22
rol r23.
Với r23 = byte4; r20 = byte1
lsl r21
rol r22
rol r23.
Với r23 = byte4; r20 = byte1
Muốn đọc sector 1, r23..r20 = 0x00 0x00 0x00 0x01 0x00
Áp dụng hàm shift_mmc cho trường hợp này:
r20 = 0x00
r21 = 0x01, lsl r21 = 0x02
rol r22 = 0x00
rol r23 = 0x00
---> r23..r20 = 0x00 0x00 0x02 0x00
Các bác có thể thử với một vị trí sector bất kỳ để hiểu đoạn này
Như vậy, lệnh đọc sector MMC sẽ là: (giả sử sector 1)
ldi r21,0x01
rcall shift_mmc
ldi r16, 0x51
rcall SPI_byte_transfer
mov r16,r23
rcall SPI_byte_transfer
mov r16, r22
rcall SPI_byte_transfer
mov r16, r21
rcall SPI_byte_transfer
mov r16, r20
rcall SPI_byte_transfer
---(hoặc rcall SPI_0_transfer)
rcall SPI_255_transfer
rcall SPI_255_transfer
(chúng ta gọi 2 hàm send 0xFF đến MMC để chờ response)
cpi r16,0x00
(so sánh response với 0x00, nếu khác là có error)
brne MMC_read_error
ret
MMC_read_error:
(tùy các bác xử lý!)
ret
rcall shift_mmc
ldi r16, 0x51
rcall SPI_byte_transfer
mov r16,r23
rcall SPI_byte_transfer
mov r16, r22
rcall SPI_byte_transfer
mov r16, r21
rcall SPI_byte_transfer
mov r16, r20
rcall SPI_byte_transfer
---(hoặc rcall SPI_0_transfer)
rcall SPI_255_transfer
rcall SPI_255_transfer
(chúng ta gọi 2 hàm send 0xFF đến MMC để chờ response)
cpi r16,0x00
(so sánh response với 0x00, nếu khác là có error)
brne MMC_read_error
ret
MMC_read_error:
(tùy các bác xử lý!)
ret
Comment