Forum: Mikrocontroller und Digitale Elektronik PIC24FJ256DA206 (Sparkfun IOIO): Probleme beim Empfang SPI (Master)


von PIC24F-Anfänger (Gast)


Lesenswert?

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 !

von PIC24F-Anfänger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.