Hallo zusammen, ich möchte zwischen zwei Atmega 32 eine TWI implementieren. Den Code für den Master habe ich von Peter Fleury übernommen. Die nötigen Einstellungen wurden vorgenommen. Das sollte so auch klappen. Mein Problem liegt (wie bei so vielen) auf der Slave – Seite. Nach meinem Verständnis müsste der Master die Adresse vom Slave übertragen. Danach kommt das Bit für die Entscheidung R/W. Hiernach muss der Slave das nächste Bit (Nummer 9) auf low ziehen. Hieraus sieht dann der Master, ob die Übertragung angekommen ist, oder nicht. Wenn schon hier Fehler in meinen Überlegungen sind, für Denkanstöße bin ich immer zu haben. Auf dem Scop sehe ich das Bitmuster: 000011101. Kann leider kein plott erzeugen. Daraus ersehe ich ja schon einmal, das die Adresse (0x07) richtig übertragen wird. Danach kommt auch richtig das 8. Bit für „write“. Aber wie bekomme ich auf der Slave – Seite das 9. Bit auf „low“? Für den Acknowledge pulse ist ja das Bit 6 TWEA im TWCR Register zuständig. Jetzt habe ich in UP ACK dieses Bit auf 1 gesetzt.(+ natürlich TWINT auch auf 1) Aber auf dem Scop ist Bit 9 immer noch auf high. Währe sehr nett, wenn ihr mir bei diesem Problem helfen könntet. Danke. Die Initialisierung sollte so stimmen. void init_i2c(unsigned char addr) { TWAR = (addr << 1); TWCR =(1 << TWEA) | (1 << TWEN) ; TWCR = ~((1 << TWSTA) || (1 << TWSTA)); } void Ack (void) { TWCR = (1<<TWINT)|(1<<TWEN); TWCR = ~(1 << TWEA); while (!(TWCR & (1<<TWINT))); } void main_S (void) { init_i2c(0x07); while (1) { while (!(TWCR & (1 << TWINT))); if (TWSR == 0x60) { Ack(); } }//while(1) }// main
Hi, ich würde sagen bei dieser Initialisierung haut das nicht hin, schmeiss die 2. Zeile raus mit dem STA und STA ;-), die muss man nicht extra löschen, wenn sie voher garnicht gesetzt wurden, und ohne | schon garnicht ! Ausserdem muss man in TWCR alle Bits auf einmal setzen, denn TWI legt gleich los wenn TWINT gesetzt wird, da kommt die 2. Zeile immer zu spät, und ohne | wird das sowieso nix ! Nachtrag: mit TWCR keine Bitmanipulationen per |= machen, da kommt der TWI nur durcheinander, immer alle Bits angeben die man haben will, nix vorher einlesen usw. !
Das ging ja mal schnell. Werde die Änderungen heute ausprobieren. Danke Tiny 80!
super, hat alles geklappt. Hatte noch einen Hardwarefehler auf den Platinen. Zwischen den Ltg. war noch ein 10k wid. eingebaut. Das ergab natürlich einen sehr schönen Spannungsteiler. Dadurch war das Signal immer zwischen 4V und 5V. Somit niemals als Low erkannt.
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.