Cypress CY8C20110 - I2C?

Hallo,
für mein Schulprojekt habe ich den Cypress CY8C20110 (Doku) für eine Touchfläche gekauft. Die erste Grundschaltung (Circuit-1) aus der Doku habe ich auf eine Platine aufgelötet. Lege ich nun 5V an, bekomme ich an PIN8 eine Spannung und die LED leuchtet. Ich habe schon, mit Hilfe verschiedener I2C Anleitungen, versucht mit dem IC zu sprechen aber irgendwie komme ich zu keinem Erfolg. Gibt es vielleicht eine Möglichkeit die Schaltung auf Funktion zu überprüfen, sodass ich sicher sein kann, dass beim Löten ich nichts verbraten habe? Ich muss zugeben, dass ich noch nie etwas mit einem solchem IC und I2C gemacht habe.

Gruß
zebber

Hallo Zebber

Vorbildliche Problemvorstellung!

Alle IC's an der I2C Schnittstelle haben eine Adresse. Manchmal ist es schwer diese zu finden. Im Datenblatt sind 1 und 75 als Adressen genannt. DIe Adresse kann in einem Register des CY8C20110 geändert werden. Die Pins, die Arduino für I2C reserviert hat, sind: analog 4 für SDA, analog 5 für SCL
Noch ein Problemchen:
Ich weiß nicht ob Arduino "I2C Clock Stretching" implementiert hat.
Das Datenblatt gibt folgende Alternative: If the I2C master does not support clock stretching (a bit banged
software I2C Master), the master must wait for a specific amount
of time (as specified in “Format for Register Write and Read” on
page 9) for each register write and read operation before the next
bit is transmitted. The I2C master must check the SCL status (it
should be high) before the I2C master initiates any data transfer
with CapSense Express. If the master fails to do so and
continues to communicate, the communication is erroneous.
(Seite8 des Datemblatts)
Vieleict kann jemand andes Dir weiterhelfen.
Grüße Uwe

Hallo zepper - eine einfache Möglichkeit, die I2C-Basiskommunikation zu überprüfen, ist ein Arduino-Sketch, der hier

http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scanner/

zu finden ist (i2cscanner.pde). Wenn Du dieses Programm startest, sollte Dein Chip mit seiner gegenwärtigen Adresse in der Liste wiederfinden. Falls da nichts auftaucht, stimmt vermutlich mit der Verdrahtung irgendwas nicht. Noch eine Anmerkung - i2cscanner.pde listet die Adressen dezimal, in den meisten Datenblättern sind diese aber hexadezimal angegeben - das sollte man nicht vertauschen. Auch werden in Datenblättern manchmal 8-bittige i2c-Adressen angegeben, die Wirelib von Arduino (die sich um das i2c-Protokoll kümmert) möchte aber nur 7-bit Adressen haben. Einfach mal in die Wire-Doku reinschauen!

  • cpixip

cpixip:
Einfach mal in die Wire-Doku reinschauen!

Ok cpixip was sagst Du zu "I2C Clock Stretching"??
Grüße Uwe

Hallo Uwe - Genaues kann ich dazu auch nicht sagen.

Der i2c-scanner fragt eigentlich nur, ob ein Chip auf einer bestimmten Adresse anwortet - hier sollte eigentlich kein clock stretching von Seiten des Chips nötig sein. Clock stretching tritt in der Regel dann auf, wenn der Sensorchip aus irgendeinem Grund zu beschäftigt ist. Wenn der Chip beim einfachen Adressierungstest schon nicht antwortet, wäre das ein deutlicher Hinweis auf tieferliegende Probleme. Ich würde mir dann erstmal die Signale auf dem Bus mit einem Oszi anschauen. Wenn der Chip sich aber auf seiner Adresse meldet (oder einer anderen, das kann ja geändert werden), dann kann man aber davon ausgehen, dass zumindest die Basiskommunikation klappt. Dann muß man weniger im Hardware-Aufbau nach Fehlerquellen suchen, die liegen dann eher im Softwarebereich.

Übrigens, lt. diesem Forumpost http://forum.sparkfun.com/viewtopic.php?t=6236 kann selbst der Autor der Wirelib nicht so genau sagen, wie seine Lib damit umgeht: "We are in contact with Nicholas Zambretti, the author of the Wire library and he is not sure whether clock-stretching is completely transparent to his code...".

Da aber die i2c-library (Wirelib) des Arduinos eigentlich nur das eingebaute i2c-Hardware-Interface benützt (deswegen werden ja die Analogeingänge 4 und 5 lahmgelegt, dort müssen die i2c-Leitungen konnektiert werden), ist davon auszugehen, dass der Arduino clock stretching unterstützt. Das Datenblatt von Atmel sagt jedenfalls, dass das Hardware-Interfacce kompatibel mit dem Philips-Protokoll ist.

Ein weiterer Hinweis, dass clock stretching vermutlich kein Problem darstellt: angeblich soll der Kompass HMC6352 auch clock stretching verwenden (siehe obigen Link) - den kann ich jedenfalls mit dem Arduino problemlos in Betrieb nehmen.

Ich muß allerdings zugeben, dass mir bislang auf dem Oszi noch nie clock stretching aufgefallen ist.

Wie gesagt, sicher bin ich mir nicht, aber ich hatte bislang mit recht unterschiedlichen i2c-Chips keine Probleme. Die i2c-Implementation des Arduinos ist gerade keine Software-Implementation (bitbanging), sondern wird in Hardware ausgeführt.

Beste Grüße! - cpixip

Vielen Dank für die Antworten. Ich habe nun es mit dem I2CScanner probiert. Nachdem es bei meinem ersten Aufbau nichts gefunden hat, habe ich die Schaltung noch einmal komplett neu (ohne Sensorplatten und LEDs) gelötet. Jedoch funktioniert der Scanner auch hier nicht.

Hallo Zebber - ich würde dann mal die Verdrahtung überprüfen. Man vertauscht leicht einmal zwei Leitungen oder vergisst einen Pin zu verdrahten (von Kurzschlüssen und Lötbrücken mal ganz abgesehen).

Stimmen die Betriebsspannungsanschlüsse alle? SDA, die Datenleitung des I2C-Busses, kommt am Arduino AnalogPin 4 heraus, also da, wo normalerweise analoge Spannungen zum Digitalisieren angelegt werden! Die Clock (SCL) des I2C-Busses kommt aus dem Nachbarpin, aus dem Analogpin 5. Sind diese Leitungen mit den entsprechenden Pins des I2C-Chips verbunden?

Falls ein Oszi vorhanden ist, kann der sehr hilfreich sein, um die Spannungspegel zu überprüfen und zu sehen, was wirklich auf den Leitungen vor sich geht. Bedenke, dass ein Standard-Arduino ein 5V-Gerät ist. Das verträgt sich in der Regel nicht gut mit 3.3V Chips und ähnlichem, normalerweise muß man da einen Pegelwandler dazwischenschalten. Mehr dazu kann man bei Sparkfun nachlesen, http://www.sparkfun.com/tutorials/65. Ich benutze meistens relativ billige Boards mit jeweils 2-MOSFET (Pegelwandler - Watterott electronic, ein einzelner reicht schon für den I2C-Bus) oder, wenn die Geschwindigkeit in der Anwendung kein Problem ist, lieber gleich einen Arduino Pro Mini 3.3V @ 8MHz, an den kann man 3.3V-Chips direkt anschließen, da dieser nativ mit 3.3V arbeitet.

Bedenke auch, dass die I2C-Leitungen genügend große Pull-Up Widerstände haben müssen, um richtig zu funktionieren. Die Wire-Lib schaltet zwar, soviel ich mich erinnere, die internen Pull-Up Widerstände des Arduinos an, die sind aber lediglich 10k groß und sorgen manchmal nicht für eine genügend schnelle Anstiegsflanke. Das kann dann Probleme geben, weil der logische HIGH-Pegel nicht schnell genug erreicht wird.

Noch ein letzter Hinweis: In dem Datenblatt Deines Chips habe ich gesehen, dass dort von einem Sleep Control Pin geredet wird (Seite 10 Deines Datenblatt-Links) - der muß lt. Datenblatt vor der I2C-Kommunikation auf logisch LOW geschaltet werden, falls der Chip "schläft", um die I2C-Kommunikation anzuschalten. Viel mehr gibt dieses Datenblatt allerdings nicht her.

Jedenfalls viel Glück! - cpixip

Ganz wichtig wenn man an zwei Spannungsquellen arbeitet muss das I2C drei leitungen haben SDA,SCL,GND. ALso z.B. Aruino USB und die verdorgung der sensorik seperat dann muss man 3 Leitnugen von Aruino richtung Sensorik haben