Liebes Forum,
Ich bin gerade dabei eine I2C-Verbindung zu erstellen. Ich verwende den
PIC24FJ128GB204 (=Master) und einen digitalen Temperatur-Sensor
(=Slave).
Für den Anfang wollte ich einfach mal nur etwas an den Slave senden, um
auf ein ACK abzuwarten.
Aber bereits hier habe ich ein Problem.
Sobald ich die Condition starten will (I2C1CONLbits.SEN = 1) tut sich
leider nichts. Ich habe mein Projekt debuggt und habe festgestellt, dass
sobald ich das Bit SEN setzen will, es nicht gesetzt wird. Jedoch wird
stattdessen im Status-Register angezeigt, dass ein "Master Bus
Collision" detektiert worden ist (Bit 10 im I2CXSTAT: I2C Status
Register).
Ein möglicher Fehler könnte laut meinem Recherche-Ergebnis eine falsche
Baud-Rate sein.
Zum Berechnen dieser habe ich folgende Annahmen gemacht:
FSCL = 400kHz
PGDx = 104ns
FCY = 16MHz
Daraus ergibt sich nach der Formel (siehe Anhang) eine Baudrate von: 17
(in Hex: 11)
Weiß jemand von euch, was ich falsch mache?
Danke für eure Hilfe!
Ein Ausschnitt meines Codes:
1 | #define FOSC (32000000ULL)
|
2 | #define FCY (FOSC/2)
|
3 |
|
4 | int main(void)
|
5 | {
|
6 |
|
7 |
|
8 | TRISBbits.TRISB8 = 0; //SCL1 is output
|
9 | TRISBbits.TRISB9 = 0; // SDA1 is output
|
10 |
|
11 | I2C1CONLbits.I2CEN = 0; //disable I2C1 module
|
12 |
|
13 | I2C1BRG = 0x0011; //set baudrate
|
14 |
|
15 | I2C1CONLbits.DISSLW = 0; // Disable slew rate control
|
16 | IFS1bits.MI2C1IF = 0; // Clear Interrupt
|
17 |
|
18 | I2C1CONLbits.I2CEN = 1; // Enable I2C Mode
|
19 |
|
20 | I2C1CONLbits.SEN = 1; //start condition
|
21 |
|
22 |
|
23 | return (EXIT_SUCCESS);
|
24 | }
|