PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : TWI Slave mit avr-gcc



nfs2k
16.05.2012, 08:46
Hi RN Community

Ich bin über das Thema TWI_Slave_mit_avr-gcc (http://www.rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc) von euch gestolpert.
Dies habe ich natürlich gleich ausprobiert.
Ich benutze 2 Atmega128. Soweit funktioniert auch alles.
Ich kann von dem einen atmega128 im mastermodus die daten zum Slave schicken. Dieser ändert auch seine "Register".
Doch das Auslesen funktioniert irgendwie bei mir nicht wie es in der Doku beschrieben ist.
Also : Start(Slave+write) -> write (register ) -> Repstart (Slave+read) -> readack -> readack -> readnack -> stop.

Ich habe aber herausgefunden (da in der Slaveimplementierung beim Stop && || beim Start-ST-Modus das Register nicht wieder auf 0xFF gesetzt wird) dass ich so trotzdem meine Daten bekomme, da der Slave auch bei erneutem Start noch die alte angefragte Registeradresse kennt.
Also : Start(Slave+write) -> write (register ) ->STOP -> Start (Slave+read) -> readack -> readack -> readnack -> stop.

Wie bekomme ich aber nun den Repstart zum laufen !?
Sobald der Repstart kommt wird die SCL Leitung auf LOW gezogen und der BUS hängt.
Ich habe beim Slave die Switch Case anweisungen debuggt und im Falle des REpstarts geht der Slave in den DEFAULT CASE was ich nicht verstehe wieso er das tut.

Ich hoffe es hat jemand eine idee zur Lösung meines Problems.

Vielen Dank schoneinmal im Voraus

mfg
nfs2k

Chypsylon
16.05.2012, 12:39
Das gleiche Problem ist schon öfters mit dem Beipsiel aus RN-Wissen aufgetaucht (z.B. bei mir und oberallgeier hier (https://www.roboternetz.de/community/threads/55744-I²C-Master-m328-kann-Slave-m328-nicht-lesen)).

Es wäre vermutlich am einfachsten wenn du auf eine andere Library wie z.B. die von Jtronics (http://www.jtronics.de/avr-projekte/library-i2c-twi-slave.html) zurückgreifst die eigentlich gleich aufgebaut ist...

oberallgeier
16.05.2012, 13:25
Das gleiche Problem ist schon öfters mit dem Beipsiel aus RN-Wissen aufgetaucht ...Wie schon erwähnt (klick hier) (https://www.roboternetz.de/community/threads/55744-I²C-Master-m328-kann-Slave-m328-nicht-lesen?p=532265&viewfull=1#post532265) läuft bei mir die fleury-Lib hervorragend. Probier mal vor dem repstart bzw. nach dem Schreiben der Buffer-Startadresse ein i2c_stop . . .

KR-500
19.10.2012, 16:10
Hallo zusammen,

dieser Thread ist zwar schon etwas älter, aber ich bin jetzt letztens auch auf das Problem mit dem nicht funktionierenden repeated start gestoßen. Ich bin auf zwei Fehler gestoßen, nach dem beheben dieser Fehler läuft der Slave auch mit dem repeated start bzw. überhaupt. Es wäre schön wenn dies jemand auch im wiki ändern könnte.

1.Fehler:


TWAR= (adr << 1); //Adresse setzen um 1 bitshiften wegen TWAR register (siehe Datenblatt!)

Dies ist so Falsch, wenn man die Adresse um eins nach links shiftet schneidet man ein Bit der Adresse ab, richtig wäre:



TWAR= adr; //Adresse setzen


2. Fehler:


switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen
{

...

case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert
case TW_SR_DATA_NACK: // 0x88
case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
case TW_SR_STOP: // 0xA0 STOP empfangen
default:
TWCR_RESET;
break;
} //end.switch (TW_STATUS)



Laut Datenblatt ist dies der Code für den Empfang einer Stop, bzw einer Repeated Start Bedingung, jetzt bin ich mir nicht mehr so sicher, aber mit dieser Lösung funktioniert es:



switch (TW_STATUS) //TWI-Statusregister prüfen und nötige Aktion bestimmen
{
case TW_SR_STOP:
TWCR_ACK;
break;
...

case TW_ST_DATA_NACK: // 0xC0 Keine Daten mehr gefordert
case TW_SR_DATA_NACK: // 0x88
case TW_ST_LAST_DATA: // 0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received
default:
TWCR_RESET;
break;
} //end.switch (TW_STATUS)



Viele Grüße
KR-500

Chypsylon
19.10.2012, 17:13
@KR-500: Ist gemacht. Danke für die Lösung :)