Hallo Forum!
Ich habe hier einen PIC18F2440, dessen SPI ich als Slave MIT "SS Control
enable" konfiguriert habe. Aber er setzt sein SSPIF (Synchronous Serial
Port Interrupt Flag), wenn ein Byte über die SPI übertragen wurde,
OBWOHL sein SS-Pin andauernd high ist.
Weder die Initialisierung durch manuelles Setzen der Register, noch die
Funktion OpenSPI() liefern ein gewünschtes Ergebnis.
Hat jemand einen Tipp für mich? Bin langsam am verzweifeln...
Danke schon mal,
Grüße,
Michael
1 | #include <stdio.h>
|
2 | #include <stdlib.h>
|
3 | #include <p18cxxx.h>
|
4 | #include <spi.h>
|
5 | #include "defs.h"
|
6 |
|
7 | #pragma config OSC = HS //high speed osc
|
8 | #pragma config PWRT = ON //powerup timer
|
9 | #pragma config WDT = OFF //Watchdog aus
|
10 | #pragma config LVP = OFF //LV-ICSP
|
11 |
|
12 | #define TAKT 14745600UL
|
13 |
|
14 |
|
15 | void init_mcu(void)
|
16 | {
|
17 | LATA |= (1<<5);
|
18 | TRISA = ~(1<<4);
|
19 | LATB=0;
|
20 | TRISB = ~((1<<3)|(1<<4)|(1<<5));
|
21 |
|
22 | /* SPI enable, slave , rising clk */
|
23 | // SSPSTAT |= (1<<CKE);
|
24 | // SSPCON1 = (1<<SSPEN)|(1<<SSPM2);
|
25 | OpenSPI(SLV_SSON, MODE_00, SMPEND);
|
26 |
|
27 | /* interrupt */
|
28 | /* glob en - SPI en */
|
29 | PIE1 = (1<<SSPIE);
|
30 | INTCON = (1<<GIE)|(1<<PEIE);
|
31 | }
|
32 |
|
33 |
|
34 | #pragma code
|
35 | void main()
|
36 | {
|
37 | unsigned char i=0;
|
38 | init_mcu();
|
39 |
|
40 | while(1)
|
41 | {
|
42 | LATB = (1<<i);
|
43 | i++;
|
44 | if(i>2) i=0;
|
45 | Delay10KTCYx(1000);
|
46 | }
|
47 | }
|
48 |
|
49 | void high_isr(void);
|
50 | #pragma code high_vector=0x08
|
51 | void interrupt_at_high_vector(void) { _asm goto high_isr _endasm }
|
52 | #pragma code
|
53 | #pragma interrupt high_isr
|
54 | void high_isr (void)
|
55 | {
|
56 | if(PIR1 & (1<<SSPIF))
|
57 | { /* SPI transaction done */
|
58 | LATB ^= (1<<4);
|
59 | PIR1 &= ~(1<<SSPIF);
|
60 | }
|
61 | }
|