#ifndef EEPROM_H_INCLUDED
#define EEPROM_H_INCLUDED

/* ------------ Standard  Include Files --------------- */
#include "stm32f4xx.h"
#include <stdint.h>
#include <stdio.h>
/* ------------ Special   Include Files --------------- */
/* ------------ Projekt   Include Files --------------- */
/* ------------ Typen Deklarationen-------------------- */
/* ------------ Defintionen --------------------------- */

// Startadresse für Wetterdaten (an 128 Byte Page orientiert!)
#define E2P_DATA_START      0x00
// Ab hier ist freier Platz fur andere Daten
#define E2P_FREE_BASE       0x0400

/*
    Die nachfolgenden feststehenden Ausdruecke muessen aus der Doku
    der CPU herausgesucht werden für die I2C Kanaele 1,2 und 3
    und die Pinalternativen 1,2 und 3

            PinS PACK 1	    PINS PACK 2	    PINS PACK 3
    I2Cx	SCL	 SDA	        SCL	SDA	        SCL	SDA	     APB
    -------------------------------------------------------------
    I2C1	PB6	 PB7	        PB8	PB9	        PB6	PB9	     1
    I2C2	PB10 PB11	        PF1	PF0	        PH4	PH5	     1
    I2C3	PA8	 PC9	        PH7	PH8			   x         1

*/

/* I2C Interface Nr */
#define I2C_CHANNEL             I2C3                    // I2C1, I2C2, I2C3
#define I2C_GPIO_AF             GPIO_AF_I2C3            // GPIO_AF_I2C1, GPIO_AF_I2C2, GPIO_AF_I2C3
#define I2C_PERIPH_SCL_PORT     RCC_AHB1Periph_GPIOA
#define I2C_PERIPH_SDA_PORT     RCC_AHB1Periph_GPIOC
/* SCK Pin */
#define I2C_SCL_PORT            GPIOA
#define I2C_SCL_PIN             GPIO_Pin_8
#define I2C_SCL_SOURCE          GPIO_PinSource8
/* SDA Pin */
#define I2C_SDA_PORT            GPIOC
#define I2C_SDA_PIN             GPIO_Pin_9
#define I2C_SDA_SOURCE          GPIO_PinSource9

/* ------------ Public Variablen ---------------------- */
extern _Bool I2C_initialized;         // Hardware eingestellt = true

/* ------------ Public Funktionen Prototypen ---------- */

/* Init der I2C Schnittstelle */
void    e2p_Init_I2C();


/* Einzel Byte Lese/Schreib Funktionen */
uint8_t e2p_Write_Byte(uint16_t, uint8_t);
uint8_t e2p_WriteMultiBytes(uint16_t, uint8_t*, size_t);
uint8_t e2p_Read_Byte(uint16_t);
uint8_t e2p_Read_MultiBytes(uint8_t*, uint16_t, size_t);

/* Multibyte Lese/Schreib Funktionen */
uint8_t e2p_Read_MultiBytes(uint8_t*, const uint16_t, size_t const);
uint8_t e2p_PageWrite(uint8_t*, uint16_t,uint16_t);

/* E2PROM Löschen und I2C Bus ein/aus schalten */
uint8_t e2p_Erase_EEPROM();
void e2p_DeInit_I2C();

#endif /* EEPROM_H_INCLUDED */
