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


von noips (Gast)


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?
1
void *pData;
2
int Data;
3
pData = &Data;
4
unsigned char caData[4];
5
memcpy(&caData[0], pData, sizeof(int));
6
  
7
// und hier caData als String übertragen

Danke für eure Tipps!!!!

von martin (Gast)


Lesenswert?

Den Integer direkt übertragen?!

von Stefan K. (syliosha)


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

von Jean P. (fubu1000)


Lesenswert?

Hi, ich gehe mal davon aus das int 16-Bit breit ist.


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

Für das c-File
1
      
2
void SPI_send(unsigned short wert)
3
{
4
  CONVERTW val;
5
  val.w=wert;
6
7
  PORTB &= ~(1 << PB2);    //ChipSelect
8
  SPDR = val.b[1];
9
  while(!(SPSR & (1<<SPIF)));
10
11
  SPDR = val.b[0];
12
  while(!(SPSR & (1<<SPIF)));
13
  PORTB |= (1 << PB2);     //ChipSelect
14
}

von Stefan K. (syliosha)


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.

von noips (Gast)


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!!!

von Peter D. (peda)


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

von noips (Gast)


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.

von Peter D. (peda)


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

von noips (Gast)


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!!

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.