[an error occurred while processing this directive]
приблизительно так
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
миниатюрный аудио-видеорекордер mAVR

Отправлено Тумблер 13 июля 2002 г. 16:24
В ответ на: Подскажите где взять или кинте на мыло пример проги на СИ для связи по I2C интерфейсу отправлено whiteye@mail.ru 13 июля 2002 г. 14:15

// чтение словами 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