-
I2C Slave klappt nicht
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:
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
-
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.
-
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.