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.