I2C mit PIC16F1939

OP #2094449
Lesenswert?

Hi,

Ich hab hier das Demoboard PICDEM 2 PLUS (old version) von Microchip. 
Als Prozessor verwende ich ein PIC16F1939. Auf dem Board befindet sich 
ein EEPROM und ein Temperatursensor TC74, die beide über I2C an den PIC 
(RC3 und RC4) angeschlossen sind.

Jetzt versuche ich verzweifelt, die Temperatur über I2C ausgelesen zu 
bekommen.

Also die Initialisierung sieht folgendermaßen aus:
1
PORTC = 0x00;
2
LATC = 0x00;
3
TRISC = 0b00011000;         // RC3 und RC4 Input for I2C
4

5
SSPSTAT = ( BIT7 * 1 )      // Slew rate control disabled for standard speed mode (100 kHz and 1 MHz)
6
  | ( BIT6 * 0 );           // Disable SM bus™ specific inputs
7

8
SSPADD = 79;                // Baud Rate Clock Divider bits: bei 32 MHz Fosc -> 100kHz I2C Takt 
9

10
SSPCON1 = ( BIT7 * 0 )      // Write Collision Detect bit cleared
11
      | ( BIT6 * 0 )        // Receive Overflow Indicator bit cleared
12
      | ( BIT5 * 0 )        // Disables serial port and configures these pins as I/O port pins
13
      | ( BIT0 * 0b1000 );  // I2C Master mode, clock = FOSC / (4 * (SSPADD+1))
14

15
/* Enables the serial port and configures the SDA and SCL pins as the source of the serial port pins */
16
SSPEN = 1;
17

18
SSPCON2 = 0;
19
SSPCON3 = 0;

und dann für eine Kommunikation:
1
/* Bus übernehmen */
2
/* Start setzen */
3
SEN = 1;
4
          
5
while( SSPIF != 1 ) continue;
6
SSPIF = 0;
7
  
8
/* Adresse auf den Bus legen */
9
SSPBUF = 0b10011011;    // Adresse + 1 für lesen

Aber nach dem Befehl SEN = 1 wird das Flag BCLIF gesetzt, was bedeutet, 
dass eine Buskollision vorlag.
Jetzt hab ich den PIC mal auf ein Steckbrett getan und an SDA und SCL 
nur mal Pull-up Widerstände geschalten. Da läuft es durch ohne 
Buskollision.

Was meint ihr, liegt ein Defekt an der Hardware vor oder habe ich ein 
Fehler in der Software?
OP #2095517
Lesenswert?

Hi,
danke für die Antwort.

Die Adressen sind definitiv unterschiedlich.

Das Programm läuft auch gar nicht bis dahin, wo die Adresse in den 
Puffer übergeben wird, sondern bleibt bei

while( SSPIF != 1 ) continue;

stehen. Mit dem Setzen von SEN müsste nach der Startsequenz das Flag 
SSPIF automatisch gesetzt werden. Tut es aber nicht wegen der 
Buskollision.

Noch irgendwelche anderen Ideen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren