Hallo zusammen,
mein Problem:
ich nutze das MSSP-Modul eines 16f874 um ein EEPROM zu lesen.
Nun habe ich einige I2C-Routinen ausprobiert und musste leider 
feststellen, dass schon das senden der Start-Condition Probleme 
bereitet.
1  | void i2c_start() {
 | 
2  |   SSPIF = 0;
  | 
3  |   SEN=1; //Bus-Übernahme anweisen
  | 
4  |   while(SSPIF==0); // while(SEN) <== Alternativ
  | 
5  | }
  | 
Wenn ich while(SSPIF==0) benutze bleibt der PIC an der stelle hängen.
Wenn ich while(SEN) verwende, dann geht es weiter, aber es gibt keine 
Start-Bedingung.
In einer Init-Methode stelle ich die Interrupts ein
1  | GIE = 1; // enable interrupts
  | 
2  | PEIE = 1; // enable peripheral interrupts => braucht man wohl nicht, aber habe ich mal mit reingenommen
  | 
3  | SSPIE = 1; // enable interrupt for SSPmodule
  | 
4  | SSPIF = 0; // CLR SSP-Interrupt-Flag
  | 
Die I2C-init-Methode sieht so aus
1  | void i2c_init() {
 | 
2  |   TRISC3=1;           // set SCL and SDA pins as inputs
  | 
3  |   TRISC4=1;
  | 
4  | 
  | 
5  |   SSPADD = 40;//SSPADD_VAL; // Siehe header-datei 100 KHz
  | 
6  | 
  | 
7  |   // SSPCON1 - egisters
  | 
8  |   SSPCON = 0x28; // Enables Serial Port Mode / I2C Master Mode
  | 
9  | 
  | 
10  |   // SSPCON2 - Registers
  | 
11  |   SSPCON2 = 0x00;
  | 
12  | 
  | 
13  |   // SSPSTAT REGISTERS
  | 
14  |   SSPSTAT = 0x80; //   SlewRate Control disabled
  | 
15  | 
  | 
16  |   SSPIF = 0; // CLR SSP-Interrupt-Flag
  | 
17  | }
  | 
und folgendes sende ich in der Main-Methode
1  | i2c_start();
  | 
2  | i2c_write( 0xa0 );
  | 
3  | i2c_stop();
  | 
das ist ja erstmal nicht viel. Ich wollte auch nur testen ob das EEPROM 
ein ACK sendet. Leider tuts das nicht. Es gibt nur ein NACK - Ich denke 
weil die Start-Bedingung fehlt.
Warum sendet der PIC die Start-Bedingung nicht. Bzw. warum wird das 
SSPIF - Flag nicht gesetzt?
Hier mal ein Bild von der Datenübertragung. 
http://img128.imageshack.us/my.php?image=i2cnostartnoackok9.png
(oder siehe Anhang)
Danke schonmal, Tobias