dsPIC33 SPI-Schnittstelle

Gast #2986944
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
(Firma: Promaxx.net) #2987676
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...
Gast #2988095
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?
Gast #2988126
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!
Gast #2988175
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren