MSP430: Hardware-SPI - Clock bei Receive?

Gast #613341
Lesenswert?
• ▲
▼
Hallihallo,

ich habe den MSP430F1611 und möchte das Hardware-SPI vom UART0 benutzen 
um Daten zu empfangen. Der IC ADC121S625 sendet, sobald er eine Clock 
hat und per CS selektiert wird. Der MSP ist der Master. Nun mein 
Problem, der MSP gibt einfach keine Clock aus, wenn ich etwas empfangen 
will.
Hat jemand eine Idee, wo das Problem sein könnte?

Hier mein Source:

Die Initialisierung vom SPI:
1
void spi_init()
2
{
3
    int i;
4
    WDTCTL = WDTPW + WDTHOLD; 
5
    do
6
    {
7
        IFG1 &=~OFIFG; 
8
        for (i = 0xff; i>0; i--);
9
    } 
10
    while ((IFG1 & OFIFG) != 0);
11
    BCSCTL1 &= ~XT2OFF; 
12
    BCSCTL2 |= (SELM1 + SELS); 
13
  
14
    UCTL0 &=~ SWRST; //starting USART1_init 
15
    UCTL0 |= CHAR+SYNC+MM; 
16
    UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3???,?SMCLK??
17
    UBR00 = 0x08; //1MHz @ 8MHz
18
    UBR10 = 0x00;
19
    UMCTL0 = 0x00;
20
    ME1 |= USPIE0; 
21
    P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
22
    P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
23
    IE1 &=~ URXIE0; 
24
    UCTL0 &=~ SWRST;
25
}

Meine Empfangsroutine:
1
void spi_receive_byte()
2
{
3
    P2OUT &= ~0x01;             //cs-low->enable
4
    received_byte = RXBUF0;     //daten aus dem uartbuffer holen und in var. data schreiben  
5
    P2OUT |= 0x01;              //cs-high->disable
6
}

Bin über jeden Tipp dankbar!
Gruß David
Gast #613562
Lesenswert?
• ▲
▼
Erstmal was anderes:

Rein vom logischen Programmieren her, sollte in SPI_INIT nur die 
Initialisierung der SPI Schnittstelle drin stehen! Lieber eine 2. und 3. 
Funktion anlegen mit z.B. PORT_INIT() und CLK_INIT(). Oder gleich alles 
direkt in die MAIN-Funktion reinzimmern. Nur soviel:
1
void spi_init()
2
{
3
    UCTL0 &=~ SWRST; //starting USART1_init 
4
    UCTL0 |= CHAR+SYNC+MM; 
5
    UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3???,?SMCLK??
6
    UBR00 = 0x08; //1MHz @ 8MHz
7
    UBR10 = 0x00;
8
    UMCTL0 = 0x00;
9
    ME1 |= USPIE0;
10
    IE1 &=~ URXIE0; 
11
    UCTL0 &=~ SWRST;
12
}

Und so klappts mit dem Nachbarn:
1
unsigned char SPI_RW_8BIT(unsigned char data)
2
{  
3
  while((IFG2 & UTXIFG1) == 0);    //TX Buffer leer?
4
  TXBUF1 = data;        //Sende Daten
5
  
6
  while((IFG2 & URXIFG1) == 0);    //Byte im RX Buffer?
7
  return RXBUF1;        //Buffer auslesen
8
}

Um Daten von SPI auszulesen muss man immer davor senden. Hier ein 
Beispiel:
1
unsigned char ADC_READ(void)
2
{
3
    unsigned char value;
4
 
5
    //CS setzen
6

7
    SPI_RW_8BIT(BEFEHL);               //Befehl für ADC senden, um Messergebnis zu bekommen und Rückgabewert verwerfen
8
    value = SPI_RW_8BIT(0x00);         //0x00 senden um Clk zu erzeugen und Messwert auslesen
9

10
    //CS setzen
11
    return value;                     
12
}

Schau dir mal genau das SPI-Timing im Datenblatt von deinen AD-Wandler 
an.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.