MSP430F2003 SPI mit DMA

Gast #2542817
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
Persönliche Seite #2542838
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).
Gast #2542913
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
Gast #2546968
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
Gast #2546991
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.

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