Forum: Mikrocontroller und Digitale Elektronik Hilfe bei SPI Schnittstelle


von Mattias (Gast)


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

von Alex (Gast)


Lesenswert?

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

von Mattias (Gast)


Lesenswert?

Ach so, super.

Danke
Mattias

von Mattias (Gast)


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

von Mattias (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.