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등록된 댓글이 없습니다.