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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.