Forum: Mikrocontroller und Digitale Elektronik I2C PIC24 Input oder Output?


von Verzweifelt an PIC (Gast)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

Verzweifelt an PIC schrieb im Beitrag #5307904:
> 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?

Mal ein Scope (oder LA) an SCL anschließen und ein Byte senden. Wenn was 
zu sehen ist, ist die Einstellung richtig. IMHO ist die 
Portbiteinstellung aber egal, wenn der Pin dem I2C Bus gehört. Der macht 
das selber richtig. Ich hab nie die BRG-Werte nachgerechnet, sondern 
immer einfach gemessen und BRG angepasst. Kommt aber auch nicht wirklich 
genau drauf an.

MfG Klaus

von Toxic (Gast)


Angehängte Dateien:

Lesenswert?

Verzweifelt an PIC schrieb im Beitrag #5307904:
> 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?

"The user software need not be concerned with the state of the port I/O 
of the pins, as the module overrides the port state and direction."

Das I2C-Modul uebernimmt die Kontrolle der I2C-Pins.Was auch immer Du 
selbst vorgegeben hast wird ignoriert - so verstehe ich die Angabe aus 
dem Datenblatt

Wenn Du gerne liest:
http://www.microchip.com/forums/m834779.aspx

von Verzweifelt an PIC (Gast)


Lesenswert?

Danke ihr beiden

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.