Arduino steuert device über I²C und SPI an

Hallo,

habe ein Frage bezüglich, der Ansteuerung von I2c /SPI devices über den Arduino Mega2560.
Und zwar muss man ja die Devices adressieren, die man ansteuern möchte, nun möchte ich aber es nicht jedesmal neu programmieren müssen, um ein anderes I²C/SPI device anzusteuern.

Kann man die Adressierung bzw. die Programmierung des Devices Variabel gestalten, z.b. dass ich über meine GUI die Device / Slave Adresse sende und mein Arduino diese empfängt und er damit diese ansteuern kann?

Beim SPI werden die Devices nicht über eine Adresse angesprochen, sondern über den Chip Select Pin wird gesteuert für welches Device die darauf folgenden Daten bestimmt sind.

Es gibt aber auch IC's welche über SPI gesteuert werden aber keinen Chip Select Pin haben, wie z.B. der TLC5940.

Siehe hier unter SS (Slave Select): SPI - Arduino Reference

Natürlich kannst Du die Adresse bzw Chip-Select Pin per Tastatur oder ein anderes Interface eingeben.
Du kannst auch die vorhandenen Adressen per I2C Scanner (Arduino Playground - I2cScanner) bzw durch Auslesen eines Registers des SPI-Devices durch Scanning aller verfügbaren Pins des Arduinos erfahren und dann dementsprechend die Devices ansprechen.

Du mußt dann aber wissen was wo dranhängt und wie und mit welchen Daten es angesprochen werden muß.

Grüße Uwe

Bei I2C hingegen werden die Devices über eine Addresse angesprochen.

#include <Wire.h>

int DeviceAddress;

void setup(void) {
  Serial.begin(9600);
  DeviceAddress = 0x50;
  Wire.begin();
}

void loop(void) {
  Wire.beginTransmission(DeviceAddress);
  // Restlicher Code, Wire.send( ..... );
  Wire.endTransmission();
}

In deinem Fall müsstest Du die Addresse mit Serial.read als zwei Byte Werte einlesen und daraus den entsprechenden Integer Wert bilden.
Diesen dann im obigen Beispiel an die DeviceAddress Variabel übergeben.

Danke euch, werde es sobald es geht ausprobieren und euch berichten.

hi,

bin nicht ganz sicher, ob Dir schon klar ist, daß I2C und SPI verschiedene dinge sind.

vor ein paar tagen gab's diesen thread dazu:

gruß stefan

Hi :D, den Unterschied zwischen I2c und SPi verstehe ich, aber danke für den link, der ist echt hilfreich.
Mein Problem ist, in diesem MAXIM board gibt es ja mehrere Register z.b. register 0 für LEDStrom 1 usw.
Meine frage ist , wie mache ich es dass er den Befehl z.b. in dem richtigen Register schreibt bzw wie mache ich das wenn ich den Strom der LED-kette1 ändern möchte?
Gebe ich es als Zahl ein oder als Befehl?

in diesem MAXIM board gibt es ja mehrere Register

Welches MAXIM Board? Wo ist der Link zum Datasheet? Wie hast Du das Board an den Arduino angeschlossen? Wir haben nur die Information, die Du hier gepostet hast, mehr können wir nicht wissen, solange Uwe’s Kristallkugel immer noch kapput ist.

Hatte es oben geschrieben ,aber mache es nochmal :D.
Also das ist der MAXIM 16826 Led driver.
Dieser wird über I²C an dem Arduino angeschlossen.
Datasheet: MAX16826 Programmable, Four-String HB LED Driver with Output-Voltage Optimization and Fault Detection

So die erste frage ist ,müsste ich eventuell auch den EN - Pin mit anschliessen? Wenn ja, könnte ich ja einen freien digitalen pin am arduino nehmen?

SO jetzt hast du die von dir benötigten Daten.
Würde mich über einige Tipps freuen , danke

Hatte es oben geschrieben ,aber mache es nochmal

Kann sein, dass Du das vorhattest, aber im ganzen vorangegangenen Thread kann ich weder "MAXIM" noch "16826" finden, also hast Du die relevanten Infos sicher noch nicht geschrieben.

Dieser wird über I²C an dem Arduino angeschlossen.

Wozu dann SPI in's Spiel bringen?

Post mal Dein Verdrahtungsschema oder mach ein entsprechendes Foto von Deiner Verdrahtung.

So die erste frage ist ,müsste ich eventuell auch den EN - Pin mit anschliessen?

Je nachdem, wie Du den Chip sonst verdrahtet hast. Evtl. kannst Du ihn auch einfach hochziehen (an Vcc anschliessen).

SO jetzt hast du die von dir benötigten Daten.

Beinahe. Du redest von einem Board. Das Datenblatt beschreibt aber nur einen Chip. Welches Board verwendest Du?

War wohl im Gedanken des Schreibes mit Arduino Forum verlinkt. :wink: :wink:
Grüße Uwe

JA genau Uwe ;).
Sorry

Also man könnte sich also auch hier auf dem thread beziehen. Würde mich auf eine Antwort freuen.

uwefed:
War wohl im Gedanken des Schreibes mit Arduino Forum verlinkt. :wink: :wink:
Grüße Uwe

Wäre über eine Antwort froh

Auch in jenem Thread ist das Board nicht verlinkt. Ich hole das deshalb hier nach: http://datasheets.maximintegrated.com/en/ds/MAX16826EVKIT.pdf. Falls Du nicht dieses Board hast, bist Du in der Pflicht, den richtigen Link nachzuliefern.

Wenn Du wirklich nur Vcc, GND, SDA und SCL verdrahtet hast, solltest Du EN an Vcc anschliessen. Und Pull-Ups für die beiden I2C-Leitungen solltest Du auch noch einsetzen.

pylon:
Auch in jenem Thread ist das Board nicht verlinkt. Ich hole das deshalb hier nach: http://datasheets.maximintegrated.com/en/ds/MAX16826EVKIT.pdf. Falls Du nicht dieses Board hast, bist Du in der Pflicht, den richtigen Link nachzuliefern.

Wenn Du wirklich nur Vcc, GND, SDA und SCL verdrahtet hast, solltest Du EN an Vcc anschliessen. Und Pull-Ups für die beiden I2C-Leitungen solltest Du auch noch einsetzen.

Hi pylon, da genau das ist das Board, habe allerdings den ControllerBoard abgetrennt und verwende nur den LED Driver Board.
So jetzt die frage zu dem EN. Du sagtest ja ich sollte den EN-Pin an VCC setzen. So jetzt dachte ich mir, kann ich nicht einen Digitalen I/O am Arduino nehmen. Diese würde ich sicherheitshalber am Anfang auf LOW setzen und wenn ich das Brauche dann auf HIGH ?

Und zu den PULL-UPs. Die bräuchte ich doch eigentlich nicht oder täusche ich mich? Woher weißt du, dass ich PUll-ups brauche? Müssten doch schon integriert sein

Danke dir :smiley:

Bzw. diese Pull-ups gehen ja von SDA/SCL an VCC vom arduino oder an was?
Weil ich das MAXIM Board nicht über den Arduino versorge sondern mit einem extra netzteil:D

So jetzt die frage zu dem EN. Du sagtest ja ich sollte den EN-Pin an VCC setzen. So jetzt dachte ich mir, kann ich nicht einen Digitalen I/O am Arduino nehmen. Diese würde ich sicherheitshalber am Anfang auf LOW setzen und wenn ich das Brauche dann auf HIGH ?

Ja, das geht auch, wenn Du den GPIO dafür opfern willst.

Und zu den PULL-UPs. Die bräuchte ich doch eigentlich nicht oder täusche ich mich? Woher weißt du, dass ich PUll-ups brauche? Müssten doch schon integriert sein

Der Arduino hat nur sehr schwache Pull-Ups, die genügen in den meisten Fällen nicht. Wo müssten die integriert sein? Im MAXIM-Board? In Schema sind sie zumindest nicht aufgeführt, also muss ich davon ausgehen, dass es sie nicht gibt. Es ist auch nicht üblich, sie bei I2C auf einem Board zu integrieren, da es sie nur einmal pro Bus braucht.

Bzw. diese Pull-ups gehen ja von SDA/SCL an VCC vom arduino oder an was?
Weil ich das MAXIM Board nicht über den Arduino versorge sondern mit einem extra netzteil:D

Hast Du aber die Massen von beiden Boards verbunden?
Und ja, die Pull-Ups gehen an Vcc, ob Du die vom Arduino oder vom Board nehmen willst, spielt keine Rolle, aber es darf nicht Vin sein und ich sehe nicht, ob Vcc überhaupt vom Board rausgeführt wird. Die Arduino-Seite dürfte also einfacher sein. Nimm mal 3k3 oder 4k7, das sollte bei nicht allzu langen Verbindungen von SDA und SCL in etwa richtig kommen.

Hast Du aber die Massen von beiden Boards verbunden?
Und ja, die Pull-Ups gehen an Vcc, ob Du die vom Arduino oder vom Board nehmen willst, spielt keine Rolle, aber es darf nicht Vin sein und ich sehe nicht, ob Vcc überhaupt vom Board rausgeführt wird. Die Arduino-Seite dürfte also einfacher sein. Nimm mal 3k3 oder 4k7, das sollte bei nicht allzu langen Verbindungen von SDA und SCL in etwa richtig kommen.

Also die beide Massepunkte habe ich ich miteinander verbunden und dann rausgeführt als anschluss für das Netzteil.
So jetzt würde ich es folgendermaßen machen ich würde von dem MAXIM board 2xmal 4l7 drauf und zu Vin gehen. Wäre das ok?
Der Arduino hat doch welche Pullup.
Müssten doch die RN2B, RN2C sein?

Schaue schematic:

Wie kommst du auf die Werte mit 4k7? Kannst du mir das rechnerisch erklären?

Neiiiiiiiiin
Pullup Widerstände für I2C nicht auf Vin sondern auf 5V !!!

4,7 kOhm ist ein Standartwert. Kann runter bis 1,5kOhm gehen aber belastet dann unnötig die Treiber.

Grüße Uwe

Ja aber auf dem LEd Driver Board habe ich keine 5V :(.
Hat der Arduino keine Pullups für i2C?
Wenn doch wozu brauche ich die? muss ichsie dann irgendwie ausstellen