I2C slave
Zdenek Aster
zdenek.aster@seznam.cz
Sobota Březen 1 22:31:37 CET 2008
Tohle zarucene chodi na ATmega8 tak kdyz upravite
porty pripadne mrknete co je jinak. Vychazi to z
AvrLib, ale to mi nejak nechodilo tak jsem to
orezal po svem.
Zdenek Aster
#include <avr/io.h>
#include <avr/interrupt.h>
// functions
void i2cInit(void)
{
// set pull-up resistors on I2C bus pins
// TODO: should #ifdef these
sbi(DDRC, 4); // i2c SCL on ATmega163,323,16,32,etc
sbi(PORTC, 4); // i2c SDA on ATmega163,323,16,32,etc
sbi(DDRC, 5); // i2c SCL on ATmega128,64
sbi(PORTC, 5); // i2c SDA on ATmega128,64
// set bitrate of I2C
cbi(TWSR, TWPS0);
cbi(TWSR, TWPS1);
outb(TWBR, 0);
// set local device address (used in slave mode only)
outb(TWAR, (0xB0&0xFE) );
// enable TWI (two-wire interface)
sbi(TWCR, TWEN);
// set state
// enable TWI interrupt and slave address ACK
sbi(TWCR, TWIE);
sbi(TWCR, TWEA);
//outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWEA));
// enable interrupts
sei();
}
//! I2C (TWI) interrupt service routine
SIGNAL(SIG_2WIRE_SERIAL)
{
// read status bits
u08 status = inb(TWSR) & 0xF8;
#ifdef DEBUG
printf("%02X", status);
#endif
switch(status)
{
// Slave Receiver status codes
case 0xA8: // Own SLA+R has been received, ACK has been returned
index_i2c = 0;
TWDR = data_i2c[index_i2c++];
sbi(TWCR, TWINT);
break;
case 0xB8: // data byte in TWDR has been transmitted; ACK has been
received
TWDR = data_i2c[index_i2c++];
sbi(TWCR, TWINT);
break;
case 0xC0: // data byte in TWDR has been transmitted; NOT ACK has been
received
default:
// reset internal hardware and release bus
// outb(TWCR, (inb(TWCR)&TWCR_CMD_MASK)|BV(TWINT)|BV(TWSTO)|BV(TWEA));
sbi(TWCR, TWINT);
sbi(TWCR, TWSTO);
sbi(TWCR, TWEA);
break;
}
}
----- Original Message -----
From: <kral.j@centrum.cz>
To: <hw-list@list.hw.cz>
Sent: Saturday, March 01, 2008 10:27 PM
Subject: I2C slave
Už jde elektrika i internet, ale mě ani ta černá tříhodinovka nepomohla
vyřešit problém, který mám.
Potřebuji do ATmega2560 realizovat I2C slave pro čtení. Na mcu.cz byl před
nedávnem problém řešen pro ATmega8 což jsem vzal jako podklad, změnil jsem
porty podle svého, ale nefunguje to. Trochu mě tam mate, že v inicializaci
je TWINT na jedničce a podle manuálu by měl být na nule, ale vyzkoušel jsem
oboje a nic. Pak taky na stránkách Atmelu je aplikační poznámka, tuším že
311, ale tam je slave pro vysílání. Při pokusech jsem se dostal až k tomu,
že pouze provedu inicializaci TWI a pokouším se zjistit jestli vůbec
zaregistruji vysílání, ale nic. Adresu vysílanou a nastavenou ve slave jsem
samozřejmě zkontroloval. Navíc mám povolené všeobecné vysílání a tak si
myslím, že by to mělo reagovat na jakoukoliv adresu(?). Vysílací master mám
ověřený v několika aplikacích, pull-up odpory jsem nezapoměl.
Není tu někdo, kdo I2C slave na ATmega řešil?
Král
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
Hw-list@list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list
__________ Informace od ESET NOD32 Antivirus, verze databaze 2913 (20080301)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
Další informace o konferenci Hw-list