PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit I2C unter C++



Thorsten G
16.12.2006, 16:27
Hallo Allerseits

Wie der Titel schon sagt will das nicht laufen. Vermutlich liegt es an den Startbedingungen, denn das I2C_Beispielprogramm in Visal Basic ( usb -> rs232 -> i2c ) funktionert mit meiner Konfiguration einwandfrei. Ebenso die Kommunikation via USB -> RS232.
Ich hab mir im source Code für das Beispiel Programm die Funktionen zum Initialisieren und Starten des I2C Datenverkehrs angeschaut und versucht in C++ nachzubilden, wohl ohne erfolg :-k

Was ich gerne wissen würde ist die korrekte Reihenfolge wie ich die SDA(DTR) bzw SCL(RTS) Leitung setzen muss, bevor ich mit der Datenübertragung beginnen kann.
Falls jemand sogar noch den entsprechenden Code hätte, würde es der Sache ungemein helfen.

Gruß
Thorsten

Hardware
RN_Motor Controll
RN_PCI2C
USB -> RS232 Wandler

Software
Visual Studio 2005 (vollversion)
wsc4
Windows XP

PS: Falls ich den Beitrag im falschen Forum erstellt habe bitte ich um Nachsicht O:) Grade entsprechend verschieben, danke

PicNick
16.12.2006, 17:37
Prinzipiell einfach:
SDA und SCL sind oben ("ruhestellung")
START---------------------------------------------
SDA runter, pause, SCL runter.
BYTE-senden---------------------------------------
8 Mal ein Bit:
SDA 0 oder 1, pause, SCL rauf, pause, SCL runter
ACK/NAK holen:
SDA rauf, pause, SCL rauf, schauen, ob SDA = 0 (ACK) oder 1 (NAK)
SCL runter

1. Adresse, dann die Bytes

STOP---------------------------------------------
SDA runter, pause, SCL rauf, pause, SDA rauf

"pause" bestimmt die Geschwindigkeit, kannst du bei PC->RS232->I2C wahrscheinlich auch auslassen, so schnell geht das eh' nicht.

Thorsten G
16.12.2006, 19:14
Ich habs mal nach deinen Anweisungen entsprechend ausprobiert.
Also wirklich jedes Bit einzeln gesendet.. kein erfolg :/

Ich bräuchte nur das I2C_Beispiel Programm in C++ oder C 8-[

Nen Codebeispiel in einer anderen Programmiersprache hilft vielleicht auch schon

danke

PS: Ich hab den Code nicht angehängt weil er fürchterlich lang ist...

Thorsten G
17.12.2006, 03:46
Kleiner Naschlag meinerseits

Ich kann nun sicher seien, dass es an der Reihenfolge der Bits liegt, die auf die DTR bzw RTS Leitungen gelegt werden.
-> Ich habe mir ein Port Analyzer installiert und mir angeschaut in welcher Reihenfolge die Leitungen vom RN_PCI2C Beispielprogramm beschalten werden und sie 1:1 in C++ nachgebildet und siehe da es funktionert.
Dummerweise ist diese implementierung extrem umständlich ( für einen Befehl 300 zeilen code ](*,) )

Von daher such ich immer noch jemanden, der mir vielleicht ein Code Schnipsel in C / C++ zukommen lassen könnte *hust* ;)

Thorsten

Thorsten G
19.12.2006, 08:16
Ich hab mir nun einen "Treiber" geschrieben mit dem ich beliebige Daten via RS232->I2C Adapter auf den Bus schicken kann. Funktioniert soweit auch prima, aber die Sache hat ein Hacken...
Ich benutzte dabei immer die Befehle set / clear RTS bzw set / clear DTR. Das hat zwei Nachteile:
1. Ich muss neben der Start / Stopp Bedingung viermal auf die Serielle Schnittstelle zugreifen um eine einzige(!) null (eins) zu versenden. Macht bei einem 3 Byte Befehl etwa 1600 Zugriffe auf die Schnittstellle
-> Die ganze Sache wird extrem langsam ...
2. Es ist halt bissel unübersichtlich und hässlich

Wenn ich nun zB 40 Befehle direkt hintereinander an RN_MotCntrl via I2C Bus schicke, dann benötige ich dafür etwa 6 Sek.
Bei der Benutzung der Seriellen Schnittstelle von RN_MotCntrl benötige ich für die 40 Befehle etwa 0,5 Sekunden(!)
Ich weiß nicht genau warum der Unterschied so heftig ist, aber ich vermute es liegt daran, dass ich bei der seriellen Übertragung die Bits nicht einzeln auf die Leitungen schalten muss, sondern immer direkt ein Byte Array schicken kann. ( normaler "print" Befehl )
Ich hab es mehrfach probiert, ob ich nicht die Start Stopp Bedingung beim I2C Bus mit setzen der RTS / DTR Leitung generieren kann und dann die daten als Byte Array drüber jage. Das will bei mir aber nicht .. Hat da jemand schon mit Erfahrungen gemacht?

Lange rede kurzer Sinn: Der I2C Bus ist ja recht beliebt, würde mich freuen, wenn Ihr mir kuez erklärt, mit welchen Befehlen ( egal welche Sprache, PC oder µC ) Ihr Eure Daten auf den Bus jagt.

Vielen Dank im voraus
Thorsten

PS: Ich hoffe es ist nicht zulang geworden :-k

Ritchie
19.12.2006, 11:51
Hi,

ich verwende einen fertigen Treiber unter Linux 2.6 und habe hier keine Probleme.

Kann es sein, das Du Deinen "Treiber" auf Applikationsebene geschrieben hat ?
Normalerweise sollte es kein Problem sein, direkt auf die Port Bits zuzugreifen.

Hier aber vielleicht ein netter Link:
http://www.matronix.de/elektronik/i2c.php

Gruss Ritchie