Download

2/20/2013

BELAJAR ACCESS SD CARD CARA SIMPLE DENGAN ATTINY2313 - PART2

Disclaimer : collected from various source on Google, writer read and modify for educational purpose only. Free to use !


Silahkan Baca Part1 terlebih dahulu agar tidak kebingungan


SPI via USI



SPI merupakan serial peripheral interface yang dapat mengkomunikasikan antara master dan slave. Kecepatan transfer data bergantung dari pembagian clock yang diberikan . Sedangkan USI adalah SPI mode simple, dimana clock diberikan manual secara software atau input dari luar. Pin SS (slave select ) juga tidak disediakan tapi bisa di akali dengan PIN & software



dari gambar diatas dapat dilihat mode 3 wire USCK, DO (MOSI) , DI (MISO)
USCK diberikan secara software (manual) dengan toogling register USICR pada USICLK dan USITC
ada 3 buah register yg perlu diperhatikan yaitu USIDR = Data register , USICR =Control register dan USISR = Status Register

Berikut script untuk inisialisasi dari USI sebagai SPI

Code:
//definisi port

#define SPI_DDR DDRB

#define MOSI (1<<PB6)

#define MISO (1<<PB5)

#define SCK (1<<PB7)



#define CS_DDR DDRD

#define CS (1<<PD6) // PD6 sebagai slave/chip select

#define CS_ENABLE() (PORTD &= ~CS)

#define CS_DISABLE() (PORTD |= CS)



//inisialisasi port SPI

void SPI_init() {

 CS_DDR |= CS; // SD card circuit select as output

 SPI_DDR |= MOSI + SCK; // MOSI and SCK as outputs

}



//Pembacaan SPI

unsigned char SPI_write(unsigned char ch) {

    USIDR = ch; // data yang akan dikirim

    USISR |= (1<<USIOIF); // aktifkan interrupt Overflow

 

 do {

//Kirim USCK8 x

 USICR |= (1<<USIWM0) | (1<<USICS1) | (1<<USICLK) | (1<<USITC);

 _delay_us(100);

       } while((USISR & (1<<USIOIF)) == 0); // selesai jika overflow

 return USIDR; // baca data reply yg masuk

}




gampang bukan ? selanjutnya kita dapat mengirim perintah ke SD card melalui port USI dan kita siap untuk membaca data dari SD CARD.

Jika bahan-bahan sudah siap dan tersusun di breadboard (jangan lupa set fusebit memakai clock 8MHZ , clk_div jangan dipake, bisa meakai xtal atau internal RC) kita akan membaca file text yang telah dicopy ke dalam SD card

Pertama kita bahas cara read (CMD 51) dari isi file SDCARD , langkahnya seperti berikut:

1. Pull CS low (select)
2. Send 0×51
3. Send 0x00000000 (Sector x 512)
4. Send 0×FF
5. Baca data yg dikirim 520 kali (sambil kirim 0xFF ke kartu)
6. Pull CD low (deselect)

kenapa 520 kali ? karena format reply per sector seperti ini :



yang garis merah diatas merupakan header awal (6 byte) yang menyatakan data ready, jadi di script nantinya kita akan mendeteksi 00 dan FE , sedangkan 2 terakhir merupakan CRC yang bisa di abaikan.

jadi kita susun script seperti berikut :

Code:
void SD_command(unsigned char cmd, unsigned long arg, unsigned char crc, unsigned char read) {

 unsigned char i;

 //berfungsi mengirim perintah ke SD card

 CS_ENABLE();

 SPI_write(cmd);

 SPI_write(arg>>24); //geser byte

 SPI_write(arg>>16);//karena format

 SPI_write(arg>>8);//0x00000000

 SPI_write(arg);//alias 4 bit argumen

 SPI_write(crc);

  

 for(i=0; i<read; i++) SPI_write(0xFF); //kirim & baca

 CS_DISABLE();  

}



char SD_init() {

    char i;

//berfungsi inisialisasi SD card        

    CS_DISABLE();

    for(i=0; i<10; i++) SPI_write(0xFF);   

     _delay_ms(500);

// langkah 1  0x40

    SD_command(0x40, 0x00000000, 0x95, 8);

        _delay_ms(500);

// langkah 2  0x41                        

    SD_command(0x41, 0x00000000, 0xFF, 8);

        _delay_ms(500);

// langkah 3  0x50           

    SD_command(0x50, 0x00000200, 0xFF, 8);  

    _delay_ms(500);

        

    return 0;

}



void SD_begin(unsigned long  sector) {

    uint8_t i = 0;

//berfungsi untuk membaca data SD card    

    CS_ENABLE();

 SPI_write(0x51); //perintah baca 0x51

     //selanjutnya geser2 byte sector

        SPI_write(sector>>15); // sector*512 >> 24

 SPI_write(sector>>7);  // sector*512 >> 16

 SPI_write(sector<<1);  // sector*512 >> 8

 SPI_write(0);          // sector*512

        SPI_write(0xFF);

    

    for(i=0; i<10 && SPI_write(0xFF) != 0x00; i++) {} // wait for 0

    for(i=0; i<10 && SPI_write(0xFF) != 0xFE; i++) {} // wait for data start

    

    // baca SD& kirim melalui serial

    for(i=0; i<512; i++)   USART_Tx(SPI_write(0xFF));

    //2 kali checksum

    SPI_write(0xFF);

    SPI_write(0xFF);    



    CS_DISABLE();   

}






Yah..begitulah...ga terlalu susah ....hanya masalah creativitas, ntar munculnya di layar (jika dihubungkan dengan serial via putty/hyperterminal) seperti ini :



atau jika data langsung dibaca, bisa langsung membaca text. Sesuai percobaan bahwa sector paling depan tempat file disimpan adalah sector 96,

kenapa ? karena SD CARD yang aku pake jadul , memakai system FAT12




sedangkan jika memakai Format pc terbaru maka otomatis menjadi system FAT16 dan File pertama berada di sector 555. Jadi sesuaikan dengan jenis format yang dipakai



semua source code dapat didownload dimari

0 komentar:

Post a Comment

Newer Post Older Post Home
Aulia DirUt. Powered by Blogger.
 

Blog Archive

Followers

 

Templates by Nano Yulianto | CSS3 by David Walsh | Powered by {N}Code & Blogger