/* * File: Test.c * Author: philip * * Created on January 27, 2024, 8:54 PM */ // KONFIGURATION ////////////////////////// int I2CKonfig (void) { ODCONC = 0b00011000; // Open Drain Konfiguartion (RC3, RC4)) RC3PPS = 0x37; // SCL RC4PPS = 0x38; // SDA RC3I2Cbits.SLEW = 0b01; // Fast mode Plus RC3I2Cbits.PU = 0b10; // Fast mode Plus RC3I2Cbits.TH = 0b01; // Fast mode Plus RC4I2Cbits.SLEW = 0b01; // Fast mode Plus RC4I2Cbits.PU = 0b10; // Fast mode Plus RC4I2Cbits.TH = 0b01; // Fast mode Plus I2C1PIEbits.SCIE = 1; // Interrupt Start (nur bei Client) I2C1PIEbits.ADRIE = 1; // Interrupt Adress (nur bei Client) INTCON0bits.GIE = 1; // Interrupts aktivieren I2C1CON0bits.MODE = 0b000; // Client Mode 7-bit Adresse (Bei Host 0b100) I2C1CON0bits.RSEN = 1; // Stopp nach 9 Takten I2C1CON1bits.CSD = 1; // Clock strechting nicht aktiv I2C1CON1bits.TXU = 0; // Kein Transmit Underflow I2C1CON1bits.RXO = 0; // Kein Receive Overflow I2C1CON2bits.BFRET = 00; // Bus Free 8 Takte I2C1CON2bits.SDAHT = 01; // Hold Time 100ns I2C1CON2bits.ABD = 0; // Adress Buffer aktivieren I2C1CON2bits.FME = 0; // Fast Mode deaktivieren I2C1CON2bits.GCEN = 0; // General Call Addressing deaktivieren I2C1CON2bits.ACNT = 0; // Auto Load aktivieren I2C1CLK = 0b00011; // Clock = Fosc/4 I2C1CON0bits.EN = 1; // I2C aktivieren return 0; } /// UNTERPROGRAMM HOST /////////////////////////////////////// int I2CUebertragungHost (void) { I2C1ADB1 = 3; // Adresse 1, empfangen I2C1CNTH = 0; I2C1CNTL = 4; // Anzahl der Übertragungen I2C1CON0bits.S = 1; // Start while (I2C1STAT1bits.RXBF == 0) { } Uebertragung1 = I2C1RXB; while (I2C1STAT1bits.RXBF == 0) { } Uebertragung2 = I2C1RXB; while (I2C1STAT1bits.RXBF == 0) { } Uebertragung3 = I2C1RXB; Uebertragung4 = I2C1RXB; __delay_ms(10); I2C1ERR = 0; } /// UNTERPROGRAMM CLIENT /////////////////////////////////////// int I2CUebertragungClient (void) { I2C1ADR0 = 2; // Client Adresse I2C1ADR1 = 2; I2C1ADR2 = 2; I2C1ADR3 = 2; I2C1CNTH = 0; I2C1CNTL = 4; // Anzahl der Übertragungen I2C1TXB = Uebertragung1; while (I2C1PIRbits.SCIF == 0) // Warten bis Start interrupt Flag gesetzt wird { } while (I2C1STAT1bits.TXBE == 0) { } I2C1TXB = Uebertragung2; while (I2C1STAT1bits.TXBE == 0) { } I2C1TXB = Uebertragung3; while (I2C1STAT1bits.TXBE == 0) { } I2C1TXB = Uebertragung4; while (I2C1PIRbits.PCIF == 0) // Warten bis Stopp interrupt Flag gesetzt wird { } I2C1ERR = 0; }