Forum: Mikrocontroller und Digitale Elektronik dsPIC33 SPI-Schnittstelle


von Armin (Gast)


Lesenswert?

Hallo zusammen,

ich habe mal eine ganz blöde Frage. Ich möchte mit einem 
dspic33fj32mc204 eine SPI Kommunikation aufbauen. Nun kann ich im 
Datenblatt aber einfach nicht finden, auf welchen Pins eigentlich die 
Datenleitungen SDO und SDI liegen. Kann mir bitte jemand sagen wo es 
steht, bzw. was ich wissen muss um es herauszulesen?

Viele Grüße

von Johannes E. (cpt_nemo)


Lesenswert?

Die meisten IO-Pins haben beim DSPIC33 keine feste Pin-Zuordnung, 
sondern können auf beliebige Pins gemappt werden, s. Kapitel "Peripheral 
Pin Select" im Datenblatt.

von Rainer U. (r-u)


Lesenswert?

Vielleicht heißen sie nur anders, sehr üblich sind MOSI und MISO. Wenn 
Dein anzusteuernder Chip als Slave arbeitet, dann ist SDO(slave) = MISO 
und SDI(slave) = MOSI. Wenn Master dann andersrum.

von Armin (Gast)


Lesenswert?

Danke für die schnellen Antworten! Ich denke damit werde ich weiter 
kommen. :)

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Hallo,

die wirst Du wohl mappen müssen. Es gibt Pins, die fest belegt sind. 
Dann gibt es Pins, auf die Funktionen gemappt werden können (Matrix) und 
dann kann es auch noch 5V-tolerante Pins geben.

Ist tricky, aber geht, wenn man es mal verstanden hat.
Da müssen diese Zuordnungen entlocked und nachher wieder gelocked 
werden...

von Armin (Gast)


Lesenswert?

Nochmal danke für die Antworten. Ich habe mir das Thema Mapping jetzt in 
Ruhe angesehen und mal Aufgeschrieben, was ich alles tun muss. Ich 
schreibe es mal hier in Detail auf. Wäre super, wenn Ihr mir bestätigen 
könntet, dass ich es richtig mache um die Fehlersuche zu verkürzen. Was 
ihr wissen müsst: mein SCK liegt auf Pin 44 (RB8 bzw. RP8) und SDO auf 
Pin 1 (RB9 bzw RP9).

1. I/O definieren
1
TRISBbits.TRISB8 = 0;   //Pin 44 auf Ausgang
2
TRISBbits.TRISB9 = 0;   //Pin 1 Ausgang

2. Entsperren
1
OSCCON &= 0xFF00;
2
OSCCON |= 0x0046;      //Unlock-Sequenz laut Datenblatt
3
OSCCON |= 0x0057;      //Unlock-Sequenz laut Datenblatt
4
OSCCONbits.IOLOCK = 0; //Entsperren

3. Pin-Funktionen definieren
1
RPOR4 = 0x0708;   //RP8 = SCK, RP9 = SDO

4. Sperren
1
OSCCON &= 0xFF46;      //Unlock-Sequenz laut Datenblatt
2
OSCCON |= 0x0057;      //Unlock-Sequenz laut Datenblatt
3
OSCCONbits.IOLOCK = 1; //Sperren


Alternativ zu Schritt 2 und 4 kann man mit dem C30 Compiler laut 
Datenblatt auch das hier schreiben.
1
__builtin_write_OSCCONL(value)
2
__builtin_write_OSCCONH(value)
 Aber was wäre hier mein value?

von Bronco (Gast)


Lesenswert?

Das geht so:

Unlock:
1
uint8 oscconl_u8;      
2
oscconl_u8 = OSCCONL;    
3
oscconl_u8 &= ~0x40;
4
__builtin_write_OSCCONL( oscconl_u8 );

Lock:
1
uint8 oscconl_u8;      
2
oscconl_u8 = OSCCONL;    
3
oscconl_u8 |= 0x40;
4
__builtin_write_OSCCONL( oscconl_u8 );

PS: Was ist mit SDI? Mußt Du auch noch zuordnen!

von Armin (Gast)


Lesenswert?

Hallo Bronco,

SDI habe ich weggelassen, weil ich nur ein LCD ansteuern möchte. Dafür 
genügt doch SDO, oder?

Danke für den Code. Wäre meine Variante denn auch richtig oder ist da 
ein Fehler drin?

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.