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