Forum: Mikrocontroller und Digitale Elektronik MSP430 Daten über SPI senden


von moritz (Gast)


Lesenswert?

Hallo,
ich habe Beispiele gefunden in denen einzelne Bytes über SPI gesendet
und empfangen werden.
Kann ich auch eine Gruppe von z.B. drei Bytes unmittelbar nacheinander 
senden?
Besten Dank im voraus für eine Antwort.
Moritz

von Ziff (Gast)


Lesenswert?

Ja, sicher. Einfach warten, bis das worherige draussen ist. Entweder mit 
pollen oder mit dem interrupt.

von Christian R. (supachris)


Lesenswert?

Z.B. 3 Bytes an den AD DAC schicken:
1
unsigned char SetExtDAC(unsigned char num, unsigned int data)
2
{
3
  
4
  //AD5663 Command Byte zusammen bauen:
5
  
6
  if(num == 0)Byte2 = AD5663_Command3 + AD5663_Address0;
7
  if(num == 1)Byte2 = AD5663_Command3 + AD5663_Address1;
8
  if(num > 1)return STATUS_ERROR;
9
  
10
  
11
  Byte1 = ((data >> 8) & 0xFF);      //High-Byte
12
  Byte0 = (data & 0xFF);          //LOw-Byte
13
  
14
  
15
  SPI1WaitForComplete();          //Senden bereit?
16
  
17
  ResetDevCSA;              //Chip-Select
18
  TXBUF1 = Byte2;              //Command-Byte absetzen
19
  SPI1WaitForComplete();
20
  asm("nop");
21
  asm("nop");
22
      
23
  TXBUF1 = Byte1;              //Highbyte senden
24
  SPI1WaitForComplete();
25
  asm("nop");
26
  asm("nop");
27
  
28
  TXBUF1 = Byte0;
29
  SPI1WaitForComplete();
30
  asm("nop");
31
  asm("nop");
32
  SetDevCSA;
33
34
  return STATUS_SUCCESS;
35
}
36
37
void SPI1WaitForComplete(void)
38
{
39
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
40
  do
41
  {
42
    IFG2 &= ~URXIFG1;
43
  }
44
  while (URXIFG1 & IFG2); 
45
}

von moritz (Gast)


Lesenswert?

Hallo,
vielen Dank für die Antwort.
Gibt es Erfahrungen ob man die Datenbytes auf diese Weise
unmittelbar aneinander hängen kann,
das nach dem letzten Bit vom ersten DatenByte
unmittelbar mit dem nächsten Clock-Signal
das erste Bit des zweiten DatenBytes gesendet wird?

Moritz

von Christian R. (supachris)


Lesenswert?

Naja, das geht nur bei hinreichend langsamem Takt, denn du musst ja erst 
schauen, ob das letzte Byte raus ist, und dann erst die Daten in den TX 
Buffer kopieren, das dauert ja ein paar Prozessortakte. Direkt 
nacheinander und ohne Jitter wird´s mit dem MSP430 nicht gehn....ist ja 
auch fast nirgends notwendig.

von moritz (Gast)


Lesenswert?

Hallo Christian,
vielen Dank für deine ausführliche Antwort.
Nachdem ich das Datenblatt von meinem EEPROM AT25010A gelesen hatte,
glaubte ich, die Bytes müssten unmittelbar aufeinander folgen.
Aber vielleicht ist das gar nicht nötig.
Ausprobieren kann ich es leider erst später,
da ich im Moment programmiere ohne Hardware zum testen.

Moritz

von Christian R. (supachris)


Lesenswert?

Ist eigentlich bei SPI in den seltensten Fällen erforderlich. Da ja eh 
nur zur SCLK Flanke was passiert.

von Lars K. (variolars)


Lesenswert?

zum einen is es nich nötig, zum anderen hat der msp aber den netten 
TX-Interrupt, der ausgelöst wird, wenn der TX-Buffer leer ist. Du kannst 
also das nächste Byte laden, während das alte noch übertragen wird

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.