|
я делал для Фуджиццу, но это не принципиально - меняются
только дефайны:
// сигналы управления EEPROM:
#define WR24_EN PDR6 &= ~(1<<0);
#define WR24_DI PDR6 |= (1<<0);#define SCL0 PDR6 &= ~(1<<1);
#define SCL1 PDR6 |= (1<<1);#define SDA0 PDR6 &= ~(1<<2);
#define SDA1 PDR6 |= (1<<2);#define SDAIN DDR6 &= ~(1<<2);
#define SDAOUT DDR6 |= (1<<2);#define SPULS SCL0 SCL0 SCL0 SCL1 SCL1 SCL1 SCL0 SCL0 SCL0
#define READ_SDA (PDR6 & (1<<2))#define START_AT24C512 SDA0 SDA0 SDA0 SCL0 SCL0 SCL0
#define STOP_AT24C512 SCL1 SCL1 SCL1 SDA1 SDA1 SDA1
/*-------------------------------------*/
void wait_5ms (void)
{
eeprom_tout = 6;
do
{
} while (eeprom_tout);
}
/*-------------------------------------*/
void reset_flash (void)
{
STOP_AT24C512
}
/*-------------------------------------*/
/* db - байт для записи */
/* df - флаг записи */
/* =1 после чтения ACK переключить */
/* SDA на выход */
/* =0 не переключать */byte load_byte_AT24C512 (byte db, byte df)
{
byte mask;err_op=0xFF;
do
{
mask=0x80;
do
{
if ((db and mask) leq 0) {SDA0}
else {SDA1}
mask >>= 1;
SCL0
SCL0
SCL0
SPULS
}while(mask);
SDAIN
SCL1
SCL1
// чтение ack
mask=0xFF;
do
{
if (READ_SDA leq 0)
{
SCL0
if (df lne 0) {SDAOUT}
err_op=0;
return 0;
}
}while(--mask);SCL0
if (df lne 0) {SDAOUT}}while(--err_op);
err_op=TOUT_flash_ERR;
return 1;
}
/*-------------------------------------*/
byte get_byte_AT24C512 (void)
{
/*
byte dat,mask;
dat=0;
mask=0x80;
do
{
SCL0
SCL1
if (READ_SDA lne 0) {dat |= mask;}
SCL0
}while(mask >>= 1);SPULS
SDAOUT
return dat;
*/// для увеличения скорости можно сделать так:
byte dat=0;
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<7);}
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<6);}SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<5);}SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<4);}
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<3);}
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<2);}
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<1);}
SCL0
SCL1
if (READ_SDA lne 0) {dat |= (1<<0);}
SCL0
SPULS
SDAOUT
return dat;}
/*-------------------------------------*/
byte read_flash_at (word addr)
{
byte dat;STOP_AT24C512
START_AT24C512
// DUMMY WRITE
load_byte_AT24C512 (0xA0,1) ;
load_byte_AT24C512 (((addr and 0xFF00)>>8),1);
load_byte_AT24C512 (((addr and 0x00FF)),1);SDA1
SCL1START_AT24C512
load_byte_AT24C512 (0xA1,0);dat = get_byte_AT24C512 ();
STOP_AT24C512
return dat;
}
/*-------------------------------------*/
void write_flash_at (word addr, byte dat)
{
WR24_ENSTOP_AT24C512
START_AT24C512load_byte_AT24C512 (0xA0,1);
load_byte_AT24C512 ((byte)((addr and 0xFF00)>>8),1);
load_byte_AT24C512 ((byte)((addr and 0x00FF)),1);
load_byte_AT24C512 (dat,1);STOP_AT24C512
// Тут нужна задержка >= 5 mc - лучше по таймеру
wait_5ms ();WR24_DI
}/*-------------------------------------*/
E-mail: info@telesys.ru