www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei SPI Schnittstelle


Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe an meinem Controller (LPC2132) einen DAC und ein ADC. Beide
sind mit dem SPI Bus verbunden.
Der Controller ist immer Master. Der DAC funktioniert ganz einfach.
Daten einfach in das Datenregister, SCLK ratter los und alles is ok.
Vom ADC brauche ich aber einen Wert. Nun kann ich dem Controller
irgendwie nicht beibringen, dass er die Taktleitung steuern soll. Wenn
ich alles richtig verstanden habe, generiert immer der Master den Takt.
Wenn ich das Datenregister lese, habe ich erwartet, dass der Controller
den Takt vorgiebt und die Daten über MISO ins Datenregister kommen.
Wie startet man denn prinzipiell ein Datentransfer beim Lesen.

Mattias

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man sendet irgendeinen Dummy (ist egal was). Während des Sendens erzeugt
der Master einen Takt und liest gleichzeitig auf MISO ein.

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so, super.

Danke
Mattias

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe doch noch ein Problem.
Das mit dem Dummy schreiben habe ich nun so gemacht und er erzeugt auch
den erforderlichen Takt. Der Slave gibt auch Daten auf der Miso Leitung
raus, nur komme ich da nicht ran. Das Lesen vom DAC habe ich so
gemacht:

short Read_ADC(unsigned char adc, unsigned char channel)
{
 short a,b = 0;
 SSPCR0 = 0x4F;        // config ssp
 IO0CLR = SPI_ADC_A0;  // A0 auf low
 IO0CLR = SPI_CS0;  // pin auf low, conversion starten

 SSPDR   = 0xAAAA;  // Wert an adc geben, damit 16 clk erzeugt
 while((SSPSR & (1<<4))){};  // wait for transfer to be completed
 a = SSPDR;        // Wert lesen

 IO0SET = SPI_CS0;      // pin auf high, fertig
 return a;
}

Den Wert a gebe ich direkt nach der Funktion an MOSI wieder raus. Dabei
bassiert immer folgendes:
Beim ersten Mal nach Reset kommt an MOSI das richtige raus. Beim
zweiten Mal nur 0. Beim 3. Mal das, was MISO das 2. Mal gesendet hat
usw. Das geht 8 mal, dann kommt nur noch 0.
Irgendwie sieht es so aus, als würden die Datentypen nicht stimmen. Ich
habe aber von char bis long alles probiert. Wenn ich 16 bit in SSPDR
schreibe, funktioniert auch alles wunderbar. Nur Lesen kann ich nicht.


Was kann das denn blos sein.
Mattias

Autor: Mattias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habs jetzt.
man muss das Datenregister, bevor man den Dummy schreibt, lesen, damit
das fifo wirklich leer ist.


a = SSPDR;         // lesen, damit fifo leer
SSPDR   = 0xAAAA;  // Wert an adc geben, damit 16 clk erzeugt
while((SSPSR & (1<<4))){};  // wait for transfer to be completed
a = SSPDR;        // Wert lesen


Verstehen tu ich das nicht, aber so geht es jedenfalls.

Mattias

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.