Hallo, ich möchte einen PIC18F26Q43 als PSI slave im Vollduplex betreiben. Dieser hat das neuere SPI Modul mit TX und RX FIFO. Leider empfängt der Slave keine Daten. Wahrscheinlich konfiguriere ich das Modul falsch. Ich nutze "Start of SS", um den Transfer vorzubereiten und "end of SS", um den Transfer abzuschließen. Dieser Teil funktioniert, d. h. die Interrupt Routine wird zumindest angesprungen. Ich sehe am Oszi, dass Clock und Daten übertragen werden. Die RX-Abfrage in der Interrupt Routine wird aber nicht angesprungen. Entweder empfange ich CLK nicht richtig oder SDI. Dass die Leitungen am richtigen Pin liegen, habe ich mehrmals überprüft. Ich benutze nicht die Standard-Pins, sondern verbiege diese auf RB2-RB4 mit dem PPS. Hat jemand einen SPI Slave Beispiel für das neue Modul? Hier die Konfiguration:
1 | void spiInit() { |
2 | spiTransferComplete=0; |
3 | |
4 | // Chip not ready
|
5 | CR=1; |
6 | |
7 | // clear EN
|
8 | SPI1CON0bits.EN=0; |
9 | // Set PPS
|
10 | SPI1SSPPS=0b00000110; // SS RA6 > Chip select input |
11 | SPI1SCKPPS=0b00001010; // SCK > RB2 |
12 | SPI1SDIPPS=0b00001011; // SDI > RB3 |
13 | RB4PPS=0x32; // SDO > RB4 |
14 | TRISB2=1; |
15 | TRISB3=1; |
16 | |
17 | SPI1CON0=0b00000000; // EN=0, LSBF=0, MST=0, BMODE=0 |
18 | SPI1CON1=0b00000100; // SMP=0, CKE=0, CKP=0, SSP=1, SDI=0, SDO=0 |
19 | SPI1CON2=0b00000011; // SSET=0, TXR=1, RXR=1 |
20 | |
21 | // Interrupts
|
22 | SPI1INTEbits.SOSIE=1; |
23 | SPI1INTEbits.EOSIE=1; |
24 | |
25 | // SPI1INTEbits.RXOIE=1; // overflow test
|
26 | |
27 | PIE3bits.SPI1IE=1; |
28 | PIE3bits.SPI1RXIE=1; |
29 | PIE3bits.SPI1TXIE=1; |
30 | |
31 | // enable EN
|
32 | SPI1CON0bits.EN=1; |
33 | }
|
und hier die Interrupt-Routine:
1 | void spiInterruptHandler() { |
2 | char test; |
3 | // Start SS
|
4 | if (SPI1INTEbits.SPI1SOSIE==1 && SPI1INTFbits.SPI1SOSIF==1) { |
5 | switchSpiBuffer(); // prepare sending |
6 | |
7 | spiSendCsr=1; |
8 | spiRecvCsr=0; |
9 | |
10 | spiRecv.pck.U1len=0; |
11 | spiRecv.pck.U2len=0; |
12 | spiRecv.pck.U3len=0; |
13 | spiRecv.pck.U4len=0; |
14 | |
15 | SPI1TXB=spiSend->cBuf[spiSendCsr]; // preload first byte |
16 | CR=0; // ready to send |
17 | SPI1INTFbits.SPI1SOSIF=0; |
18 | }
|
19 | |
20 | // end of SS
|
21 | if (SPI1INTEbits.SPI1EOSIE==1 && SPI1INTFbits.SPI1EOSIF==1) { |
22 | CR=1; |
23 | if (spiTransferComplete) |
24 | spiTransferComplete(&(spiRecv.pck)); |
25 | SPI1INTFbits.SPI1EOSIF=0; |
26 | }
|
27 | if (SPI1INTFbits.RXOIF) { |
28 | test=1; |
29 | }
|
30 | // byte received
|
31 | if (PIR3bits.SPI1RXIF==1) { |
32 | spiRecv.cBuf[spiRecvCsr++]=SPI1RXB; |
33 | }
|
34 | |
35 | // byte sent
|
36 | if (PIR3bits.SPI1TXIF==1) { |
37 | SPI1TXB=spiSend->cBuf[spiSendCsr++]; |
38 | }
|
39 | }
|