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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.