Hi,
ich versuche gerade, den SPI2 beim dsPIC33EV64GM002 zu verwenden, dabei
soll nur gesendet werden, die Empfangsrichtung interessiert nicht.
Leider klappt das ganze schon im Simulator nicht, die Statusabfrage in
SPI1STAT (Bit SPIRBF) liefert mir immer ein "nicht fertig" zurück.
Im Moment habe ich das Folgende:
Mapping der Pins:
1
RPOR0bits.RP20R=8; // use RP20 / pin 12 for SDO2
2
TRISAbits.TRISA4=0; // set as output -> this can be removed (possibly)
3
4
RPOR0bits.RP35R=9; // use RP35 / pin 7 for SCLK2
5
TRISBbits.TRISB3=0; // set as output -> this can be removed (possibly)
Initialisierung von SPI2:
1
IFS2bits.SPI2IF = 0;
2
IEC2bits.SPI2IE = 0;
3
IPC8bits.SPI2IP = 0;
4
SPI2CON1 = 0x0337; //0b0000 0011 0011 1110
5
SPI2CON2 = 0x0000; //0b0000 0000 0000 0000
6
SPI2STAT = 0x8000; // 0b1000 0000 0000 0000
Die Teiler für den Clock passen sicher vorne und hinten noch nicht, für
den Simulator sollte das aber erst mal egal sein?
Ein einzelnes Byte senden:
1
SPI1BUF=data;
Warten, dass der Sendevorgang abgeschlossen wird:
1
while (!SPI1STATbits.SPIRBF);
An genau der Stelle hängt mein Code, die while-Schleife kommt nie
zurück.
Irgend eine Idee, was hier schief laufen könnte?
Danke!
Stampede schrieb:> Hast du die Clock Leitung bei dem Remapping als Ein- UND Ausgang> gesetzt? Gern gemachter Fehler, sonst empfängt man nix!
Ich will ja nur Senden, Empangen interessiert nicht...
@Herman: danke für den Code, damit konnte ich bei mir zumindest schon
mal feststellen, dass ich SPI2 initialisiert habe, dann aber auf SPI1BUF
(=SPI1) rumgesendet habe - was nicht wirklich gut ist :-D
Aber selbst mit den Änderungen und deinem Code komme ich nie über's
Svolvaer schrieb:> Aber selbst mit den Änderungen und deinem Code komme ich nie über's> while (!SPI2STATbits.SRMPT);
Mach das mal mit Debugger und richtiger Hardware, Simulation ist nicht
gut, nur in der Hardware zählt ;-)
Poste mal dein Code, inkl aller Initialisierungen, Remapps, Clock etc...
Mein geposteter COde geht 100%, kannst du ja selber testet, an pins:
RPOR5bits.RP48R = RPO_SDO2;
RPOR9bits.RP118R = RPO_SCK2;
sollte was rauskommen, wenn du in SPI2BUF=1; was reinschreibst.
Gruß
Hermann
@Hermann: Ich verwende exakt deinen Code, mit Ausnahme der Pins, an der
SDO2 und SCLK2 liegen, da ich RP48 und RP118 nicht habe. Die
Initialisierung sollte aber trozdem passen!?
1
RPOR0bits.RP20R=8; // use RP20 / pin 12 for SDO2
2
TRISAbits.TRISA4=0; // set as output -> this can be removed (possibly)
3
4
RPOR0bits.RP35R=9; // use RP35 / pin 7 for SCLK2
5
TRISBbits.TRISB3=0; // set as output -> this can be removed (possibly)
Ja was ist jetzt? was geht nicht, bleib hier hängen?:
while (!SPI2STATbits.SRMPT);
Kannst du in der Hardware debuggen?
RPOR0bits.RP20R=8; // use RP20 / pin 12 for SDO2
RPOR0bits.RP35R=9; // use RP35 / pin 7 for SCLK2
meins ist auch gleich:
RPO_SDO2 = 0b001000,
RPO_SCK2 = 0b001001,
PS:
ANSELA=0;
ANSELB=0;
;-)
Hermann U. schrieb:> Ja was ist jetzt? was geht nicht, bleib hier hängen?:> while (!SPI2STATbits.SRMPT);
Ja, er kommt aus der while-Schleife nicht raus.
Was mich in deinem Code ein wenig überrascht, ist das da:
1
SPI2BUF=1;
2
SPI2BUF=2;
3
SPI2BUF=3;
4
SPI2BUF=4;
5
SPI2BUF=5;
6
SPI2BUF=6;
7
SPI2BUF=7;
8
SPI2BUF=8;
Ich hätte nirgends gesehen, dass der dsPIC einen Sende-FIFO hat, wie
lange geht das denn mit dem einfach Reinschreiben gut?
Svolvaer schrieb:> Ja, er kommt aus der while-Schleife nicht raus.Hermann U. schrieb:> Kannst du in der Hardware debuggen?
Du sollst doch in der Hardware testen, Simulation geht hier nicht.
Svolvaer schrieb:> Was mich in deinem Code ein wenig überrascht, ist das da:
Das Teil hat ein 8x 8Bit TX und RX FIFO, kannst 8 Byte ohne Überprüfung
senden, wenn du mehr brauchst gibst SPIBEC Register:
while (SPI2STATbits.SPIBEC > 0-7)
> SPI2CON2bits.SPIBEN = 1; //Enhanced Buffer is enabled
und wird hier eingeschaltet, wenn du das nicht brauchst kannst du es
abschalten.
im Normal Buffer Mode, wird dann so gesendet:
Marc V. schrieb:> meins ist länger.
träum weiter.
Svolvaer schrieb:> Ich hätte nirgends gesehen, dass der dsPIC einen Sende-FIFO hat, wie
auf der Seite 222:
http://ww1.microchip.com/downloads/en/DeviceDoc/70005144e.pdf
teste doch mal in der Hardware, dein Programm sollte laufen.
Falls du später doch die Daten über SPI (SDI) empfangen willst, solltest
du die PINs auf Digital umschalten, beliebter Fehler:
Zb.
ANSELA=0;
ANSELB=0;
The ANSELx register has a default value of 0xFFFF.
Therefore, all pins that share analog functions are
analog (not digital) by default.