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?