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