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
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...
"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.
>In neueren MSP430-Varianten wird eine Kombination aus USCI_A und USCI_B >verwendet... Oder nur USI, dann geht wirklich nur SPI ODER I2C.
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.
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
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.
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.
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...
Habe einen Beitrag eröffnet, der mir als Ergebnis eine SW-UART ausgespuckt hat. Diese werde ich wohl auch nutzen müssen.
Hm, was genau willst du denn machen? In deinem ersten Beitrag hast du von UART nix geschrieben.
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.
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.
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.
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.
"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?
>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.
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
>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)
1 | unsigned char rw_74HC165_74HC595 (unsigned char data_out) |
2 | {
|
3 | unsigned char i; |
4 | unsigned char data_in; |
5 | |
6 | data_in = 0; |
7 | |
8 | // 74HC165 Eingaenge in Shift Register uebertragen
|
9 | LOAD_L; |
10 | LOAD_H; |
11 | |
12 | for(i = 0x80; i != 0; i >>= 1) |
13 | {
|
14 | // Bit ausgeben
|
15 | if (data_out & i) MOSI_H; |
16 | else MOSI_L; |
17 | |
18 | // Bit lesen
|
19 | if (MISO_IN_H) data_in |= i; |
20 | |
21 | // Takt ausgeben
|
22 | CLK_H; |
23 | CLK_L; |
24 | }
|
25 | |
26 | // 74HC595 Ausgaenge setzen
|
27 | SET_H; |
28 | SET_L; |
29 | |
30 | return data_in; |
31 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.