Theo thẻ: codevision

MMC/SD initialization

        Mò mẫm ba ngày ròng rã, cuối cùng con AVR cũng chịu nói chuyện với thằng MMC/SD. Post ở đây vừa chia sẻ kiến thức vừa lưu lại để dành, hồi chừng quên thì quay lại có cái mà mò ;))

        Đầu tiên cần lưu ý là thằng MMC/SD chỉ nói chuyện bằng giao thức SPI, do đó mọi chuyện cần bắt đầu bằng SPI. Toàn bộ code được viết bằng C, trên trình biên dịch CodeVisionAVR Ver 2.03.4 đã được “cờ rắc” :D – Nếu chưa có thì tải ở đây!

Đầu tiên là khởi tạo SPI

void SPI_init()
{
       delay_ms(500);
       DDRB  =  0xB0;                                           // Đặt SCK, MOSI & SS chế độ xuất (outputs )
       SPCR =  0b01010010;                            // Khởi tạo cổng SPI (Mode 0) 
       SPSR  =  0b00000000;
       PORTB  =  0xEF;                                       // Xóa bit MOSI & SCK
}

Gửi / nhận 1 byte bằng SPI

unsigned char SPI_transfer(unsigned char dataS)
{
       char dataR=0;
       SPDR = dataS;
       while (!(SPSR & 0x80));
       dataR=SPDR;
       return (dataR);
}

       Phần khởi tạo giao thức chỉ có bi nhiu đó thôi, gửi thử 1 byte rồi kẹp oscillocope vô, nhìn xung ra đẹp thấy thương. :))

       Với mỗi một thiết bị, nhà sản xuất thường định sẵn các tập lệnh để ghép nối, các tập lênh này với cùng loại thiết bị thì như nhau, đó xem như tiêu chuẩn. Thằng MMC/SD  tuân thủ đúng như vậy, nó cũng có những tập lệnh riêng để giao tiếp, mỗi lệnh có một chức năng khác nhau, cái này muốn hiểu rõ thì phải tham khảo thêm datasheet. Chỉ cần chú ý là sau mỗi lần nói chuyện xong, cần disable em nó một phát, khi nào cần nói tiếp thì enable lại. Vậy nên cần tạo sẵn hai chương trình con bật/tắt để tiện các thao tác về sau.

Xem tiếp >>