www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik msp430 i²C UND SPI


Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mein verwendeter MSP hat eine gemeinsame I²C und SPI Schnittstelle. Das 
bedeutet doch, dass ich nicht mehr die möglichkeit habe, SPI und I2C- 
Teilnehmer parallel(zeitlich gesehen) zu betreiben.

Muss ich auf externe Schnittstellen als IC ausweichen?
Oder Gibt es fertige SW-Routinen, die eine gleichwertige Schnittstelle 
realisieren? Dann ist meine CPU-Auslasstung doch hoch oder? Will den 
Controller mit 32kHz ext. Clock laufen lassen.

Danke für Lösungen

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da der nur eine CPU hat, kannst du eh nicht 2 Sachen gleichzeitig 
machen. Du kannst aber immer noch zwischen I2C und SPI umschalten, die 
Anschlüsse sind ja bei fast allen MSP430 extra rausgeführt. Was 
verstehst du denn unter gleichzeitig? Und 32kHz als MCLK ist wirklich 
nur in ganz besonderen Fällen sinnvoll, wenn es wirklich auf µW 
ankommt...ansonsten nimmt man den DCO dafür, der wacht extrem schnell 
auf, braucht wenig Strom. Bei einem ordentlichen MSP430 Design ist die 
CPU nur ganz kurz während der Interrupt-Abarbeitung aktiv, die restliche 
Zeit im LPM...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"mein verwendeter MSP" - welcher?

Das hängt vom verwendeten MSP430-Derivat ab. Die "alten", wie 
beispielsweise der 'F16x, die können tatsächlich nur SPI oder I2C 
oder asynchron seriell.

In neueren MSP430-Varianten wird eine Kombination aus USCI_A und USCI_B 
verwendet, diese kann gleichzeitig SPI und I2C (oder asyn. UART und 
I2C oder asyn. UART und SPI).

> Will den Controller mit 32kHz ext. Clock laufen lassen.

Das sagt exakt gar nichts, denn damit lässt sich -je nach verwendeter 
Variante- auch der interne DCO betreiben. Und damit stehen -je nach 
verwendeter Variante- auch etliche MHz zur Verfügung.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In neueren MSP430-Varianten wird eine Kombination aus USCI_A und USCI_B
>verwendet...
Oder nur USI, dann geht wirklich nur SPI ODER I2C.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, sorry, da hatte ich mich missverständlich ausgedrückt.
Es gibt sehr unterschiedliche Hardwarevarianten des MSP430, deswegen ist 
es wichtig, zu wissen, um welche Variante es geht.

Würde der Threadstarter beispielsweise einen 'F5438 verwenden, wäre 
seine Frage unverständlich, da dieser vier USCI_A/B-Paare aufweist und 
so simultan vier I2C- und vier SPI-Schnitttellen bedienen kann.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht speziell um den MSP430F2274

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
UART ist ja auch noch da.

alle 3 lassen sich jedenfalls nicht nutzen :(

UART und SPI teilen sich nämlich einen Pin und zwar folgenden:
P3.4/UCA 0TXD /UCA0SIMO

also werde ich einfach UART und das TWI nutzen

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der '2274 verwendet dieselbe USCI_A und USCI_B-Kombination, wie sie auch 
im '5438 anzutreffen ist, halt nur einmal.

USCI_A0 ist für SPI zu verwenden, USCI_B0 ist für I2C zu verwenden.

Diese beiden kannst Du simultan verwenden.

Wenn Du noch zusätzlich eine UART benötigst, so muss USCI_A0 dran 
glauben bzw. je nach Bedarf umkonfiguriert werden. Oder Du verwendest 
eine Software-UART, was je nach zu übertragender Datenmenge auch kein 
Problem darstellen muss.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly schrieb:
> Der '2274 verwendet dieselbe USCI_A und USCI_B-Kombination, wie sie auch
> im '5438 anzutreffen ist, halt nur einmal.
>
> USCI_A0 ist für SPI zu verwenden, USCI_B0 ist für I2C zu verwenden.
>
> Diese beiden kannst Du simultan verwenden.
>
> Wenn Du noch zusätzlich eine UART benötigst, so muss USCI_A0 dran
> glauben bzw. je nach Bedarf umkonfiguriert werden. Oder Du verwendest
> eine Software-UART, was je nach zu übertragender Datenmenge auch kein
> Problem darstellen muss.

Oder die Timer UART, das ist ziemlich geschickt gemacht beim MSP430 mit 
dem Timer A.

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der SPI ein Master sein soll, würde ich das als Software machen, 
ist doch viel einfacher als UART. Selbst ein I2C Master ist noch 
einfacher in Software zu machen als UART...

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe einen Beitrag eröffnet, der mir als Ergebnis eine SW-UART 
ausgespuckt hat. Diese werde ich wohl auch nutzen müssen.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, was genau willst du denn machen? In deinem ersten Beitrag hast du 
von UART nix geschrieben.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was genau ich machen will?

Also die UART will ich auf jeden Fall nutzen. Für einen X-Port. Das SPI 
und das TWI brauche ich für die Auswertung verschiedener Sensoren. ca 10 
digitale sensoren.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso. Ja, da bräuchtest du einen der MSP430 mit den 4 USARTs drin, da 
ginge das alles gleichzeitig. Mit dem F2274 gehts nicht alles in HW.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
controller ist leider vorgeschrieben, also muss ich wohl eine der drei 
Interfaces via SW aufbauen.

  ODER:

Ich will die sensordaten alle was weiß ich vllt 10 min auslesen. Für die 
Zeit des Auslesens sind SPI und I2C aktiv.
Jede Stunde etwa ist die UART an für die Datenübermittlung via X-Port. 
Vllt hilft mir das auch, weil so kann ich die Schnittstellen zeitlich 
voneinander trennen, mal läuft es so, mal läuft es so, das wäre die 
Lösung für mich.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den Zeitvorgaben ist eine sequentielle Ansteuerung sicherlich der 
gangbarste Weg. I2C steuerst Du mit USCI_B0 an, SPI und UART mit 
USCI_A0. Mit einer zusätzlichen Steuerleitung (irgendein freier 
Port-Pin) schaltest Du die eine doppelt verwendete Signalleitung 
zwischen SPI- und UART-Betrieb um.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"umschalten"

Heißt das, dass ich eine Art Wechselschalter (als Halbleiter) nutze, der 
mir entweder den einen oder den anderen Weg frei schaltet?

Weil wenn die doppelt genutzte Leitung einfach UART-Signale an 
SPI-Teilnehmer sendet, gibt es sicher nix gutes...
umgekehrt natürlich genauso.

Wie realisiere ich solch einen Wechsler am einfachsten? Ne 
Transistorschaltung? oder gibt es IC`s?

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie realisiere ich solch einen Wechsler am einfachsten? Ne
>Transistorschaltung? oder gibt es IC`s?
Z.B. mit einer Hand voll Logik Bausteinchen (74xx08, 74xx00 usw.)

Ich persönlich würde den SPI Master aber einfach in ein paar Zeilen Code 
als Software realisieren.

Autor: Timo P. (latissimo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Gibts einen bestimmen Grund für die Auswahl, was die SW-Schnittstelle 
anbelangt? Ich meine warum SPI, warum nicht UART oder I²C?
Ist der Programmieraufwand geringer?

mfg Timo

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ist der Programmieraufwand geringer?
Ja. Vor allem verbraucht man für SPI oder I2C keine kostbaren Timer :)
Für SPI musst du nur Portpins auf high-und low legen ohne dich groß um 
das Timing zu kümmern. Einfacher gehts nicht.

Z.B.
Lese-Schreibroutine für SPI (74HC165/74HC595)
unsigned char rw_74HC165_74HC595 (unsigned char data_out)
{
  unsigned char i;
  unsigned char data_in;
  
  data_in = 0;
  
  // 74HC165 Eingaenge in Shift Register uebertragen
  LOAD_L;
  LOAD_H;
  
  for(i = 0x80; i != 0; i >>= 1)
  {
    // Bit ausgeben
    if (data_out & i) MOSI_H;
    else              MOSI_L;

    // Bit lesen
    if (MISO_IN_H) data_in |= i;    
    
    // Takt ausgeben
    CLK_H;
    CLK_L;
  }
  
  // 74HC595 Ausgaenge setzen
  SET_H;
  SET_L;
  
  return data_in;
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.