c't

c't-Projekte - Mailinglisten


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] Fehler im I2C Datentransfer

Absender: Marko Bolowski
Datum: Do, 19.06.2008 10:30:49
In-reply-to: <20080618112041.124690@xxxxxxx>
References: <20080618112041.124690@xxxxxxx>


Hallo,

hier noch der passende Patch für twi.c!
Ich kann mir übrigens nicht vorstellen, dass der I2C-Treiber für das CMPS03 so funktioniert hat. Dafür wurde der Treiber ja ursprünglich erweitert. 
Im Gegensatzt zur alten TWI-Version gibt es auch keine so langen Denkpausen bei der Messung mit dem SRF10. Durch die langen Wartezeiten war die Motorregelung nicht mehr brauchbar. Mit I2C ISR wird eben alles besser! ;-)

Grüße
Marko

-------- Original-Nachricht --------
> Datum: Wed, 18 Jun 2008 13:20:41 +0200
> Von: "Marko Bolowski" <m.bolowski@xxxxxx>
> An: ct-bot-entwickler@xxxxxxxxxxxxxxxxx
> Betreff: [ct-bot] Fehler im I2C Datentransfer

> Hallo,
> 
> in twi.c hat sich ein Fehler in der Funktion 'Send_to_TWI' (I2C-Teil)
> eingeschlichen. Der schlummert da wohl schon seit längerem.
> 
> Dort wird das Senden oder Empfangen auf dem I2C-Bus in einer if-Anweisung
> verarbeitet. Die Auswertung von 'zusenden' und 'zulesen' ist vertauscht.
> Für I2C gilt Schreiben->0 (R), Lesen ->1 (W) (vgl. twi.h)!
> Vergleicht man die Funktion in TWI (alt) mit I2C (neu) sieht man:
> 'if ((ptr->slave_adr & 0x1) == 1)' ist i. Allg. nicht das Gleiche wie
> 'if(!(data_pack[i].slave_adr & R))'. Also kann anschließend toWrite, pWrite im
> if-Zweig und toRead, pRead im else-Zweig von I2C nicht sein, sondern muss
> getauscht werden.
> 
> Im (alten) TWI-Teil ist es richtig. Das führt u.a. dazu, dass der SRF10
> nur mit der alten Methode funktioniert. Nach einem Patch im if-Teil von I2C
> funktioniert der SRF10 auch damit.
> 
> Grüße
> Marko
> 
--- old/twi.c	2008-02-29 16:28:44.000000000 +0100
+++ new/twi.c	2008-06-19 09:56:56.010679300 +0200
@@ -197,13 +197,13 @@
 	/* Datenformat einlesen */
 	for (; ptr->slave_adr != OWN_ADR; ptr++) {
 		if ((ptr->slave_adr & 0x1) == 1) {
-			/* zu sendende Daten */
-			toWrite = ptr->size;
-			pWrite = ptr->data_ptr;
-		} else {
 			/* zu lesende Daten */
 			toRead = ptr->size;
 			pRead = ptr->data_ptr;
+		} else {
+			/* zu sendende Daten */
+			toWrite = ptr->size;
+			pWrite = ptr->data_ptr;
 		}
 	}