Ответ:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено -Tумблер- 06 апреля 2005 г. 15:08
В ответ на: Ответ: Да исходник примера для связи attiny c 24c512 по USI(two-wire) отправлено GAGIK_TB 06 апреля 2005 г. 15:00


я делал для Фуджиццу, но это не принципиально - меняются
только дефайны:


// сигналы управления 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
SCL1

START_AT24C512
load_byte_AT24C512 (0xA1,0);

dat = get_byte_AT24C512 ();

STOP_AT24C512

return dat;
}
/*-------------------------------------*/
void write_flash_at (word addr, byte dat)
{
WR24_EN

STOP_AT24C512
START_AT24C512

load_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