Forum: Mikrocontroller und Digitale Elektronik nRF52 Arduino I2C


von chris (Gast)


Lesenswert?

Weiß jemand, wie man die I2C-Schnittstelle auf bestimmte Pins festlegt?

Ich suche nach der Initialisierung passen zur Adafruit Bibliothek:
https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/master/libraries/Wire/Wire_nRF52.cpp

von Einer K. (Gast)


Lesenswert?

Ich weiß nur wo sie festgelegt wird.
in der betreffenden variant.h
z.B. 
https://github.com/adafruit/Adafruit_nRF52_Arduino/blob/7b8d3e1f4172f8618f5e2e7978047628cda84c76/variants/circuitplayground_nrf52840/variant.h

Wie sich Änderungen auswirken, kann ich nicht sagen.

von chris (Gast)


Lesenswert?

Danke für die Antwort.
Mir ging's jetzt eher um den konkreten Syntax.

Das Beispiel für die Standardpins für TWI sieh ja so aus:
1
#include <Wire.h>
2
3
void setup()
4
{
5
  Wire.begin(); // join i2c bus (address optional for master)
6
}
7
8
...

Ich will sie aber umbiegen können und vermute diese Funktion:

TwoWire::TwoWire(NRF_TWIM_Type * p_twim, NRF_TWIS_Type * p_twis, 
IRQn_Type IRQn, uint8_t pinSDA, uint8_t pinSCL)

Wie sieht ein Codebeispiel aus, um die Pins festzulegen?

von Einer K. (Gast)


Lesenswert?

chris schrieb:
> Wie sieht ein Codebeispiel aus, um die Pins festzulegen?

Habe ich doch gerade gesagt!
Oder nicht?
Warum verlinke ich das überhaupt?

Übrigens das was du Funktion nennst ist der Konstruktor!
Und dessen Aufruf (instanziirung von Wire und Wire1) findest du in der 
*.cpp Datei welche du verlinkt hast.

Aber vielleicht siehst du das ja nicht, .....

Also lese ich dir das mal vor:
1
//..schnipp
2
3
#if WIRE_INTERFACES_COUNT > 0
4
TwoWire Wire(NRF_TWIM0, NRF_TWIS0, SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, PIN_WIRE_SDA, PIN_WIRE_SCL);
5
6
//..schnipp
7
8
#if WIRE_INTERFACES_COUNT > 1
9
TwoWire Wire1(NRF_TWIM1, NRF_TWIS1, SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn, PIN_WIRE1_SDA, PIN_WIRE1_SCL);
10
11
//..schnipp

von chris (Gast)


Lesenswert?

Danke.
Allerdings sehe ich im von dir geposteten Link nur die Pin-Definitionen, 
nicht aber den Code den du ausgeschnitten hast ....?

Und ich kenne die Bedeutung dieser Definitionen nicht:
NRF_TWIM1, NRF_TWIS1, SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQn

von Einer K. (Gast)


Lesenswert?

chris schrieb:
> Allerdings sehe ich im von dir geposteten Link nur die Pin-Definitionen,
> nicht aber den Code den du ausgeschnitten hast ....?

Wo ich den ausgeschnitten habe?

Arduino Fanboy D. schrieb:
> Und dessen Aufruf (instanziirung von Wire und Wire1) findest du in der
> *.cpp Datei welche du verlinkt hast.

Du findest den Code also nicht hinter MEINEM Link, sondern hinter 
DEINEM.


Korrektur:
instanziirung: Instantiierung

von chris (Gast)


Lesenswert?

Ich hatte vermutet, dass man bei der MCU die I2C pins in gewissen 
Grenzen frei konfigurieren kann.
Wenn ich es richtig sehe, gibt es aber nur Wire und Wire1 mit 
festgelegter Pinzuordnung. Jetzt wäre die Frage, ob die MCU mehr kann 
oder nur die Arduino Lib auf die zwei Pins beschränkt ist.

von Einer K. (Gast)


Lesenswert?

Das solltest du im Datenblatt des betreffenden µC finden können.

von John P. (brushlesspower)


Lesenswert?

Adafruit hat für den NRF52 leider keine Funktion vorgesehen die Pins zu 
ändern.

1. Definiere dir eine neue Varaint mit deinen I2C Pins
2. Andere die bestehende Variant
3. Wenn du die I2C Pins während der Laufzeit ändern willst/musst, dann 
darfst du Wire bzw Wire1 nicht nutzen sonden musst eine eigene TwoWire 
Class initialisieren mit den entsprechenden Pin und 
Peripheriezuordnungen.

von Sim (Gast)


Lesenswert?

In der Library, die du verlinkt hast gibt es eine Methode setPins(..).
Das heißt mit einer Zeile

Wire.setPins(sda_pin,scl_pin)

lassen sich die Pins leicht ändern.
Ich vermute, das das nur vor Wire.begin() geht, aber das habe ich jetzt 
noch nicht direkt ausprobiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.