Forum: Mikrocontroller und Digitale Elektronik MSP430F2003 SPI mit DMA


von Johannes (Gast)


Lesenswert?

Hallo,

ich fange gerade an mit MSP430F2003 zu üben.

Ich möchte per SPI mehrere Byte herausschicken.
Aber irgendwie kommt nicht das heraus, was ich will.

Das ist meine Einstellung vom SPI:
1
//SPI config
2
  USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master
3
  USICTL1 |= USICKPH + USIIE;       //Rising Edge, Counter interrupt, flag remains set
4
  USICKCTL |= USISSEL_2;            //SMCLK
5
  USICTL0 &= ~USISWRST;             // USI released for operation
6
  USICNT = 8;                       // 8 bit transfer

Und dann fängt es an mit den Fragezeichen.
DMACTL0: Was muss ich für DMA2TSELx einstellen?
Und auch bei den anderen DMA-Register bin ich mir nicht sicher. D.h. 
eigentlich suche ich ein schönes Beispiel aller:
1
void send(int data[], unsigned size) {
2
//DMA config
3
4
while (size!=0)
5
{
6
// Bytes verschicken
7
spi_send(data[--size]);
8
}
9
}
10
//
11
unsigned spi_send(unsigned byte){
12
// SPI send
13
}

Kann mir da jemand helfen? Es ist einwenig kompliziert, da das SPI und 
JTAG am gleichen Port hängen und somit das Debuggen auch etwas schwierig 
ist.

Schönen Gruß,
Johannes

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Johannes schrieb:
> Es ist einwenig kompliziert, da das SPI und
> JTAG am gleichen Port hängen und somit das Debuggen auch etwas schwierig
> ist.

Was hält Dich davon ab, statt des resourcenblockierenden 4-Draht-JTAG 
das beim 'F2003 völlig verlustfreie Spy-Bi-Wire einzusetzen? Falls Du 
keinen entsprechenden Adapter hast, das Launchpad ist auch hierfür 
bestens geeignet, auch für den Einsatz mit bereits in der Schaltung 
befindlichen µCs.

Und mit 4.30 USD ist es obendrein spottbillig. Das schließt den Versand 
aus den USA mit ein, und die Lieferung erfolgt extrem schnell (just 
durchexerziert, am Freitag bestellt und am Montag geliefert bekommen - 
Absender in Fort Worth, TX, Empfänger in Berlin, DE).

von Tobias K. (kurzschluss81)


Lesenswert?

Der MSP430F2003 hat keinen DMA

von Johannes (Gast)


Lesenswert?

Da hast du wohl recht. Ich war durch den Family User's Guide verwirrt 
worden. Dann halt ohne DMA. Sehr schade.

Gibt es eine schöne Interrupt-Lösung um mehrere Bytes zu verschicken?


Zwecks dem Spi-Bi-Wire: Hört sich gut an. Werde ich mir einmal 
bestellen. Bis dahin muss ich wohl noch ohne auskommen.

Schönen Gruß,
Johannes

von Sigges (Gast)


Lesenswert?

hallo Johannes,
auf der Webseite von TI findest Du alle Beispiele die Du brauchst.
Viel Spass
Gruß
Sigges

von Johannes (Gast)


Lesenswert?

Hallo Sigges,

vielen Dank für den Tipp.
Ich habe dort schon gesucht, aber noch nicht genau das gefunden, was ich 
suche: Eine Interrupt-Lösung, mit der mehrere Bytes hintereinander 
geschickt werden können.
Ich dachte an so etwas:
Sende 1. Byte;
Sleep until IRQ
Sende 2. Byte;
Sleep until IRQ

usw.

Schönen Gruß,
Johannes

von Tobi (Gast)


Lesenswert?

1
void senden()
2
{
3
  UCA0TXBUF = string[0];
4
  IE2 |= UCA0TXIE;
5
  __bis_SR_register(LPM3_bits + GIE);
6
7
  UCA0TXBUF = string[1];
8
  IE2 |= UCA0TXIE;
9
  __bis_SR_register(LPM3_bits + GIE);
10
  [...]
11
}
12
13
#pragma vector=USCIAB0TX_VECTOR
14
__interrupt void USCI0TX_ISR(void)
15
{
16
  IE2 &= ~UCA0TXIE;
17
  __bic_SR_register_on_exit(LPM3_bits);
18
}

Oder direkt sowas:
1
void senden(char *data, int len)
2
{
3
  int i;
4
  
5
  for(i = 0; i < len; i++)
6
  {
7
    if(i >= sizeof(buffer))
8
    {
9
      break;
10
    }
11
    buffer[i] = data[i];
12
  }
13
  IE2 |= UCA0TXIE;
14
}
15
16
#pragma vector=USCIAB0TX_VECTOR
17
__interrupt void USCI0TX_ISR(void)
18
{
19
  static int i = 0;
20
  
21
  UCA0TXBUF = buffer[i++];
22
23
  if(i == (sizeof(buffer)- 1))
24
  {
25
    IE2 &= ~UCA0TXIE;
26
    i = 0;
27
  }
28
}

Zumindest bei einem MSP430F22x2 oder MSP430F22x4 sollte das so gehen. 
Aber natürlich ohne Gewähr.

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.