Guten Morgen,
ich habe derzeit ein Problem mit der Ansteuerung eines MSSP2 Modules in
einem PIC18F44K22 als Slave. Das der Fehler vom Master kommt, ebenfalls
ein PIC18F44K22 der das MSSP1 Modul verwendet, konnte ich bereits
ausschließen da die Signale bei einen PIC18F14K22 der beinahe den
gleichen Code verwendet funktioniert. Man muss sich lediglich die zweien
wegdenken abgesehen von dLED2. Folgender Code + Initialisierung findet
Anwendung:
1 | /*I2C BUS*/
|
2 | unsigned char vCLEAR = 0x00;
|
3 | unsigned char vREADDATA[2];;
|
4 | unsigned char vWRITEDATA[6];
|
5 | unsigned char vREADCOUNT = 0;
|
6 | unsigned char vWRITECOUNT = 0;
|
7 |
|
8 | SSP2IE = 0x01;
|
9 | SSP2STAT = 0x00; //Slew rate disabled
|
10 | SSP2CON1 = 0x3E; //SSPEN = 1, I2C SLAVE mode, Start/Stop Interrupts Enabled
|
11 | SSP2ADD = 0x54; //Slave Adresse
|
12 |
|
13 | if(SSP2IF) //I2C MSSP Interrupt
|
14 | {
|
15 | SSP2IF = 0;
|
16 | if(SSP2STATbits.S2 == 1 && RW2 == 0 && DA2 == 0 && BF2 == 1) //STATE 1: Master write, last byte was an adress
|
17 | {
|
18 | dLED2 = 1;
|
19 | vCLEAR = SSP2BUF;
|
20 | CKP2 = 1;
|
21 | if(SSPOV2)
|
22 | {
|
23 | vCLEAR = SSP2BUF;
|
24 | SSPOV2 = 0;
|
25 | }
|
26 | vWRITECOUNT = 0;
|
27 | }
|
28 |
|
29 | if(SSP2STATbits.S2 == 1 && RW2 == 0 && DA2 == 1 && BF2 == 1) //STATE 2: Master write, last byte was data
|
30 | {
|
31 | dLED3 = 1;
|
32 | vWRITEDATA[vWRITECOUNT] = SSP2BUF;
|
33 | CKP2 = 1;
|
34 | if(SSPOV2)
|
35 | {
|
36 | SSPOV2 = 0;
|
37 | }
|
38 | vCLEAR = SSP2BUF;
|
39 | vWRITECOUNT++;
|
40 | }
|
41 |
|
42 | if(SSP2STATbits.S2 == 1 && RW2 == 1 && DA2 == 0) //STATE 3: Master read, last byte was an adress
|
43 | {
|
44 | dLED4 = 1;
|
45 | CKP2 = 0;
|
46 | WCOL2 = 0;
|
47 | SSP2BUF = vREADDATA[0];
|
48 | if(WCOL2)
|
49 | {
|
50 | WCOL2 = 0;
|
51 | SSP2BUF = vREADDATA[0];
|
52 | }
|
53 | vREADDATA[0] = 0;
|
54 | CKP2 = 1;
|
55 | }
|
56 |
|
57 | if(SSP2STATbits.S2 == 1 && RW2 == 1 && DA2 == 1 && BF2 == 0) //STATE 4: Master read, last byte was data
|
58 | {
|
59 | dLED5 = 1;
|
60 | CKP2 = 0;
|
61 | WCOL2 = 0;
|
62 | SSP2BUF = vREADDATA[1];
|
63 | vREADDATA[1] = 0;
|
64 | CKP2 = 1;
|
65 | }
|
66 |
|
67 | if(SSP2STATbits.S2 == 1 && DA2 == 1 && BF2 == 0 && CKP2 == 1) //STATE 5: Master NACK
|
68 | {
|
69 | dLED6 = 1;
|
70 | CKP2 = 1;
|
71 | vCLEAR = SSP2BUF;
|
72 | }
|
73 | }
|
Dieser Code für das MSSP2 Modul im PIC18F44K22 funktioniert nicht. Habe
das mit den LEDs 2-6 auf dem Slave überprüft. Wenn ich nun aber im
Schritt 1 RW2 und DA2 durch RW und DA ersetze dann funktioniert Schritt
1, 3, 4 und 5 . Schritt 2 funktionierte jedoch bisher niemals. Ich
Programmiere mit dem Tool MPLAB IDE 2.05 und dem C8 Compiler. Hat jemand
vielleicht einen Lösungsansatz für mein aktuelles Problem?.