Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


Hallo Uwe,

als mein Master mit Deinem Slave reden wollte, hängte sich der wegen nen Programmierfehler meines Masters auf. Die SCL-Leitung hat er dadurch einfach nicht mehr losgelassen. Durch ändern der Zeile

//switched to the non adressed slave mode...

  1. define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC);

nach

//switched to the non adressed slave mode...

  1. define TWCR_RESET TWCR = (1<<TWEN)|(1<<TWIE)|(1<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(0<<TWWC);

war alles in Butter.

Gruß Frank

Ok, habe es jetzt korrigiert, aber noch nicht selbst getestet... Solle laut Datenblatt aber korrekt sein. mfg --uwegw 11:47, 12. Apr 2010 (CEST)

Kelinigkeiten

Hallo,

ich habe den Code für ein Projekt vor 2 Jahren benutzt, jetzt habe ich nach dem Code gesucht um ein Update zu machen.

Die Oben genannten Probleme hatte ich damals auch - jetzt beim ersetzen des Moduls fällt mir folgendes auf:

- I2C_reg_Schreibschutz ist nicht definiert und kommt im Code auch nur einmal vor. Ich denke mal, dass es dafür sorgen soll, dass richtig adressiert worden ist, oder?

I2C_reg_Schreibschutz in twislave.h definieren ich denke das war als array gedacht? I2C_reg_Schreibschutz sollte in der ini routine initialisiert werden... - dabei kann man gleich den Speicherbereich vorbeschreiben.

Das war tatsächlich als Array gedacht, über das man den Schreibzugriff auf bestimmte Register sperren konnte. Wenn ich es mir recht überlege, ist diese Funktion recht überflüssig. Ich habe sie also erst mal entfernt. --uwegw 16:39, 2. Jul 2010 (CEST)


Ich würde auch die Interrupt aktivierung nicht in der Ini routine machen, sondern lieber ausserhalb, denn normalerweise müssen ja noch andere Sachen vorbereitet werden.

Mein Vorschlag für die Ini routine:

void init_twi_slave(uint8_t adr) {

   uint8_t i=0;
    TWAR= adr; //Adresse setzen
    TWCR &= ~(1<<TWSTA)|(1<<TWSTO);
    TWCR|= (1<<TWEA) | (1<<TWEN)|(1<<TWIE);
    buffer_adr=0xFF;
    for(i=0;i<i2c_buffer_size;i++)
	{
		i2cdata[i]=0;
		I2C_reg_Schreibschutz[i]=0;
	}
}


Warum definierst Du i2cdata zweimal? Einmal im header reicht ....

Ansonsten vielen Dank, das ist sehr hilfreich...

Christian