Forum: Mikrocontroller und Digitale Elektronik PIC18F4455 Problem mit I2C


von Edi _. (edi_2k)


Lesenswert?

Hallo Leute.

Ich versuch den I2C-Modus des MSSP-Moduls (PIC18F4455) zum Laufen zu 
kriegen; Mit Hilfe von sprut.de und den AppNotes auf der Microchipseite.
Ich verwende eine 20MHz Quarz.

Folgender Code ist bis jetzt entstanden:

#pragma config BOR = OFF
#pragma config FOSC = HS
#pragma config CPUDIV = OSC1_PLL2
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF

void i2c_w(char dat);
char i2c_r(void);
void take_i2c(void);
void release_i2c(void);

// Hauptprogramm
void main(void)
{
...
        // PortPins des PortB sind Digitale I/O

  set_bit(ADCON1,3);
  set_bit(ADCON1,2);
  set_bit(ADCON1,1);
  clear_bit(ADCON1,0);        //PortA.0 analoger Eingang

  // I2C-Bus initialisieren
  set_bit(TRISB, 0);    // SDA
  set_bit(TRISB, 1);    // SCK

  INTCON2bits.NOT_RBPU = 0;

  SSPSTAT = 0x00;
  SSPSTATbits.SMP = 1;
  SSPADD = 49;           // 100kHz bei 20MHz
  SSPCON1 = 0x28;
  SSPCON2 = 0x00;
...
}

// I2C Byte schreiben
void i2c_w(char dat)
{
  // Daten schicken
  SSPBUF = dat;
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
}

// I2C Byte empfangen
char i2c_r(void)
{
  char dat = 0;

  // Daten empfangen
  SSPCON2bits.RCEN = 1;
  while(!(PIR1bits.SSPIF == 1));    // Warten bis empfangen
  dat = SSPBUF;
  PIR1bits.SSPIF = 0;      // Interruptflag löschen

  return(dat);
}

// I2C Bus übernehmen
void take_i2c(void)
{
  // Bus übernehmen
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
  SSPCON2bits.SEN = 1;  // Bus übernehmen
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;  // Interruptflag löschen
}

// I2C Bus freigeben
void release_i2c(void)
{
  // Bus freigeben
  PIR1bits.SSPIF = 0;    // Interruptflag löschen
  SSPCON2bits.PEN = 1;  // Bus übernehmen
  while(!(PIR1bits.SSPIF == 1));    // Warten bis gesendet
  PIR1bits.SSPIF = 0;  // Interruptflag löschen
}

Dieser Code hat in etwas abgewandelter Form (anderer Compiler: 
Sourceboost) einwandfrei funktioniert. Wenn ich nun diese Routinen 
benutze, bleibt der PIC in Warteschleife von "i2c_r()" hängen.

Hat jemand eine Idee?

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.