Ich habe einen PIC24FJ128GB204. Ich habe ihn folgender Maßen
initialsiert:
1 | void i2c_init(){
|
2 | //I2C2CONL
|
3 | I2C2BRG = 0x26; // 100kHz festgelegt => mit der Formel aus dem Familiy Reference S.19 => Delay vernachlässigt
|
4 | I2C2CONL = 0x0;
|
5 | I2C2CONL.I2CEN = 0; //Disable I2C für die Konfiguration
|
6 | I2C2CONL.I2CSIDL = 0; //Soll weiterlaufen, wenn die CPU im IDLE Mode ist
|
7 | I2C2CONL.SCLREL = 0; //Nur im SLAVE Modus
|
8 | I2C2CONL.STRICT = 0; //Gespeicherte Adressen werden ausgeschalten?
|
9 | I2C2CONL.A10M = 0; //7 Bit Adressen
|
10 | I2C2CONL.DISSLW = 1; //Slew Rate für 100kHz
|
11 | I2C2CONL.SMEN = 0; //SMBus aus
|
12 | I2C2CONL.GCEN = 0; //Nur im Slave Modus
|
13 | I2C2CONL.STREN = 0; //Nur im Slave Modus
|
14 | I2C2CONL.ACKEN = 0; //Nur benötigt, wenn man den RECEIVE Modus verwendet
|
15 | I2C2CONL.RCEN = 0; //RECEIVE Modus nicht benötigt
|
16 | //PEN, RSEN, SEN nacher setzen für die Übertragung
|
17 | //I2C2CONH
|
18 | I2C2CONH = 0x0;
|
19 | I2C2CONH.PCIE = 0; //Keine Interrupts für die Stop Condtion benötigt
|
20 | I2C2CONH.SCIE = 0; //Keine Interrupts für die Start Condtion benötigt
|
21 | I2C2CONH.BOEN = 0; //Nur im Slave Modus
|
22 | I2C2CONH.SDAHT = 1; //Möglichst lange HOLD Time für SDA
|
23 | I2C2CONH.SBCDE = 0; //Keine Interrupts für Kollisionen im SLAVE Modus
|
24 | I2C2CONH.AHEN = 0; //Nur Slave Modus
|
25 | I2C2CONH.DHEN = 0; //Nur Slave Modus
|
26 | //I2C2STAT nur zum Lesen
|
27 | //I2C2MSK nicht benötigt
|
28 | I2C2MSK = 0x0;
|
29 | I2C2CONL.I2CEN = 0; //Modul ist an, SFR dürfen nicht mehr geändert werden
|
30 | void peripheral_clock_init(){
|
31 | CLKDIV.DOZE2 = 0;
|
32 | CLKDIV.DOZE1 = 1; // MCLK / 4
|
33 | CLKDIV.DOZE0 = 0;
|
34 | CLKDIV.DOZEN = 1;
|
35 | }
|
36 | }
|
Meine Fragen sind:
Muss ich die I2C Pins als Output oder Input definieren? Beim PIC16 und
PIC18 wurde explizit darauf hingewiesen. Jetzt bin ich mir völlig
unsicher?
Und kann jemand meine Berechnung vom I2C2BRG kontrollieren, weil ich mir
da ebenfalls nicht sicher bin.
Ich habe wie oben im Bild beschrieben gerechnet
Fscl = 100kHz
PGD , wegelassen, weil es ungefähr 100ns beträgt
Fcy = 32Mhz, habe aber einen Peripheren Clock eingestellt mit 8Mhz,
deshalb mit 32Mhz gerechnet? Stimmt die Rechnung