Hilfe bei SPI Schnittstelle

Gast #220386
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
Gast #220389
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
Gast #220390
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren