[an error occurred while processing this directive]
|
// чтение словами 16 бит из таблицы TABL_NUM( смещение таблицы данных):
ad = ..;
read_flash_at (TABL_NUM);
// результат - в dat
// запись словами 16 бит в таблицу TABL_NUM(смещение таблицы данных):
ad=..;
dat=..;
write_flash_at (TABL_NUM);
#define SCL0 P0.0=0;
#define SCL1 P0.0=1;
#define SDA1 P3.4=1;
#define SDA0 P3.4=0;
#define WR24_EN P1.2=0;
#define WR24_DI P1.2=1;
#define SDAIN SDA1
#define SDAOUT SDA0
#define SPULS SCL0 SCL0 SCL0 SCL1 SCL1 SCL1 SCL0 SCL0 SCL0
#define READ_SDA (P3.4)
#define START_AT24C64 SDA0 SDA0 SDA0 SCL0 SCL0 SCL0
#define STOP_AT24C64 SCL1 SCL1 SCL1 SDA1 SDA1 SDA1
data word dat;
data word ad;
#if FLASH_TIPE leq AT24C64__
idata word addr__;
/*-------------------------------------*/
void set___addr (data byte to)
{
addr__ = ad+to;addr__ <<= 1;
}
/*-------------------------------------*/
void reset_flash (void)
{
STOP_AT24C64
}
/*-------------------------------------*/
byte load_byte_AT24C64 (idata byte db, idata byte df)
{
for (err_op=0xFF; err_op != 0; -- err_op)
{
for (mask=0x80; mask != 0;)
{
if ((db and mask) == 0) {SDA0}
else {SDA1}
mask >>= 1;
SPULS
}
SDAIN
SCL1
SCL1
for (mask=0xFF; mask != 0; -- mask)
{
if (READ_SDA == 0)
{
SCL0
if (df != 0) {SDAOUT}
err_op=0;
return 0;
}
}
if (df != 0) {SDAOUT}
SCL0
}
err_op=WRITEflash1_ERR;
return (1);
}
/*-------------------------------------*/
byte get_byte_AT24C64 (void)
{
err_op=0;
for (mask=0x80; mask != 0;)
{
SCL0
SCL1
if (READ_SDA != 0) {err_op |= mask;}
SCL0
mask >>= 1;
}
SPULS
SDAOUT
return (err_op);
}
/*-------------------------------------*/
void read_slave (idata byte p)
{
STOP_AT24C64
START_AT24C64
load_byte_AT24C64 (0xA0,1);
load_byte_AT24C64 ((byte)(addr__ >> 8),1);
load_byte_AT24C64 ((byte)(addr__ & 0xFF),1);
SDA1
SCL1
START_AT24C64
load_byte_AT24C64 (0xA1,0);
err_op=get_byte_AT24C64 ();
if (p == 0) { dat = err_op; dat <<= 8; }
else { dat |= err_op; }
STOP_AT24C64
}
/*-------------------------------------*/
void read_flash_at (data byte to)
{
set___addr (to);
read_slave (0);
++ addr__;
read_slave (1);
err_op=0;
}
/*-------------------------------------*/
void write_slave (idata byte p)
{
STOP_AT24C64
START_AT24C64
load_byte_AT24C64 (0xA0,1);
load_byte_AT24C64 ((byte)(addr__ >> 8),1);
load_byte_AT24C64 ((byte)(addr__ & 0xFF),1);
if (p == 0) {load_byte_AT24C64 ((byte)(dat >> 8),1);}
else {load_byte_AT24C64 ((byte)(dat & 0xff),1);}
STOP_AT24C64
}
/*-------------------------------------*/
void write_flash_at (data byte to)
{
set___addr (to);
WR24_EN
write_slave (0);
++ addr__;
write_slave (1);
WR24_DI
}
/*-------------------------------------*/
#endif
E-mail: info@telesys.ru