oberallgeier
02.12.2011, 14:09
Peinlich. Meine Fehlersuche und Sachstudie zum Thema hilft mir seit Tagen (Nächten) nicht weiter. Bisherige Erfahrungen mit I²C auf Atmelcontrollern: schreiben und lesen eines Beschleunigungsaufnehmers, Code von Sternthaler mit leichten Abwandlungen.
Aktuell:
Kurzfassung: Daten von einem Master (mega328/8MHz int. Osz) können auf einen Slave (mega328/20MHz Quarz) übertragen werden. Lesen der Daten vom Master geht nicht - Programm hängt.
AV RStudio4 4.18 Build 700, Master-Slave-Kopplung nach RN/Wissen (siehe hier - klick) (http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc) mit den dort präsentierten Codes bzw. PFleury-Lib.
Master :
- Der Code für Master wurde geringfügig abgewandelt: Sende-/Leseschleife durch while(1) mit eingebauter Tastenabfage. Wenn Taste gedrückt werden drei andere Bytes definiert wie ohne Tastendruck.
- Die Slaveadresse ist hex70.
- Eigene, bewährte UART-Routine
Slave :
- Der Code wurde bis auf die Slaveadresse übernommen.
Ergebnis:
- Schreiben der beiden Datensätze mit/ohne Taste geht einwandfrei, siehe Ausgabebeispiel - RS232 vom Slave
- Die Schleifendurchläufe des Masters werden durch eine getoggelte LED signalisiert.
- Lesen des Masters der geschriebenen Daten geht nicht, das Programm bleibt nach der Abfrage "Slave bereit zum Lesen" hängen - belegt durch LEDsignal am Master (toggelt nicht), siehe dazu Codeabschnitt.
i2c_init(); // init I2C interface
while (1)
{ // Schleife mit verschiedenen Ausgaben
if (!(PIND & (1 << PIND2))) // Taste bringt GND auf PD2?
{ //
byte1 = 42;
byte2 = 43;
byte3 = 44;
}
else //
{ //
byte1 = 56;
byte2 = 57;
byte3 = 58;
} // Ende if (!(PIND & (1 << PIND2)))
//
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?
{
i2c_write(0x00); // Buffer Startadresse setzen
i2c_write(byte1); // Drei Bytes schreiben...
i2c_write(byte2);
i2c_write(byte3);
i2c_stop(); // Zugriff beenden
} //
else
{
/* Hier könnte eine Fehlermeldung ausgegeben werden... */
}
/*
waitms ( 200); // Warten vor Lesen ?? 30Nov2011, 2300
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{ //
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ToggleBit(PORTD, 5); // LED auf PC2 toggeln
// ###>>> 02 Dez 2011, 0045: Programm kommt bis hieher, dann bleibt es stehen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
//
byte1= i2c_readAck(); // Bytes lesen...
byte2= i2c_readAck();
byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK
i2c_stop(); // Zugriff beenden
}
*/
//else
//{
///* Hier könnte eine Fehlermeldung ausgegeben werden... */
//}
Ausgabebeispiel:
20704
Frage:
Wo steckt der Fehler??
Danke im Voraus für eure Hilfe.
Aktuell:
Kurzfassung: Daten von einem Master (mega328/8MHz int. Osz) können auf einen Slave (mega328/20MHz Quarz) übertragen werden. Lesen der Daten vom Master geht nicht - Programm hängt.
AV RStudio4 4.18 Build 700, Master-Slave-Kopplung nach RN/Wissen (siehe hier - klick) (http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc) mit den dort präsentierten Codes bzw. PFleury-Lib.
Master :
- Der Code für Master wurde geringfügig abgewandelt: Sende-/Leseschleife durch while(1) mit eingebauter Tastenabfage. Wenn Taste gedrückt werden drei andere Bytes definiert wie ohne Tastendruck.
- Die Slaveadresse ist hex70.
- Eigene, bewährte UART-Routine
Slave :
- Der Code wurde bis auf die Slaveadresse übernommen.
Ergebnis:
- Schreiben der beiden Datensätze mit/ohne Taste geht einwandfrei, siehe Ausgabebeispiel - RS232 vom Slave
- Die Schleifendurchläufe des Masters werden durch eine getoggelte LED signalisiert.
- Lesen des Masters der geschriebenen Daten geht nicht, das Programm bleibt nach der Abfrage "Slave bereit zum Lesen" hängen - belegt durch LEDsignal am Master (toggelt nicht), siehe dazu Codeabschnitt.
i2c_init(); // init I2C interface
while (1)
{ // Schleife mit verschiedenen Ausgaben
if (!(PIND & (1 << PIND2))) // Taste bringt GND auf PD2?
{ //
byte1 = 42;
byte2 = 43;
byte3 = 44;
}
else //
{ //
byte1 = 56;
byte2 = 57;
byte3 = 58;
} // Ende if (!(PIND & (1 << PIND2)))
//
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum schreiben?
{
i2c_write(0x00); // Buffer Startadresse setzen
i2c_write(byte1); // Drei Bytes schreiben...
i2c_write(byte2);
i2c_write(byte3);
i2c_stop(); // Zugriff beenden
} //
else
{
/* Hier könnte eine Fehlermeldung ausgegeben werden... */
}
/*
waitms ( 200); // Warten vor Lesen ?? 30Nov2011, 2300
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{ //
//
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ToggleBit(PORTD, 5); // LED auf PC2 toggeln
// ###>>> 02 Dez 2011, 0045: Programm kommt bis hieher, dann bleibt es stehen
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
//
byte1= i2c_readAck(); // Bytes lesen...
byte2= i2c_readAck();
byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK
i2c_stop(); // Zugriff beenden
}
*/
//else
//{
///* Hier könnte eine Fehlermeldung ausgegeben werden... */
//}
Ausgabebeispiel:
20704
Frage:
Wo steckt der Fehler??
Danke im Voraus für eure Hilfe.