Forum: Mikrocontroller und Digitale Elektronik I2C mit PIC16F1939


von Martin S. (drunkenmunky)


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?

von bingo (Gast)


Lesenswert?

kann es sein, dass sich die Adressen von EEPROM und TC74 überschneiden?

von Martin S. (drunkenmunky)


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?

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.