I/O-Warrior40 und LM75 per IIC

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

I/O-Warrior40 und LM75 per IIC

Post by PeeDee »

Hallo,
komme leider irgendwie nicht mit dem Programmieren weiter, wäre echt super, wenn sich jemand meiner annehmen würde.

Links für Datenblatt bzw. "Beschreibung":
http://www.goblack.de/desy/digitalt/i2c/lm75.html
http://www.national.com/ds.cgi/LM/LM75.pdf

Sodele, die hardware-seitigen Adressleitungen A0 bis A2 liegen auf High.
Jetzt zum Programm....
//Aktivieren von I²C
memset(&specialreport, 0, IOWKIT_SPECIAL_REPORT_SIZE);
specialreport.ReportID = 0x1;
specialreport.Bytes[0] = 0x1;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);

memset(&specialreport, 0, IOWKIT_SPECIAL_REPORT_SIZE);
specialreport.ReportID = 0x3;
specialreport.Bytes[0] = 0xFF; //xBytes lesen???
specialreport.Bytes[1] = 0x9F; //Adresse des LM75 (1001111 & Lesen 1 = 9Fh)
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);

IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);
So, ich bekomme jetzt auch Werte zurück, weiss jedoch nichts damit anzufangen...(jeweils der Hex-Wert)
Bytes[0]= 6
Bytes[1]= 10
Bytes[2]= F6
Bytes[3]= FF
Bytes[4]= FF
Bytes[5]= FF
Bytes[6]= FF
Bytes[7]= A8

Schonmal im Voraus vielen lieben Dank!
Last edited by PeeDee on Thu Mar 23, 2006 8:27 am, edited 1 time in total.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: I/O-Warrior40 und LM75 per IIC

Post by Guido Körber »

PeeDee wrote:
specialreport.Bytes[0] = 0xC2; //2Bytes lesen???
Nö, das sind $C2 Bytes, also 194. Der Lesebefehl hat keine Flagbits, nur den Bytecount.

Daher ist das erste Byte im Antwortreport auch 6, weil dieser Report 6 Bytes liefert. Und dann kommt noch eine ganze Mütze voll weiterer Reports...
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Ups, das war wohl noch ein Fragment vom "ausprobieren".
Ne, ich hatte da ehemals (values 1 to 255 are valid) FF drinnstehen gehabt.
Wobei ich mich dann frage, wie können beim Lesen maximal 255 Bytes übermittelt werden, wenn die special-Report-Struktur in dem Fall des Lesens per ID3 doch nur 6 Bytes frei hat?

Also Flag = 6h = 00000110 = 6 Bytes
Und die hätte ich dann ja auch bekommen oder?
Ist jetzt halt nur die Frage, ob DAS auch die Temperatur beinhaltet und wenn, wo sie dann steht

Was ich mich insgesamt bei dem Ansprechen von I²C-Komponenten gefragt habe:
Woher weiss das I²C-Device nun, ob es sich hierbei um eine Adresse oder um ein Kommando handelt?
Robert Marquardt
Posts: 543
Joined: Mon Dec 01, 2003 6:09 pm

Post by Robert Marquardt »

Ganz einfach (und steht auch in der Dokumentation). Man schreibt eine Leseanforderung und bekommt als Anwort mehrere Reports.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Naja, für eine Nicht-Wissenden ist das nicht ganz so offensichtlich :wink:
Also wenn ich z.B. 10 Bytes vom I²C-Bus lesen möchte, muss ich Read per ID3 zweimal ausführen, wobei beim 2ten Mal die letzten beiden Bytes "leer" bleiben, verstehe ich das so richtig?

Also wenn ich jetzt meinen Finger auf das LM75-Gehäuse lege, stelle ich eine Wertänderung fest, ein kleiner Erfolg *g*

Jetzt noch ne "Kleinigkeit":
Bei dem obigen Lesen vom I²C wird das Default-Register gelesen, worin ja die Temperatur steht.
Was ist, wenn aus irgendeinem Grund ein anderes Register angesprochen wird?
Ergo müßte ich VOR dem eigentlichen Lesen der Daten das Register auswählen, womit ich einen Wert von 00000000, also 0h, an den LM75 schicken muss.
Sollte ich dies per Write (ID2) und der 0h in Bytes[1] machen oder gibt es die Möglichkeit, daß ich dies irgendwie mit der LM75-Adresse in einen Befelh packe?
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Wenn mehr Bytes angefordert werden als in einen Report passen, kommen halt mehrere Reports zurück. Bei 10 Byte halt 6 im ersten Report, 4 im zweiten.

IIC funktioniert so, dass am Anfang einer Transaktion immer das Adressbyte mit dem Read/Write Bit vom Host gesendet wird. Die Richtung der nachfolgenden Bytes bestimmt dieses Bit. Wenn der Chip mehrere Register hat funktioniert das typischerweise so, dass man erst eine Schreibaktion machen muss mit der man das Register auswählt und dann die Leseaktion.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Hm, irgendwie ein bischen undurchsichtig das Ganze für mich....

Im obigen codeschnipsel habe ich ja auch das Defaul-Register zugegriffen, so.......wenn ich jetzt das Nur-Lesen-Temperatur-Register selektieren möchte, ist das dann so korrekt?

Code: Select all

//Aktivieren von I²C
memset(&specialreport, 0, IOWKIT_SPECIAL_REPORT_SIZE);
specialreport.ReportID = 0x1;
specialreport.Bytes[0] = 0x1; 
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);

//Auswählen des LM75-Registers
memset(&specialreport, 0, IOWKIT_SPECIAL_REPORT_SIZE);
specialreport.ReportID = 0x2;	//Schreiben auf Pipe2
specialreport.Bytes[0] = 0xC2; 	//2 zu schreibende Bytes UND Start/Stopp
specialreport.Bytes[0] = 0x9E; 	///Adresse des LM75 (1001111 & Lesen 0 = 9Eh)
specialreport.Bytes[0] = 0x0; 	//LM75 Register Select (00000000)
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);

//Frage nach Temperatur
memset(&specialreport, 0, IOWKIT_SPECIAL_REPORT_SIZE);
specialreport.ReportID = 0x3;	//Schreiben auf Pipe3
specialreport.Bytes[0] = 0xFF; 	//xBytes lesen
specialreport.Bytes[1] = 0x9F; //Adresse des LM75 (1001111 & Lesen 1 = 9Fh)
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);

//Antwort einholen
IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &specialreport, IOWKIT_SPECIAL_REPORT_SIZE);
Last edited by PeeDee on Thu Mar 23, 2006 1:07 pm, edited 1 time in total.
Guido Körber
Site Admin
Posts: 2876
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Post by Guido Körber »

Nein, nicht korrekt. Der erste Zugriff ist ja kein Lese- sondern ein Schreibzugriff. Also muss entsprechend das R/W Bit Null sein.

Das R/W Bit gibt immer an von wo nach wo die nach dem Adressbyte folgenden Transfers gehen. Der IO-Warrior maskiert dieses Bit nicht automatisch weil das sonst zu Problemen führen könnte die etwas zu komplex sind um sie hier in zwei Worten darzustellen.
PeeDee
Posts: 38
Joined: Sun Dec 18, 2005 7:30 pm

Post by PeeDee »

Jau, das kommt davon, wenn man nurn Copy&Paste macht *g*
Ich hab den Code mal geändert.
So sollte ich aber dann richtig liegen oder?
Post Reply