PIC24 Verwendung eines bestimmten Pins als GPIO

Gast #5488803
Lesenswert?
• ▲
▼
Hallo Leute,

ich verwende auf meinen PIC24 das SPI1-Modul und brauche davon nur SDI, 
SDO und SCK. Auf den Pin !SSI möchte ich das CS für mein SPI-Slave 
legen. Leider habe ich das Problem, dass trotz Initialisierung als 
Output des !SSI-Pins, dieser keinen Output gibt. Im Datenblatt habe ich 
gelesen, dass höher priorisierte Funktionen immer Vorang haben. Sprich 
mein SPI1 Modul verwendet den CS Pin eigentlich als !SSI. Ich habe in 
der Konfig die Verwendung des !SSI ausgeschaltet aber erhalte dennoch 
keine ordentliche Output-Funktion. Könnt ihr mir sagen, wo eventuell das 
Problem liegt? Auf dem Oszi sehe ich den Output und den Clock vom SPI 
einwandfrei. Mein Chip-Select fehlt mir leider.
1
//CS
2
__builtin_write_OSCCONL(OSCCON & 0xbf);   
3
LATCbits.LATC6 = 0;
4
ODCCbits.ODCC6 = 0;
5
TRISCbits.TRISC6 = 0;
6
__builtin_write_OSCCONL(OSCCON | 0x40);
7

8
IFS0bits.SPI1IF = 0; 
9
IEC0bits.SPI1IE = 0;
10
SPI1CON1bits.DISSCK = 0; 
11
SPI1CON1bits.DISSDO = 0; 
12
SPI1CON1bits.MODE16 = 1; 
13
SPI1CON1bits.MSTEN = 1; 
14
SPI1CON1bits.SSEN = 0;
15
SPI1CON1bits.SMP = 0; 
16
SPI1CON1bits.CKE = 0; 
17
SPI1CON1bits.CKP = 0; 
18
SPI1STATbits.SPIEN = 1; 
19
IFS0bits.SPI1IF = 0; 
20
IEC0bits.SPI1IE = 1;
21

22
PORTCbits.RC6 = 1; //Slave Select 
23

24
int main(void) {
25

26
    PORTCbits.RC6 = 0; //Slave Select
27
    DELAY_105uS;
28

29
    WRSPI1(befehl); //SPI Transmit
30

31
    DELAY_105uS;
32

33
    PORTCbits.RC6 = 1; 
34
}

Viele Grüße und Danke!
Gast #5489415
Lesenswert?
• ▲
▼
Hallo Frank,

danke für den Tipp. Jetzt kann ich den Port einzeln Ein- und 
Ausschalten. Dennoch bleibt der Port nicht eingeschaltet, sobald ich das 
SPI Write verwende. Ich bekomme einen kurzen Einschaltimpuls und danach 
ist RB0 wieder aus. Dabei soll er die gesamte Zeit der Übertragung 
eingeschaltet bleiben.
1
int WRSPI1(int wert){
2
    
3
    SPI1BUF = wert;
4
    while( !SPI1STATbits.SPIRBF);
5
    return SPI1BUF;
6
    
7
}
Gast #5489418
Lesenswert?
• ▲
▼
Tony schrieb:
> Hallo Frank,
>
> danke für den Tipp. Jetzt kann ich den Port einzeln Ein- und
> Ausschalten. Dennoch bleibt der Port nicht eingeschaltet, sobald ich das
> SPI Write verwende. Ich bekomme einen kurzen Einschaltimpuls und danach
> ist RB0 wieder aus. Dabei soll er die gesamte Zeit der Übertragung
> eingeschaltet bleiben.
> int WRSPI1(int wert){
>
>     SPI1BUF = wert;
>     while( !SPI1STATbits.SPIRBF);
>     return SPI1BUF;
>
> }

Ich habe in meinem ersten Beitrag im Beispielcode RC6 verwendet. 
Eigentlich verwende ich aber RB0. Mit RC6 wollte ich nur sicherstellen, 
dass der Fehler nicht mitwandert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.