통신 > AT24C256 시리얼 EEPROM - 8. page write(64bytes) & Sequential read(256Bytes)

TODAY17,471 TOTAL6,609,466
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 통신 | I2C-IIC,TWI | AT24C256 시리얼 EEPROM - 8. page write(64bytes) & Sequential read(256Bytes)

페이지 정보

작성자 키트 작성일2017-09-01 10:51 조회2,519회 댓글0건

본문

#include <mega128.h>

#include <delay.h>
#include <stdio.h>
//
#define  WP_hi  PORTD.2=1
#define  WP_lo  PORTD.2=0
//
#define  SDA_hi DDRD.1=0
#define  SDA_lo DDRD.1=1
//
#define  SCL_hi DDRD.0=0
#define  SCL_lo DDRD.0=1
//
#define  ACK_data  0
#define  NACK_data 1
//
char str[50];
//
void TX0_CH(char ch)   { while(!(UCSR0A&0x20)); UDR0=ch; } // 송신 1바이트
void TX0_STR(char *str){ while(*str)TX0_CH(*str++);      } // 송신 문자열
//
void eeprom_clock(){ delay_us(1); SCL_hi; delay_us(1); SCL_lo; }
//
void eeprom_start(){
    delay_us(1); SDA_hi; SCL_hi; delay_us(1); SDA_lo; delay_us(1); SCL_lo;
}
//
void eeprom_stop(){
   SDA_lo; delay_us(1); SCL_hi; delay_us(1); SDA_hi; delay_us(1); 
}
//
void eeprom_nack(){
    SDA_hi; eeprom_clock();
}
//
void eeprom_ack(){
    SDA_lo; eeprom_clock();
}
//
void eeprom_write(char d){
    char i;
    for(i=0;i<8;i++){
        if(d&(0x80>>i))SDA_hi; else SDA_lo;
     eeprom_clock();   
    }
 eeprom_nack();
}
//
char eeprom_read(char ack){
    char i,d=0;
    SDA_hi;
    for(i=0;i<8;i++){
        eeprom_clock(); 
        if(PIND.1)d|=0x80>>i;
    }
    //
    if(ack==ACK_data)eeprom_ack();
    else             eeprom_nack();
    //
    return d;
}
//
void Wr_randum(int add,char data){ // add = 0x00 ~ 0x7FFF
    WP_lo;
    eeprom_start();
    eeprom_write(0xA0); // Device Address
    eeprom_write(add>>8);
    eeprom_write(add&0xFF); 
    eeprom_write(data); 
    eeprom_stop();
    delay_ms(5);
    WP_hi;
}
//
char Rd_randum(int add){ // add = 0x00 ~ 0x7FFF
    char ch;
    WP_lo;
    eeprom_start();
    eeprom_write(0xA0);     
    eeprom_write(add>>8);
    eeprom_write(add&0xFF); 
    eeprom_start();
    eeprom_write(0xA1);          
    ch=eeprom_read(NACK_data);
    eeprom_stop();
    WP_hi;
    return ch;
}
//
char wr_buf[64]; // 64byte
//
void Wr_Page(int add,char *str){ // add = 0x00 ~ 0x7FFF
    unsigned int i;
    WP_lo;
    eeprom_start();
    eeprom_write(0xA0); // Device Address
    eeprom_write(add>>8);
    eeprom_write(add&0xFF); 
    for(i=0;i<64;i++){ eeprom_write(*str++); } 
    eeprom_stop();
    delay_ms(5);
    WP_hi;
}
//
char rd_buf[16][16]; // 256byte
//
void Rd_Sequential(int add,unsigned int cnt){ // add = 0x00 ~ 0x7FFF
    unsigned int i;
    WP_lo;
    eeprom_start();
    eeprom_write(0xA0);     
    eeprom_write(add>>8);
    eeprom_write(add&0xFF); 
    eeprom_start();
    eeprom_write(0xA1);
    for(i=0;i<(cnt-1);i++){
        rd_buf[0][i]=eeprom_read(ACK_data); 
    }
    rd_buf[0][i]=eeprom_read(NACK_data); 
    //
    eeprom_stop();
    WP_hi;
}
//
void main(void){
    unsigned int i,k;
    //
    PORTD.2=1;  DDRD.2=1; //wp
    UCSR0B=8;   UBRR0L=8; // 115200 @16MHz 송신
    //
    sprintf(str,"\r\npage write\r\n"); TX0_STR(str);
    for(i=0;i<64;i++)wr_buf[i]=i;     Wr_Page(  0,wr_buf);
    for(i=0;i<4;i++){
        for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
        sprintf(str,"\r\n"); TX0_STR(str);
    }
    for(i=0;i<64;i++)wr_buf[i]=(i+64)&0xFF;  Wr_Page( 64,wr_buf); 
    for(i=0;i<4;i++){
        for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
        sprintf(str,"\r\n"); TX0_STR(str);
    }
    for(i=0;i<64;i++)wr_buf[i]=(i+128)&0xFF; Wr_Page(128,wr_buf); 
    for(i=0;i<4;i++){
        for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
        sprintf(str,"\r\n"); TX0_STR(str);
    }
    for(i=0;i<64;i++)wr_buf[i]=(i+192)&0xFF; Wr_Page(192,wr_buf); 
    for(i=0;i<4;i++){
        for(k=0;k<16;k++){ sprintf(str,"%02x ",wr_buf[i*16+k]); TX0_STR(str); }
        sprintf(str,"\r\n"); TX0_STR(str);
    }
    //
    sprintf(str,"\r\nSequential read\r\n"); TX0_STR(str);
    Rd_Sequential(0,256);
    for(i=0;i<16;i++){
        for(k=0;k<16;k++){ sprintf(str,"%02x ",rd_buf[i][k]); TX0_STR(str); }
        sprintf(str,"\r\n"); TX0_STR(str);
    }
    while(1){}             
} 

//

조금 복잡해도 먼저 소스와 크게 다르지 않습니다.

64바이트씩 page write 4번 실행하고

256바이트 한꺼번에 읽어옵니다.

//

Erase 시키지 않고 Write하면 새로운 데이터가 기록됩니다.

//

바이트 쓰기나 페이지 쓰기나 속도가 비슷합니다.

여러바이트를 몰아서 페이지 쓰기를 하는 것이 속도를 높일 수 있는 방법입니다.

//

댓글 0

조회수 2,519

등록된 댓글이 없습니다.

통신HOME > 통신 > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기