Assembler TWI/I²C: ACK/NACK erkennen

TommyB

Team Bitschubse
17. Mai 2010
2.151
80
48
40
127.0.0.1 ;)
Sprachen
  1. C#
  2. VB.Net
  3. LunaAVR
  4. Assembler
  5. Python
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. :confused:

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 :)
 
Ach verdammte Axt, den ganzen Tag grübel ich schon drüber, jetzt hab ichs per Zufall gefunden -.-

Erst TWDR setzen, dann TWCR. *grummel*

Code:
; Writes a byte from ARGS1 to the TWI/I²C bus
iic_Write:

	OUTX	TWDR,	ARGS1
	LDI	TEMP1,	(1<<TWINT) | (1<<TWEN)
	OUTX	TWCR,	TEMP1

	RCALL	iic_Wait

RET

Wirklich rund läufts immer noch nicht, jetzt beißt mich der Hund. Hmmm...
Aber die erste Adresse erkennt er schon mal. Immerhin.
 
Jetzt gehts.
Die übertrieben langen Werbepausen bei Schlag den Raab haben mir genug Zeit gegeben und in einem Akt der puren Verzweiflung hab ich mal etwas herum probiert. Jetzt funktioniert es :)

Aus mir unerfindlichen Gründen muss ich nach dem Stop das TWI/I2C komplett deaktivieren. Sprich:
Code:
; Generate stop condition on the bus
iic_Stop:

	LDI	TEMP1	, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
	OUTX	TWCR	, TEMP1

	CLR	TEMP1
	OUTX	TWCR	, TEMP1

RET

Wenn man die beiden Änderungen (aus diesem Post und dem darüber) einbindet klappt der i2c scan schon mal :)
Warum das nötig ist ist mir zwar schleierhaft, aber was solls.
Auf gehts zu den nächsten Problemen ^^'
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)