www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie am besten Integer über SPI-Übertragen??


Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

könnte mir jemand einen Tipp geben, wie man am besten einen Integer mit 
über SPI übertägt. Ich habe eine Möglichkeit gesehen (siehe Code). Dabei 
wird der Integer in einen String kopiert und der String übertragen. Ist 
es okay so? Gibt es eine bessere Möglichkeit?
void *pData;
int Data;
pData = &Data;
unsigned char caData[4];
memcpy(&caData[0], pData, sizeof(int));
  
// und hier caData als String übertragen

Danke für eure Tipps!!!!

Autor: martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Integer direkt übertragen?!

Autor: Stefan Kunz (syliosha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1. Strings werden hier nicht verwendet. unsigned char[] ungleich 
"String"

2. Solltest  du sagen für welchen µC

3. RTFM, da steht drin wie man Daten über den SPI überträgt

4. C-Buch kaufen

den Code den du dir rausgesucht hast, teilt eine wohl einen long (int 
kann 16 oder 32 bit lang sein, sollte man defenetiv beachten) in 4 chars 
auf, da wohl der SPI nur einen Buffer für 8 Bit bereit hält.

MfG
Stefan

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, ich gehe mal davon aus das int 16-Bit breit ist.


Für die Header
 
typedef union conver2_ {
  unsigned int w;
  unsigned char b[2];
} CONVERTW;

Für das c-File
      
void SPI_send(unsigned short wert)
{
  CONVERTW val;
  val.w=wert;

  PORTB &= ~(1 << PB2);    //ChipSelect
  SPDR = val.b[1];
  while(!(SPSR & (1<<SPIF)));

  SPDR = val.b[0];
  while(!(SPSR & (1<<SPIF)));
  PORTB |= (1 << PB2);     //ChipSelect
}

Autor: Stefan Kunz (syliosha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jean

Solange er nicht sagt, was für einen µC er verwendet, ist der C-Code nur 
schön anzuschauen. Wenn man sich das char-Array anguckt, besteht schon 
der berechtigte Verdacht, dass der int 32bit beträgt.

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!!!


1. Ok, danke für die Berichtigung mit dem Begriff "String", habe nicht 
gewusst, welcher Begriff hier richtig ist. Etwa Character-Array?

2. Der Code ist für einen MSP430, um genau zu sein, MSP430F5418.

3. Das RTFM (wenn the f.... manual gemeint ist) habe ich gelesen. Ich 
habe mir das Kapitel über das Comunication Interface im SPI-Mode ganz 
durchgelesen. Das mit Transmit- und Receive-Buffer, die zugehörigen 
Interrupt-Flags, SOMI-, SIMO-, CLK- und CS-Leitungen verstehe ich ja 
alles. Ich fragte mich nur, wie man einen Integer mit Software geschickt 
in 8-Bit-Stücke zerlegt, um die dann einzeln zu übertragen.

4. C-Buch habe ich. In einem C-Buch steht zwar welche Datentypen es gibt 
und vieles mehr aber solche speziellen Sachen (ich meine jetzt die 
Übertragung per SPI von Datentypen die nicht 8-Bit breit sind) stehen 
wohl nicht in jedem C-Buch.

Den Beispiel-Code habe ich selbst geschrieben, weil die Funktion, aus 
der ich die Idee habe viel umfangreicher ist (mit Header, Checksumme und 
sontigem). Die Länge des Char-Arrays habe ich nur selbst dimensioniert, 
ohne zu wissen aus wievielen Bits der Integer hier speziell besteht.

Der Vorschlang mit Union gefällt mir viel besser als der mit Pointer und 
memcpy. Danke!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:
> 2. Der Code ist für einen MSP430, um genau zu sein, MSP430F5418.

D.h. also um 2 MSP miteinander zu verbinden.
Dann ist es egal, wie Du die Daten splittest, Du mußt es nur auf beiden 
Seiten gleich tun.

Ich hoffe mal der MSP hat kein ungepuffertes SPI, wie leider die AVRs.
Ansonsten gibts richtig Ärger.

Ich würd ja lieber I2C nehmen, das kostet nur 2 Leitungen (SPI 
mindestens 4).
Und Handshake ist automatisch mit drin.


Peter

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich würd ja lieber I2C nehmen, das kostet nur 2 Leitungen (SPI
>mindestens 4).

Es soll SPI sein, weil in Zukunft noch AD-Wandler dazu kommen und alles 
auf einem Bus hängen soll und die schnelleren AD-Wandler haben als 
serielle Schnittstelle nur SPI, die mit I2C sind zu langsam.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noips schrieb:
> Es soll SPI sein, weil in Zukunft noch AD-Wandler dazu kommen

Dann solltest Du das Datenformat (Byte-Order, Bit-Order, SPI-Mode) 
benutzen, welches der ADC hat, damit Du nicht alle Routinen doppelt 
schreiben mußt.

Auch ist es für die Fehlersuche einfacher, wenn man auf einem Bus nicht 
verschiedene Formate hat.


Peter

Autor: noips (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Dann solltest Du das Datenformat (Byte-Order, Bit-Order, SPI-Mode)
>benutzen, welches der ADC hat, damit Du nicht alle Routinen >doppeltschreiben 
mußt.

Stimmt, das habe ich noch nicht bedacht. Danke!!

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.