I2C... welche Ports sind noch frei?

micserver

Member
Hallo, auf dem 1.3er Board sind ja eine Menge I2C Schnittstellen. Die sind sicher nicht alle für Erweiterungen reserviert... ich würde gerne eine nutzten aber nicht's für die Zukunft blockieren, welche sind noch nicht verplant?
Zusatzfrage: wie spreche ich einen bestimmten I2C Port an (muss zugeben, dass ich noch nicht im Code gesucht habe).
Gruss Michael
 
Grundsätzlich ist doch nur die Adresse des I2C Devices erheblich. Den Port kann man doch später beliebig switchen.
Funktionen sind in: I2C.h/cpp
 
Ich verfolge das Konzept von al_ohr3: 2 Nanos bekommen über I2C die Geschwindigkeitsinformation für die Schrittmotoransteuerung. Im Moment greife ich den I2C Port am RTC Modul ab (also SDA1..), möchte aber direkt auf z.B. den 7. PORT schreiben...da bin ich noch etwas verloren wie ich jetzt PC7 direkt ansteuerte...
Gruss Michael
 
Ich weiss aktuell nicht was du mit 7. PORT meinst. Vermutlich PC7?
Wenn du 2 devices hast mit unterschiedlichen Adressen würde ich auch zwei Ports verwenden.
I2C ist ein Bussystem. Du musst das Device an den Bus hängen und über die Adresse ansprechen.
Um die einzelnen Anschlüsse auf dem PCB1.3 zu aktivieren, muss glaube ich ein Jumper für den entsprechenden Anschluss gesteckt werden.
Hier in dem Schaltbild nachschauen.
 
Ja, ich meine z.B. PC 7 ... mir fehlt im Moment nur der Faden wie ich den in der Software anspreche... an PC 1 kann ich ja schon ausgeben.
Gruss Michael
 
Ich bin der Meinung du sprichst PC7 nicht in der Software an. Der ist nur physikalisch so benannt wegen den Bauteilen. Du verwendest in der Software nur die Deviceadresse. Es ist ein Bus.
 
Hallo Michael,
damit Du an Ostern nicht unnötig Zeit opfern musst, ein paar kleine Erklärungen zu Deiner Frage.

I2CReserveAnschluesse.png


Alle freien I2C Anschlüsse die Du auf jeden Fall nehmen kannst sind mit "Res." (Reserve) gekennzeichnet.
Die Anschlüsse für den I2C sind alle gleichberechtigt, dass bedeutet theoretisch kannst jeden nehmen.
Praktisch stimmt das nicht so ganz. Ich habe Dir mit einem grünen Pfeil die Jumper markiert die es für jeden I2C Anschluss gibt.
Über diese Jumper kann man festlegen mit welcher Bus-Spannung der Slave (in deinem Fall der Nano) arbeitet.
Bei einem Nano sind das dann normalerweise 5V.
Das bedeutet du musst die Bus-Spannung über den Jumper für den jeweiligen Anschluss setzen!
Wichtig ist auch zu beachten, dass alle "I2C-Res." Anschlüsse mit Pullup-Widerständen für SDA und SCL ausgestattet sind.
Damit darfst Du auf deinen Slave's (bei dir NANO's) keine weiteren I2C PullUp-Widerstände haben.
Das ist auch genau der Grund warum es so viele I2C-Anschlüsse gibt. Die meisten fertigen Platinen (IMU, RTC, etc.) besitzen bereits solche
Widerstände. Hätte man alle möglichen fertigen Slave's (IMU, RTC, etc.) an dem Bus wäre dieser völlig überfordert. Zumal jeder Slave auch noch
unterschiedliche Bus-Spannungen haben kann (3,3V-5V) was der Gesundheit der meisten IC's sehr schaden kann wenn man es falsch macht.

Selektiert wird ein Slave im I2C-Bus immer über seine Slave-Adresse. Du brauchst also für den verwendeten Anschluss nichts spezielles
programmieren, Du musst nur die oben beschriebenen Dinge beachten.

Gruß
Jürgen
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/2370/I2CReserveAnschluesse.png/
 
Zuletzt bearbeitet von einem Moderator:
Hi
Very important and clear answer maybe good if you can put it into the wiki in german and english.
Thanks.
 
Bei den IC2 Anschlüssen auf der Platine ist noch folgendes zu wissen
Der 1 Anschluss ist für die RTC Uhr. Da die RTC Uhr bereits 2 10K Pullup Widerstände auf der Platine hat sind auf der 1.3 Mainboard keine vorgesehen.
Bei den Anschlüssen 2 und 3 sind ebenso keine Pullup vorgesehen . Die Widerstände auf der Platine sind vorgesehen aber nicht bestückt und können bei Bedarf bestückt werden. Das IMU Modul hat z.B 2 Pullups auf dem Modul sitzen.

Bei den Anschlüssen 4-7 sind bereits jeweils auf der Platine 2 10K Pullup vorhanden.
Wenn schon an den anzuschließenden Modul Pullup Widerstände vorhanden sind müssen diese an den Modul oder an der Platine 1mal entfernt werden( 2 Widerstände) damit diese nicht 2mal vorhanden sind.
Alternativ kann das Modul auf den Anschlüssen 2 oder 3 verwendet werden wo auf dem Mainboard die Pullups nicht bestückt sind.

Die Bezeichnung der Module dient nur zur Unterschreitung auf der Platine. Die Module werden ausschließlich über ihre Adresse erkannt und angesprochen.

Gruß
Uwe
 
Also Very important is to never use 2 modules with same I2C Adress.
For example the IMU GY87 Can't work on PCB1.3 because it use the same adress as the RTC.
@Uwe Why you use PCA9517D instead of TCA9548A ? (No jumper and no adress issue).
By.
 
Hy Bernard,
With this chip you must first select the desired channel by software. That was exactly what we did not want.

Regards
Jürgen
 
Yes i understand that but it's very easy and can solve a lot of issue into I2C.
It work with 3.3 and 5V and can access to multiple IMU for example .
I use it with PCB1.2 and here the code :
into driver.cpp:


Code:
void tca9548PortSelect(uint8_t i) {  //select the port for i2c multiplexer
  if (i > 7) return;
  Wire.beginTransmission(TCA9548_ADDRESS);
  Wire.write(1 << i);
  Wire.endTransmission();  
}

and to read the imu for example:

Code:
if (millis() >= nextTimeImuLoop) {
    if (imuUse) {
      if (i2cTca9548Use) { //GY801 on port 3 /  RTC on port 2  / GY87 on port 1  / CompassGps on port 0
        if (i2cPortInUse != 3) {
          i2cPortInUse = 3;   //we want to read the GY801
          tca9548PortSelect(i2cPortInUse);
        }
      }
      imu.update();
    }
    nextTimeImuLoop = millis() + 10;
  }


By.
 
Oben