Ich bin grade etwas am verzweifeln.
Ich versuche grade I²C auf nem ATmega zum laufen zu bekommen. Aber ich scheiter an der Statusauswertung. Ich würde gerne wissen ob der Slave nun mit ACK oder mit NACK antwortet.
Da hab ich mir gedacht ich mach einfach mal ein i2cdetect, wie es der Raspberry Pi auch hat. Sprich: Start - Adresse senden - Bei ACK = gefunden, wenn nicht dann nicht - Stop.
Das ganze läuft bei mir auf dem Mega168, sollte aber leicht portierbar sein (INX und OUTX Makros, keine Interrupts).
Das Problem ist: Als Status bekomme ich immer 0x48 zurück, was NACK bedeutet (0x40 wäre ACK), auch bei Adressen wo definitiv ein Slave dran hängt. Leider hab ich keinen Logic Analyzer und kann das was raus geht nicht wirklich überprüfen.
Da mein Raspberry auch noch an dem Bus hängt (ich hab den aber auch mal testweise getrennt, der macht das Problem nicht) weiß ich dass es Bus-technisch funktionieren müsste. Der erkennt die Chips nämlich. Muss also was in meiner Software sein. Ich hab auch schon testweise die Bus Frequenz extrem runter gefahren, keine Änderung...
Was mich auch verwundert:
Ich kann ja mit debugWire Schritt für Schritt "durch latschen". Mache ich das denn ist (laut dem I²C Statusregister) auch alles ok (es wird trotzdem NACK erkannt). Lass ich den aber frei laufen wird das Bit "TWWC: TWI Write Collision Flag" gesetzt.
Für die die helfen wollen:
Anschluss ist simpel. Betriebsspannung, RS232 (38400/N/1), I2C. Sonst nichts.
Nicht irritieren lassen dass die Software eigentlich für einen EEPROM ist (siehe diesen Thread), es ist bisher eh nur Menüpunkt 8 (i2cdetect) eingebunden.
Assembler hatte ich schon erwähnt, ich nutze das AVR Studio 4.
Ist bestimmt nur etwas ganz dämliches was ich übersehen habe.
Quelltext liegt im Anhang, da zu viel.
Anhang anzeigen EepromTest.zip
Danke schon mal
Ich versuche grade I²C auf nem ATmega zum laufen zu bekommen. Aber ich scheiter an der Statusauswertung. Ich würde gerne wissen ob der Slave nun mit ACK oder mit NACK antwortet.
Da hab ich mir gedacht ich mach einfach mal ein i2cdetect, wie es der Raspberry Pi auch hat. Sprich: Start - Adresse senden - Bei ACK = gefunden, wenn nicht dann nicht - Stop.
Das ganze läuft bei mir auf dem Mega168, sollte aber leicht portierbar sein (INX und OUTX Makros, keine Interrupts).
Das Problem ist: Als Status bekomme ich immer 0x48 zurück, was NACK bedeutet (0x40 wäre ACK), auch bei Adressen wo definitiv ein Slave dran hängt. Leider hab ich keinen Logic Analyzer und kann das was raus geht nicht wirklich überprüfen.
Da mein Raspberry auch noch an dem Bus hängt (ich hab den aber auch mal testweise getrennt, der macht das Problem nicht) weiß ich dass es Bus-technisch funktionieren müsste. Der erkennt die Chips nämlich. Muss also was in meiner Software sein. Ich hab auch schon testweise die Bus Frequenz extrem runter gefahren, keine Änderung...
Was mich auch verwundert:
Ich kann ja mit debugWire Schritt für Schritt "durch latschen". Mache ich das denn ist (laut dem I²C Statusregister) auch alles ok (es wird trotzdem NACK erkannt). Lass ich den aber frei laufen wird das Bit "TWWC: TWI Write Collision Flag" gesetzt.
Für die die helfen wollen:
Anschluss ist simpel. Betriebsspannung, RS232 (38400/N/1), I2C. Sonst nichts.
Nicht irritieren lassen dass die Software eigentlich für einen EEPROM ist (siehe diesen Thread), es ist bisher eh nur Menüpunkt 8 (i2cdetect) eingebunden.
Assembler hatte ich schon erwähnt, ich nutze das AVR Studio 4.
Ist bestimmt nur etwas ganz dämliches was ich übersehen habe.
Quelltext liegt im Anhang, da zu viel.
Anhang anzeigen EepromTest.zip
Danke schon mal