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