Wie am besten Integer über SPI-Übertragen??

Gast #1368467
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!!!!
#1368489
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
#1368490
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
}
Gast #1368767
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!!!
#1368947
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren