Knihovna I2c

Uuštřil jsem čas hledáním další knihony a napsal si vlastní. Otestováno zatím jen na komunanikaci s DS1307. Tedy jen s jedním slave na sběrnici.
třeba to někomu pomůže do začátku.

#include <xc.h>
#include <pic18f2455.h>

void InitI2C(void) /// hotovo
{
TRISBbits.RB0 = 1;// set SDA jako vstup
TRISBbits.RB1= 1; // set SCL jako vsup
PIE1bits.SSPIE = 1; // povolení p?eru?ení od MSSP je povoleno
PIR1bits.SSPIF = 0; // p?íznak p?eru?ení od MSSP je nulován a ?eká se na vysílání a p?íjem
SSPSTAT = 0x80; // 80 SMP - ?ízení rychlosti p?eb?hu je odstaveno 100kHz
SSPCON1 = 0x28; // SSPEN - povolení MSSP a nastaveno na I2C nakofiguruje SDA a SCL a SSPM na Master a kmito?et podle vzorce fosc/ 4x(SSPADD+1)
SSPCON2 = 0x00; // ?innost I2C zatím pozastavena
SSPADD = 0x31; // nastavení rychlosti je podle vzorce fosc/ 4x(SSPADD+1) tj 20 000 000 Hz/ 4x (49+1) = 100 000 Hz
SSPCON1bits.SSPEN = 1;// opakovaný start ---- vy?adovaná rutina
// PIR2bits.BCLIF = 0; // nulování kolize na bus —to myslim je zbyte?ný nemám povoleno SMBUS v SSPStat
SSPCON2bits.PEN =1; // inicialiyuje stop stav na SDA a SCL - v init nutne, pro ukonceni prenosu.
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu

}
void I2C_Start(void) /// hotovo
{
PIR1bits.SSPIF = 0;
SSPCON2bits.PEN =0; // ne?inný stop stav na SDA a SCL — nenuluje automaticky
SSPCON2bits.SEN =1; // Inicializuje start na SDA a SCL povolí hodiny — nuluje automaticky
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
}

void I2C_ReStart(void)
{
PIR1bits.SSPIF = 0;
SSPCON2bits.RSEN =1; // Inicializuje restart na SDA a SCL povolí hodiny
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
}

void I2C_Stop(void) /// hotovo
{

SSPCON2bits.PEN =1; // inicialiyuje stop stav na SDA a SCL
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
PIR1bits.SSPIF = 0; // p?íznak p?eru?ení od MSSP je nulován a ?eká se na vysílání a p?íjem 

}

void I2C_Write_Byte(unsigned char Byte) // hotovo
{
PIR1bits.SSPIF = 0; // p?íznak p?eru?ení od MSSP je nulován a ?eká se na vysílání a p?íjem
SSPBUF = Byte;
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
}

unsigned char I2C_Read_Byte(void)
{
unsigned char RxData = 0; // RxData1 = 0,
PIR1bits.SSPIF = 0; // p?íznak p?eru?ení od MSSP je nulován a ?eká se na vysílání a p?íjem
SSPCON2bits.RCEN = 1; // povolení p?íjmu v re?imu master
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
RxData = SSPBUF;
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu
SSPCON2bits.ACKDT = 1; //potvrzení ACK 0- je 1 - není - p?ipravení kvitování
SSPCON2bits.ACKEN = 1; // inicializuje ACK sekvenci na SDA a SCL ode?le stav ACKDT - povoleno kvitování
PIR1bits.SSPIF = 0; // p?íznak p?eru?ení od MSSP je nulován a ?eká se na vysílání a p?íjem - odesílání
while (PIR1bits.SSPIF == 0); //?eká na ukon?ení p?enosu odesláno
return RxData; // ,RxData1