PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C Slave klappt nicht



p_mork
17.01.2007, 17:39
Hallo,

ich versuche eine I2C-verbindung zwischen 2 Controllern hinzukriegen, klappt aber irgendwie nicht. Da ich eine getestete I2C-Master-Lib verwende vermute ich, dass das Problem beim Mega32-Slave liegt. Wahrscheinlich initalisiere ich das ganze falsch. hier ist mein Code:


#include <avr\io.h>
#include <avr/interrupt.h>


ISR(TWI)
{
char c;
c=TWDR;
PORTC^=(1<<7); //PORTC.7 toggeln
};

int main()
{
//init i2c
TWCR=(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
TWAR=(50<<1);

DDRC=3|(1<<7);
PORTC|=(1<<7); //Am PORTC.7 hängt eine LED dran;
sei();
while(1);
return 0;
};


kann mir bitte jemand helfen?

danke im Voraus

MfG Mark

Pascal
17.01.2007, 17:50
Was mir spontan auffällt, ist:
- in der Initialisierung musst du auch das TWINT-Bit im TWCR-Register setzen(aber erst nach dem sei() )
- in der ISR musst du am Ende auch immer das TWINT-Bit setzen

Im Forum gibts dazu aber auch schon jede Menge Beispielcode.

linux_80
17.01.2007, 20:20
Hallo,
ganz so einfach mit der ISR geht es, galube ich, nicht, denn beim auftreten des IRQ muss erstmal geschaut werden was der Master von einem will, nicht nur einfach das Byte wegschmeissen, dann sendet der Slave immer ein NACK zurück, und der Master denkt der Slave ist nicht da.
Also als erstes StatusRegister auslesen, und entspechend darauf reagieren, und die Flags setzen.