mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 Bytes über SPI senden ohne Pause


Autor: ThoBi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte über SPI beim MSP mehrere Bytes an einen Funkchip senden. Mit 
folgendem Code in C funktioniert das auch:
for( a = 6 ; a >= 0 ; a--)
{
        TXBUF1 = test[a];                     
        while (!(IFG2 & UTXIFG1));          // USART1 TX frei?
}

bei test handelt es sich um ein array mit 7 bytes. Mit der 
while-schleife warte ich bis der Buffer leer ist und lade dann das 
nächste Byte.
Jetzt entsteht aber zwischen den jeweiligen Bytes eine Pause, da der MSP 
ja erst die Daten wieder laden muß. Die 7 Bytes sollten aber ohne Pause 
an den Funkchip gesendet werden.
Besteht da eine Möglichkeit...
Oder muß ich die Daten irgendwie über normale I/O Pins rausschicken?


Vielen Dank

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ThoBi (Gast)

>Jetzt entsteht aber zwischen den jeweiligen Bytes eine Pause, da der MSP
>ja erst die Daten wieder laden muß.

Logisch, der MSP muss den Arrayzugriff machen und auch die 
Schleifenvariable bearbeiten. Besser so.

char tmp;

for( a = 6 ; a >= 0 ; a--)
{
    tmp = test[a];
    while (!(IFG2 & UTXIFG1));          // USART1 TX frei?
    TXBUF1 = tmp;
}
while (!(IFG2 & UTXIFG1));          // Ende des letzten Bytes abwarten

MfG
Falk

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ThoBi wrote:
> Hallo,
>
> ich möchte über SPI beim MSP mehrere Bytes an einen Funkchip senden.
> Die 7 Bytes sollten aber ohne Pause
> an den Funkchip gesendet werden.

Warum? Der Trick bei SPI ist doch, dass es egal ist, wann die Bytes 
rausgehn, solange CS aktiv ist. Welcher Funk-Chip ist das genau? Steht 
das wirklich im Datenblatt, dass keine Pause sein darf? Eine kleine 
Pause bekommst du immer, der MSP muss erst das nächste Byte aus dem 
Buffer in das Schieberegister laden.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es entsteht keine Pause durch das Laden aus dem Array.
Die seriellen Schnittstellen (in Hardware) sind i.A. zweistufig 
aufgebaut.
Die erste Stufe ist das Schieberegister (SR), dass die Bits auf die 
Leitung "klingelt". Die zweite Stufe ist ein Datenregister (DR), welches 
das zu sendende Byte (kann auch ein Word sein, oder bei SPI sogar krumme 
Bitanzahlen). Auf dieses Datenregister hat der Programmierer Zugriff.
Also:
Wenn du das erste Byte ins DR schreibst, wird dieses sofort von der HW 
ins SR kopiert und die HW beginnt dieses Byte seriell zu senden. Dein DR 
ist in diesem Augenblick wieder leer (HW Flag) und kann mit dem zweiten 
Byte beschrieben werden. Da jetzt aber das SR noch mit dem ersten Byte 
"beschäftigt" ist, wird das DR als voll gemeldet (HW Flag).
Wenn das SR das letzte Bit vom ersten Byte gesendet hat wird das zweite 
Byte aus dem DR ins SR kopiert und sofort das DR wieder als leer 
gemeldet (HW Flag).
Der MSP hat also genau so viel Zeit um das nächste Byte ins DR zu 
schreiben, wie das SR benötigt, um ein Byte zu senden.

Gruß

Autor: ThoBi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ supachris

Sorry, das Problem leigt eher beim Empfänger, weil es sich bei den Daten 
schon um die Nutzdaten ahndelt, welche gesendet werden sollen.
Wenn jetzt zwischen den einzelnen Bytes eine Pause ist, wird diese vom 
Empfängermodul als Nullen interpretiert und mein gesmates Protokoll 
kommt durcheinander.
Ich denke ich werde die einzlenen Bytes über einen normalen Port 
rausschieben, wenn das einfacher geht

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn jetzt zwischen den einzelnen Bytes eine Pause ist, wird diese vom
> Empfängermodul als Nullen interpretiert und mein gesmates Protokoll
> kommt durcheinander.
Dann taugt dein Empfänger nix, weil SPI ein synchrones Protokoll ist und 
der Master durch den Takt bestimmt, wann der Slave die Signale zu 
übernehmen hat. Wenn die Pause tatsächlich als Nullen interpretiert 
wird, dann würd ich mal gucken, was die CLK-Leitungen in den Pausen 
macht.

Ralf

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, versteh ich nicht so recht. Wenn es eine SPI Schnittstelle ist, 
werden doch die Daten nur übernommen, wenn eine Taktflanke kommt. Kommt 
keine Taktflanke (z.b. zwischen 2 Bytes) dann wird auch nix übernommen. 
Wie sieht denn dein Aufbau aus? Eventuell klappt es, wenn der MSP430 
schnell genug aus dem TXBUF0 nachlädt, da könnte es sein, dass der Takt 
quasi durchgehend anliegt und die Daten direkt hintereinander kommen. 
Aber da müsste man mal ins Datenblatt schauen.
Was verstehst du unter Nutzdaten? Willst du die SPI als asynchrone 
Schnittstelle missbrauchen? Ich denke, das geht erst ma zu einem 
FunkChip?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gast (Gast)

>Es entsteht keine Pause durch das Laden aus dem Array.

Das weisst du doch gar nicht.

>Die seriellen Schnittstellen (in Hardware) sind i.A. zweistufig
>aufgebaut.

Nicht notwendigerweise. Beim AVR ist SPI nur in Empfangsrichtung doppelt 
gepuffert. Beim MSP430 weiss ich es nicht.

@ ThoBi (Gast)

>Sorry, das Problem leigt eher beim Empfänger, weil es sich bei den Daten
>schon um die Nutzdaten ahndelt, welche gesendet werden sollen.
>Wenn jetzt zwischen den einzelnen Bytes eine Pause ist, wird diese vom
>Empfängermodul als Nullen interpretiert und mein gesmates Protokoll
>kommt durcheinander.

Dann ist das aber kein wirkliches SPI. Das klingt eher nach UART oder 
ähnlichem.

>Ich denke ich werde die einzlenen Bytes über einen normalen Port
>rausschieben, wenn das einfacher geht

Dort ist das Problem eher noch grösser, denn du hast dann definitiv 
KEINEN FIFO.

MFG
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk
>Nicht notwendigerweise. Beim AVR ist SPI nur in Empfangsrichtung doppelt
>gepuffert. Beim MSP430 weiss ich es nicht.

Habe vor ca. 3 Jahren mal eine SPI auf einem MSP430 programmiert und 
denke mich an die zweistufige HW zu erinnern (bin jetzt aber zu faul im 
DS nachzusehen).

Gruß

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der MSP430 hat eine gepufferte USART, ist schon richtig. Aber das 
Datenbyte aus dem Puffer in das Schieberegister zu transferieren, dauert 
ja auch mindestens einen Takt.

Autor: Christian R. (supachris)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, ich hab gerade mal den LogicAnalyser an einen MSP430F1611 gehängt 
und 2 Bytes über die SPI ausgegeben:
while (!(IFG2 & UTXIFG1));
TXBUF1 = 0xAA;
while (!(IFG2 & UTXIFG1));
TXBUF1 = 0x55;

Was rauskommt -> Siehe Bild.

SPI Clock ist 3MHz, kleinster Teiler bei 6MHz Quarz-Takt. MCLK ist 6MHz.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian R. (supachris)

>Der MSP430 hat eine gepufferte USART, ist schon richtig. Aber das
>Datenbyte aus dem Puffer in das Schieberegister zu transferieren, dauert
>ja auch mindestens einen Takt.

Jain, aber das kann lückenlos mit dem letzten Bit des vorhergehenden 
Bytes passieren. Parallel Hardware kann das ;-)

MFg
Falk

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... könnte das, aber wie meine Messung zeigt, kann der MSP430 das eben 
nicht. Macht ja auch nix, wenn man die SPI als solche verwendet. Wenn 
man natürlich irgendwelche "Sauerein" damit vorhat, dann nicht.

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.