Forum: Mikrocontroller und Digitale Elektronik I²C und SPI parallel nutzen mit nur einem SFR.


von Gerdohard (Gast)


Lesenswert?

Hallo Leute!

Ich habe mal eine Frage zur Benutzung von SPI und I²C. Mit SPI bin ich 
bestens vertraut, ich habe aber noch nie ein I²C-IC verwendet. Jetzt 
wird es Zeit, bzw. jetzt muss ich nen I²C-ADC einsetzen.

Als uC verwende ich einen MSP430. Dessen Pins teilen sich beide 
Funktionen für SPI und I²C.

P1.5 SCLK (SPI)
P1.6 SDO (SPI) / SCL (I²C)
P1.7 SDI (SPI) / SDA (I²C)

Jetzt habe ich das Problem, dass ich SPI ebenfalls benötige. Das SFR 
kann ich ja zwischendruch umschalten. Beim SPI-Device mache ich mir 
keine Sorgen, da sorgt erst ein Latch für die Datenübernahme. Es ist 
also egal, was vorher auf den Leitungen passiert ist, solange ich danach 
16 gültige Bits reintakte und latche.

Aber wie ist es mit dem I²C-Device? Da wird ja adressiert. SCLK vom SPI 
ist seperat, aber der Datenausgang des SPI ist gleichzeitig das 
CLK-Signal vom I²C - es werden also bei einem SPI-Schreibvorgang 16Bit 
an das I²C-Device übertragen. Der Pegel ist dann immer 'high', da die 
Pull-Ups vom I²C den Signalpegel oben halten (ich bekomme keine Daten 
über SDI rein, es ist ein reiner Datenausgang).

Kann ich da jetzt Probleme bekommen? Oder mache ich mir gerade Sorgen, 
wo keine sind?

von Gerdohard (Gast)


Lesenswert?

Gerdohard schrieb:
> gleichzeitig das
> CLK-Signal vom I²C - es werden also bei einem SPI-Schreibvorgang 16Bit
> an das I²C-Device übertragen

Ich revidiere...müssen ja garnicht 16 sein, da es ja vom Dateninhalt 
abhängt. Wie verhält sich also ein I²C-Device bei einer beliebigen 
Anzahl von Takten?

von Klaus (Gast)


Lesenswert?

Gerdohard schrieb:
> Wie verhält sich also ein I²C-Device bei einer beliebigen
> Anzahl von Takten?

Wenn du Pech hast, schlecht. Ich würde mit der Select-Leitung vom SPI 
den I2C Bus schalten.

MfG Klaus

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Das Problem klingt interessant.

Ich würde den I²C-Clock mit 'nem Oder-Gatter auf High halten, wenn SPI 
benutzt wird, hab's aber noch nicht ausprobiert.

Gerdohard schrieb:
> ich bekomme keine Daten über SDI rein

Das wär schön, wenn wir im Wiki eine Lösung beschreiben könnten, die 
auch geht, wenn über SDI Daten reinkommen.

von DS aus W (Gast)


Lesenswert?

Das Problem ist keines mehr, wenn man einen Typen
eisetzt, der USCI_A0 UND UCCI_B0 separat hat-
z.B. Launchpad 1.5 mit MSP430G2553.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

DS aus W schrieb:
> Das Problem ist keines mehr, wenn man …

Tja, wenn man dies oder das macht. Aber das war nicht die Frage.

Man kann den SPI auch über Timer-Interrups und separate Pins ansteuern, 
statt die dafür vorgesehenen Pins zu nehmen.

Eine generelle Lösung für die o.g. Konstellation wäre m.E. trotzdem 
interessant, allein um zu beurteilen, welcher Aufwand das wäre und ob 
sich der Aufwand im Einzelfall lohnt.

von Gerdohard (Gast)


Lesenswert?

Klaus schrieb:
> Ich würde mit der Select-Leitung vom SPI
> den I2C Bus schalten.

Ne CS-Leitung habe ich ja garnicht. Ich toggle nur ein Latch am Ende der 
Daten, also einmal high, dann wieder low.

Torsten C. schrieb:
> Ich würde den I²C-Clock mit 'nem Oder-Gatter auf High halten, wenn SPI
> benutzt wird, hab's aber noch nicht ausprobiert.

Ist natürlich ne Möglichkeit, aber eben halt ein extra Bauteil. Wäre 
nicht schlimm aber:

Torsten C. schrieb:
> Man kann den SPI auch über Timer-Interrups ansteuern

dann würde ich im schlimmsten Fall eben bitbangen, da brauche ich ja 
nichtmal nen Timer für, auch wenn es dann nicht mehr Interrupt-gesteuert 
ist. Den SPI würde ich halt nur gerne verwenden, damit das im 
Hintergrund läuft (also evtl. wirklich mit Timer).

DS aus W schrieb:
> Das Problem ist keines mehr, wenn man einen Typen
> eisetzt, der USCI_A0 UND UCCI_B0 separat hat-
> z.B. Launchpad 1.5 mit MSP430G2553.

Da ist natürlich die Lösung des Tages. Da hätt ich noch eine: Einfach 
nen SPI-ADC, oder das SPI-Teil gegen eines mit I²C austauschen....:-\ 
Trotzdem danke!

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.