Hallo PIC24F Experten, ich versuche auf einen PIC24FJ256DA206 die SPI Schnittstelle zu benutzen. Die IOIO-Firmware benutzte ich derzeit nicht, sondern nehme das Board als eigeneständiges Evalboard her (ohne USB, ohne Anbindung an Android, selbstgeschriebenes Programm, mit PICkit3 geflasht, MP LAB IDE 8.73). Nun zu meinem Problem mit der SPI Schnittstelle: Ich kann SPI Daten senden, das angeschlossene Gerät antwortet korrekt (sehe ich auf dem LA), aber in SPI2BUF steht immer nur 0x0000. Ich sende immer 1 Byte, warte und lese 1 Byte, keine Verwendung des Interrupts für SPI. Die Initialisierung der SPI-Schnittstelle sieht wie folgt aus: __builtin_write_OSCCONL(OSCCON & 0xBF); // Unlock PPS #if 0 // Sind TRIS für PPS nötig ? TRISGbits.TRISG6 = 1; // RG6 (SCK) as input pin TRISGbits.TRISG7 = 1; // RG7 (SDO) as input pin TRISGbits.TRISG8 = 1; // RG8 (SDI) as input pin #endif // Inputs RPINR18bits.U1RXR = 4; // U1RX = RP4 RPINR22bits.SDI2R = 19; // SDI2 = RP19 RPINR0bits.INT1R = 13; // Assign RB2/RPI13 to INT1 (input) // Outputs RPOR1bits.RP3R = 3; // RP3 = U1TX RPOR10bits.RP21R = 11; // RP21 = SCK2 RPOR13bits.RP26R = 10; // RP26 = SDO2 __builtin_write_OSCCONL(OSCCON | 0x40); // Lock PPS Initialisierung der SPI-Schnittstelle: SPI2CON1 = 0x027B; // Fcy Primary prescaler 1:1, secondary prescaler 2:1, CKP=1, CKE=0, SMP=1 SPI2CON2 = 0x0000; SPI2STAT = 0x8000; // Enable the module Senden / Empfang von Daten: (die Bedienung der CS Leitung manuell über einen IO-Pin habe ich der Übersichtlichkeit weggelassen, SS der SPI verwende ich nicht !) UINT8 byte_to_send; UINT8 byte_received; SPI2BUF = byte_to_send; while ((SPI2STATbits.SPITBF == 1) || (SPI2STATbits.SPIRBF == 0)); byte_received = SPI2BUF; (Code stammt mehr oder weniger aus dem Wifi-Beispiel vom 14.07.2011 von Microchip) Ich hoffe, ich habe jetzt alles nötige extrahiert. Sind diese TRIS für Pins nötig, die per PPS gemappt werden ? Ich finde Code im Internet, die die Pins auf Input schalten, anderer Code macht dies nicht... Diese Analog-Umschaltungen scheinen bei diesem Prozessor auch nicht nötig zu sein, kann das jemand bestätigen ? Oder mit welchen Registern müsste ich dies wie durchführen ? Ich hatte zuerst schon SPI1 probiert, aber dort war das Ergebnis dasselbe. Senden geht immer, aber Empfangen liefert nur den Wert 0x0000. Auch die Verwendung eines anderen (gemappten) Pins führte zu dem gleichen Ergebnis. Ist es schon richtig, dass ich aufgrund des obigen Mappings die SPI (Eingabe-) Daten in Pin 6 (RG8 = RP19) einfüttern muß ? Auf Pin 6 liegen folgende Funktionen: C2IND/RP19/GD14/CN10/RG8 GDxx scheint für den Grafik-Controller zu sein, C2IND für den Comparator. Ich verwende beide nicht, können mir die irgendwie in die Quere kommen ? Ich habe auch mal versucht, die Daten von SDO via SDI zurückzusenden, oder feste Pegel (GND, 3,3V) auf SDI zu legen, aber es bleibt bei 0x0000. Wie wenn SDI gar nicht mit dem SPI verbunden wäre... Ich habe auch schon mal die Erratas des Chips durchforstet, wurde aber auch hier nicht fündig. Gibt es irgendwelche Probleme z.B. wenn man SPI1 und UART1 zugleich benutzt ? Wobei ich ja mittlerweile SPI2 benutze, kann es dann eigentlich auch nicht sein... Hat noch jemand einen Tipp, was ich noch übersehen habe könnte ? Schon mal vielen Dank im voraus !
Folgendes hat gefehlt: ANSB = 0; ANSC = 0; ANSD = 0; ANSF = 0; ANSG = 0; Jetzt rennts !
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.