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
Man sendet irgendeinen Dummy (ist egal was). Während des Sendens erzeugt der Master einen Takt und liest gleichzeitig auf MISO ein.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.