Nachdem ein Selbstbau-Sensor merkwürdig reagiert hat, habe ich den Spannungsverlauf an den
Datenleitungen bei Betrieb mit einem simulierten I²C-Sensor mit einem (
selbstbau)
Logic Analyzer nachgemessen.
Der Versuchsaufbau:
- Vor den FT232R aus dem Logic Analyzer wurde ein nicht intervertierer Puffer (SN74HC541) geschaltet.
Die Eingänge des FT232R signalisieren im unbeschalteten Zustand einen High-Level. Um diesen
auf Low zu ziehen ist ein relativ kleiner Widerstand (hohe Last) notwendig. Da auch die Spannungsverläufe
im stromlosen Zustand des NXT (beim Einschalten) gemessen werden sollten, ist dieser Puffer notwendig.
- Die NXT-Leitungen IPOWERA (+4,3V), DIGIAI0 (SCL) und DIGIAI0 (SDA) wurden über den
Puffer an den Analyzer gelegt.
- IPOWERA wurde mit einem 100k-Widerstand gegen Ground (Masse) gelegt, um eine (minimale) Last
vorzutäuschen. 100k reichen aus um den Puffer auf Low zu ziehen.
- Die NXT-Pins DIGIAI0 und DIGIAI0 wurden wie bei einem "normalen" NXT-I²C-Sensor mit 82k-Winderständen
gegen IPOWERA (+4,3V) gelegt.
- Auf dem NXT lief als Betriebssystem LEJOS in der
Version 0.85.
- Das Test-Programm:
import lejos.nxt.*;
public class NXT
{ static HiTechnicTiltSensor Acc;
public static void main( String[] args)
//------ New ----------------------------------------------
{ LCD.drawString("Enter: S4 New", 0, 1);
while (!Button.ENTER.isPressed()){}
Acc = new HiTechnicTiltSensor(SensorPort.S4); while (Button.ENTER.isPressed()){} //auf's Loslassen warten
//------ 1. Leseversuch -----------------------------------
LCD.drawString("Enter: Get I ", 0, 1);
while (!Button.ENTER.isPressed()){}
Acc.getVersion();
while (Button.ENTER.isPressed()){} //auf's Loslassen warten
//------ 2. Leseversuch -----------------------------------
LCD.drawString("Enter: Get II", 0, 1);
while (!Button.ENTER.isPressed()){}
Acc.getVersion();
//------ Fertig -------------------------------------------
LCD.drawString("Escape ", 0, 1);
while (!Button.ESCAPE.isPressed()){}
System.exit(0);
}
}
NXT einschaltenSensor-Ports S1, S2, S3:
Kurz nachdem die Versorgungsspannung anliegt gehen sowohl SCL als auch SDA auf High. SDA geht nach
etwa 5ms, SCL nach etwa 250ms wieder auf Low. Bei SCL trat mehrfach ein zusätzlicher Peak kurz
nach dem Einschalten auf.
Sensor-Port S4:
Der 4. Sensor-Port ist anders ausgelegt als die anderen. Er dient auch als RS485-Schnittstelle. Hier
bleibt SCL die ganze Zeit auf Low.
Programm starten
Keine Änderung bei den Leitungszuständen. SCL und SDA bleiben auf Low-Pegel.
Sensor-Objekt anlegen (New)
Sowohl auf SCL als auch auf SDA erscheint ein kurzer Puls.
Sensor abfragen
(unterschiedliche Taktlängen in der Grafik sind wahrscheinlich Aretfakte der Abtastung)
Beim ersten Kontakt mit dem Sensor gehen zunächst sowohl SCL als auch SDA auf High-Pegel.
SDA wechselt den Pegel bevor SCL auf High wechselt. Andersherum läge ein I²C-Stopp-Signal
vor. Danach erfolgt die Übertragung der Geräte-Adresse (in diesem Fall "1"), dann das R/W-Bit
(in diesem Fall Low für Lesen). Nach dem Bestätigungs-Bit (hier "NAK") wird auf Grund des
zurück gelieferten NAK mit der Übertragung abgebrochen und ein Stopp-Signal gesendet.
Nach dem ersten Kontakt bleiben beide Leitungen I²C-konform auf High-Pegel. Demzufolge startet
jeder weitere Kontakt direkt mit dem Startsignal:
Programmende
Wenn das Programm beendet wird, also das Systemmenü angezeigt wird, nehmen beide Leitungen wieder
Low-Pegel an.