Hallo!
Ich benutze bei einem MSP430F1611 UART1 als SPI. Geht soweit auch. Jetzt
will ich den DMA-Controller einsetzen, aber der legt nicht los. Am Logic
Analyzer sehe ich, dass nichts am SPI passiert.
1 | // UART1 als SPI
|
2 | #include <io430.h>
|
3 | #include "spi.h"
|
4 |
|
5 | #define PIN_MOSI 0x02
|
6 | #define PIN_MISO 0x04
|
7 | #define PIN_SCK 0x08
|
8 |
|
9 | char spi_sendrecv(char c)
|
10 | {
|
11 | while(!(IFG2&UTXIFG1));
|
12 | U1TXBUF=c;
|
13 | while(!(IFG2&URXIFG1));
|
14 | return U1RXBUF;
|
15 | }
|
16 |
|
17 | void spi_senddma(char* p, unsigned short n)
|
18 | {
|
19 | DMACTL0=DMA0TSEL_10; // UTXIFG1 bit
|
20 | DMA0SA=(unsigned short)p;
|
21 | DMA0DA=(unsigned short)&U1TXBUF;
|
22 | DMA0SZ=n;
|
23 | DMA0CTL=DMADT_1+DMASRCINCR_3+DMADSTINCR_0+DMASBDB+DMAEN;
|
24 | // Block Transfer+Src incr+Dst const+Src/Dst Bytes+DMA Enable
|
25 | }
|
26 |
|
27 | void spi_init(void)
|
28 | {
|
29 | P5DIR|=PIN_MOSI|PIN_SCK; // Direction
|
30 | P5DIR&=~PIN_MISO;
|
31 | P5OUT&=~(PIN_MOSI|PIN_MISO|PIN_SCK); // Output Register
|
32 | P5SEL|=PIN_MOSI|PIN_MISO|PIN_SCK; // Special Func Select
|
33 | ME2|=USPIE1; // Module Enable
|
34 | U1CTL=SWRST|MM|SYNC|CHAR;
|
35 | U1TCTL=SSEL1|SSEL0|STC|CKPL;
|
36 | U1BR0=2; // Bitrate
|
37 | U1BR1=0;
|
38 | U1MCTL=0; // Modulation
|
39 | U1CTL&=~SWRST; // Reset zurücknehmen
|
40 | }
|
Wie gesagt, spi_init() und spi_sendrecv() funktionieren soweit.
Wo ist mein Problem?
fchk