Hallo! Ich möchte gerne Hardware I2C auf einem Mega16 proggen. Ich programmiere in C. Ein byte auf einen PCF8574 schreiben geht ohne Probleme, code nach datenblatt S.183. Doch das lesen geht nicht. Leider ist nirgensbeschrieben, wie mann ein byte vom bus liest, oder wie mann ein NACK generieren lässt. Kann mit jemand weiterhelfen?
wenn du lesen willst mußt du das letzte bit der adresse auf 1 setzten start-->(7 bit adresse+ rw(0|1)) 1=lesen 0=schreiben
Ja, das ist mir schon klar. Zuerst schreibe ich die Slaveadresse + Readbit. Danach will ich die Daten vom Bus lesen. Doch das klappt irgendwie nicht. Ich vermute dass es am NACK bit scheitert. Ich habe im Datenblatt nirgens gefunden, wie man es generiert...
das NACK ist ähnlich dem ack ein takt mit sda auf 0 oder 1 (0 ack und 1 nack) irgendwo steht das. guck dir mal die application notes von atmel dazu an http://atmel.com/dyn/resources/prod_documents/doc2564.pdf seite 3 An Acknowledge (ACK) is signaled by the receiver pulling the SDA line low during the ninth SCL cycle. If the receiver leaves the SDA line high, a NACK is signaled.
Ja, aber mir ist nicht klar, wie ich das von der Hardware generieren lasse. Ich hab mal auf einem 8051er software i2c geschrieben, da war es kein Problem ein NACK zu proggen ;-) Aber kennst du kein Beispiel wo I2C über die Hardware Register genutzt wird?
Besten Dank für die APPNOTE! Wollte die Library: I2C_Master testen, doch mein compiler will mir keine Hex datei rausspucken (ICCAVR). Er bringt ca 5 Errors in der library!
Seite 189 im Datenblatt, in der Tabelle: z.B: "$40 SLA+R has been transmitted, ACK has been received." Wenn in dieser Situation TWEA = 0 dann "Data byte will be received and NOT ACK will be returned". Ich würde empfehlen, Seite 170 bis 198 nicht nur unters Kopfkissen zu legen, sondern auch zu lesen. Da ist alles beschrieben. Ehrlich. Schönen Gruß Thomas
ich habe die Hardware I2C-Schnittstelle interruptgesteuert in FastAVR abgebildet. Da ich mir sowas auch nicht aus den Fingern sauge - hier habe ich es her: http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/i2c_8c-source.html Im prinzip war es dann doch alles ziemlich einfach. Der TWI-INT. kommt bei jedem Pup aufm I2C. Im TWI Status register sieht man als erstes nach, welcher wert da drinn steht, und verzweigt mit einer Switch anweisung zum eigentlichen geschehen. Ist die notwendige Aktion erledigt, muss man die entsprechenden Bits(Acknowledge, Stop, Start etc.) im TWCR setzen und den Int. verlassen. Ich habe den o.g. Link jetzt vom Papier abgetippt, hoffe, der geht noch... AxelR.
Tag zusammen! Danke für eure Bemühungen!! Manchmal ist die Welt schon böse... als ich am Abend das Datenblatt zum xten mal gelsen hatte, war es mir plötzlich klar ;-) Hab nun mein eigenes funktionierendes script. Einen schönen Tag noch! Martin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.