www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430: Hardware-SPI - Clock bei Receive?


Autor: david (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void spi_init()
{
    int i;
    WDTCTL = WDTPW + WDTHOLD; 
    do
    {
        IFG1 &=~OFIFG; 
        for (i = 0xff; i>0; i--);
    } 
    while ((IFG1 & OFIFG) != 0);
    BCSCTL1 &= ~XT2OFF; 
    BCSCTL2 |= (SELM1 + SELS); 
  
    UCTL0 &=~ SWRST; //starting USART1_init 
    UCTL0 |= CHAR+SYNC+MM; 
    UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3???,?SMCLK??
    UBR00 = 0x08; //1MHz @ 8MHz
    UBR10 = 0x00;
    UMCTL0 = 0x00;
    ME1 |= USPIE0; 
    P3SEL |= 0x0F; //active P3.0 & P3.3 for SPI
    P3DIR |= 0x0A; //P3.1(SIMO)& P3.3(UCLK)
    IE1 &=~ URXIE0; 
    UCTL0 &=~ SWRST;
}

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

Bin über jeden Tipp dankbar!
Gruß David

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst auch senden, um empfangen zu können.

Nur so kann die SPI-Logik wissen, wieviele Taktimpulse sie erzeugen 
soll.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void spi_init()
{
    UCTL0 &=~ SWRST; //starting USART1_init 
    UCTL0 |= CHAR+SYNC+MM; 
    UTCTL0 = STC + SSEL1 + SSEL0 + CKPL;// + CKPH; //3???,?SMCLK??
    UBR00 = 0x08; //1MHz @ 8MHz
    UBR10 = 0x00;
    UMCTL0 = 0x00;
    ME1 |= USPIE0;
    IE1 &=~ URXIE0; 
    UCTL0 &=~ SWRST;
}

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

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

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

    //CS setzen
    return value;                     
}

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anmerkung am Rande:

Du solltest damit aufhören, Funktionsnamen in VERSALIEN zu schreiben. 
Per Konvention sind das nur und ausschließlich Präprozessor-Macros 
(#defines).

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Per Genfer Konvention?

Blablablabla. Ich schreib des so wie ich will :)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt so Dinge wie C-Standards.
Und Jörg Wunsch, der Dir sicherlich eins auf die Finger gibt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.