ACU
27.02.2007, 13:09
Hallo,
wir arbeiten für ein Projekt daran, einen I2C-Master und -Slave auf dem
Mega 32 umzusetzen. Die ganze Sache funktioniert soweit auch ganz gut.
Der Slave löst einen Interrupt aus, wenn auf dem Bus seine Adresse
auftaucht, in der Form:
Signal(TWI_vect)
{
switch (TWSR) //TWI-Statusregister prüfen und nötige Aktion bestimmen
{
//alle Fälle werden hier abgehandelt
case: .....
case:....
default:
{
//Falls Bus-Error (TWSR = 0) setze die Register auf dem
Slave zurück
PORTA = setBit(PORTA, 0); //Fehler-LED
TWCR = (1<<TWEN)|
(1<<TWIE)|(1<<TWINT)|
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|
(0<<TWWC);
break;
}
}
}
Das funktioniert einwandfrei. Sobald jedoch der Master resettet wird
(z.B. durch einen Fehler oder Stromausfall, etc.) signalisiert der
Slave jedes Mal einen Buserror, wenn der Master wieder aktiviert wird,
und die komplette Leitung steht.
Wir resetten aber auf dem Slave im Fehlerfall das TWCR Register, siehe
Code oben.
Weiß vielleicht Jemand, wie man diesen Fehlerfall abfangen kann, sodass auch nach einem Masterreset die Kommunikation wieder einwandfrei läuft?
MfG Marcus
wir arbeiten für ein Projekt daran, einen I2C-Master und -Slave auf dem
Mega 32 umzusetzen. Die ganze Sache funktioniert soweit auch ganz gut.
Der Slave löst einen Interrupt aus, wenn auf dem Bus seine Adresse
auftaucht, in der Form:
Signal(TWI_vect)
{
switch (TWSR) //TWI-Statusregister prüfen und nötige Aktion bestimmen
{
//alle Fälle werden hier abgehandelt
case: .....
case:....
default:
{
//Falls Bus-Error (TWSR = 0) setze die Register auf dem
Slave zurück
PORTA = setBit(PORTA, 0); //Fehler-LED
TWCR = (1<<TWEN)|
(1<<TWIE)|(1<<TWINT)|
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|
(0<<TWWC);
break;
}
}
}
Das funktioniert einwandfrei. Sobald jedoch der Master resettet wird
(z.B. durch einen Fehler oder Stromausfall, etc.) signalisiert der
Slave jedes Mal einen Buserror, wenn der Master wieder aktiviert wird,
und die komplette Leitung steht.
Wir resetten aber auf dem Slave im Fehlerfall das TWCR Register, siehe
Code oben.
Weiß vielleicht Jemand, wie man diesen Fehlerfall abfangen kann, sodass auch nach einem Masterreset die Kommunikation wieder einwandfrei läuft?
MfG Marcus