Forum: Mikrocontroller und Digitale Elektronik I2C Slave Code für MSSP2 Modul funktioniert nicht


von Lukas D. (lukas_d)


Lesenswert?

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?.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.