Ich versuche, mit einem CapSense-Modul von Cypress, Modell CY8CMBR3106S, zu kommunizieren. Während der ersten Tests habe ich die USB-I2C-Bridge CY3240-I2USB von Cypress verwendet, die perfekt funktioniert. Ich wechselte dann zu einem Arduino für das Prototyping meiner eigenen Anwendung. Ich kann den Arduino jedoch nicht dazu bringen, zuverlässig mit dem CapSense-Controller zu kommunizieren. Mit der hier zu findenden I2C-Scanner-Skizze entdeckt der Arduino den CapSense-Controller vielleicht einmal von etwa 40 Versuchen.
Bei einem Versuch, dies zu debuggen, habe ich den Bus sowohl mit der Cypress USB-I2C-Brücke als auch mit dem Arduino untersucht. Ich habe festgestellt, dass der Controller mit der Cypress-Bridge immer ein ACK gibt und mit dem Arduino fast nie ein ACK generiert. Abgesehen von den unterschiedlichen Spannungen und Taktraten (mit denen ich vergeblich herumgespielt habe) kann ich jedoch keine größeren Unterschiede zwischen den von den beiden verschiedenen Quellen gesendeten Frames feststellen, die die inkonsistenten ACKs erklären würden.
An diesem Punkt bin ich etwas ratlos - für jeden Rat wäre ich sehr dankbar. Danke!
Hier sind ein paar Scope-Aufnahmen – beachten Sie, dass die Kanäle 1 und 2 SCL bzw. SDA sind.
Erfolgreiche Kommunikation über Cypress-Bridge (Beachten Sie ACK nach dem 8. Takt)
Fehlgeschlagene Kommunikation mit Arduino (beachten Sie das Fehlen von ACK)
Sehr seltene erfolgreiche Kommunikation mit Arduino
Wie in den obigen Kommentaren besprochen, bestand die Lösung in diesem Fall darin, die Frequenz der I2C-Übertragungen zu erhöhen.
Laut Datenblatt gibt der CapSense-Controller von Cypress bei der ersten I2C-Transaktion nach dem Aufwachen in den aktiven Zustand ein NACK aus. Wie @Roger Rowland feststellte, wechselt der Controller nach etwa 340 ms Inaktivität auf dem Bus in einen Energiesparzustand. Da meine Übertragungen weiter voneinander entfernt waren als dieses Timeout, würde jede Übertragung das Gerät aus dem Niedrigleistungszustand in den aktiven Zustand wecken und ein NACK erhalten. Dieses Problem wird gelöst, indem die Häufigkeit der Übertragungen auf weniger als den Timeout-Wert erhöht wird oder indem eine gegebene Übertragung Rücken an Rücken wiederholt wird, bis eine ACK empfangen wird.
Nick Alexejew
Tom Tischler
DJrapp
DJrapp
DJrapp
DJrapp
DJrapp
jms
DJrapp
DJrapp
DJrapp
Roger Rowland
DJrapp
DJrapp
dom
jms
Benutzer39962