sollte ich 2 SPI-Geräte auf Arduino UNO/PRO oder 2 I2C-Geräte verwenden?

Ich verwende ein microSD-Breakout-Board und den Beschleunigungssensor ADXL345 https://www.sparkfun.com/products/9836 .

jeder allein funktioniert einwandfrei, aber sobald ich beide gesetzt habe (Pins 11,12,13 teilen, aber mit unterschiedlichen CS-Pins), funktioniert nichts.

Ich verwende einen anderen Sensor mit dem I2C, nämlich den BMP085: https://www.sparkfun.com/products/11282

Der Beschleunigungsmesser funktioniert auch in I2C, aber das erfordert Pull-up-Widerstände, wenn sich mehrere Geräte I2C teilen.

Ich wollte SPI, da es einfacher schien, wo ich einfach den CS angeben kann und alles hätte funktionieren sollen.

Übersehe ich etwas im SPI-Fall? Ist es besser, Geräte auf I2C statt auf SPI zu teilen?

Wie oben sollte OK funktionieren. Wie sind sie verbunden? Wenn Sie ein Steckbrett und Jumper verwenden, besteht die Möglichkeit, dass Sie am Ende zu viel Kapazität auf dem SPI-Bus haben. Wenn sie voneinander entfernt sind, wäre es einen Versuch wert, sie mit kürzeren Jumpern näher zusammenzubringen.
hmmmmm ich c. Ich werde versuchen, alles mit möglichst geringer Fläche zu löten, um diesen Effekt zu minimieren (das werde ich später im Labor versuchen). SPI sollte also mit einfachen Verbindungen einwandfrei funktionieren. Keine Schaltung als Pull-up-Widerstände oder so erforderlich?
Sie werden immer noch einen einzelnen Satz Klimmzüge auf dem SPI-Bus benötigen, ich bin mit diesem speziellen Board nicht vertraut, aber prüfen Sie, ob sie an Bord vorhanden sind. Wenn Sie im Moment keine haben, ist das eine andere Möglichkeit.
I2C benötigt Pullup-Widerstände, selbst wenn die MCU nur mit einem Gerät spricht. I2C-Busleitungen sind per Spezifikation so definiert, dass sie über Open-Drain-Schaltungen angesteuert werden, und die Pullups sind wesentlich, um die hohen Pegel auf den Signalleitungen bereitzustellen.

Antworten (1)

Die Auswahl macht wirklich wenig Unterschied, wenn Sie die Arduino-Bibliotheken verwenden. Sie sollten die gleiche Art von Leistung sehen.

Was die i2c-Pullup-Widerstände betrifft, hat die BMP085-Platine, mit der Sie verbunden sind, bereits Pullups auf der Platine, die mit einem geschlossenen Lötjumper verbunden sind. Dieselben Klimmzüge sollten für beide Sensoren ausreichen, sodass Sie keine weiteren hinzufügen müssen.

Aber es gibt keinen Grund, warum der Sensor nicht auch mit einer SD-Karte auf SPI funktionieren sollte. Hast du nochmal überprüft, ob du alle Böden miteinander verbunden hast? Wie funktioniert es nicht? Funktioniert es nur für einen Lese-/Schreibvorgang, bevor es fehlschlägt? Stellen Sie sicher, dass Sie beide CS-Pins auf High / Low treiben, anstatt einen als schwebenden Eingang zu belassen?

Ehrlich gesagt halte ich es für einen Fehler, dass Sparkfun Klimmzüge auf I2C-Slave-Module setzt. Was ist, wenn das Design viele Module hat und der kombinierte Pull-up-Widerstand zu steif ist? Es gab kürzlich einen Thread zum Thema Klimmzüge an mehreren Modulen .
@NickAlexeev Sie sind zu einem Lötjumper-Setup übergegangen, sodass Sie den Jumper ablöten können, um die Pullups zu deaktivieren. Oder Sie können immer die Spur schneiden. Es ist nicht so schwer. NBD.
Nein, es ist nicht schwer, den Pull-up zu deaktivieren. Beachten Sie, dass Arduino keine (optionalen) Pull-ups hat und seine internen Pull-ups zu schwach für I2C sind. Also schleppt SparkFun Klimmzüge überall hin. Einfachere anfängliche Out-of-the-Box-Erfahrung. Wenn Sie jedoch ein paar Slave-Module hinzufügen, funktioniert der Bus nicht mehr.
Alles funktionierte jetzt. Ich habe nichts geändert, ich denke, es war nur eine lose Verbindung. Ich hatte diese Befürchtung, da einige Threads ernsthaft über diese Art und Weise sprachen, wie hier: forum.arduino.cc/index.php?topic=50010.0 und hier: forum.arduino.cc/index.php/topic,49987.0.html