stm32_freertos_template/eeprom.c

70 lines
1.2 KiB
C

#include "i2c.h"
#include "eeprom.h"
#include "error.h"
//--------------definicje-----------------//
//24C02
#define DATA_PAGE_ADDR 0x00
#ifdef USE_RTOS
#include "FreeRTOS.h"
#include "task.h"
#define TICK xTaskGetTickCount()
#else
extern uint32_t tick; // z systick.c
#define TICK tick
#endif
//-----------------funkcje-------------------
int8_t eeprom_Initialize(void)
{
return I2C_Initialize(I2C1);
}
int8_t eeprom_ReadData(void *data, uint32_t size)
{
uint8_t tmp,addr,*ptr;
int8_t k;
uint32_t i;
addr=DATA_PAGE_ADDR;
ptr=(uint8_t*)data;
k=I2C_ReadIadr(I2C1, EEPROM_ADDR, addr, (uint8_t *)data, size);
return k;
}
int8_t eeprom_WriteData(void *data, uint32_t size)
{
uint8_t *ptr,addr;
int8_t k;
uint32_t i,tmp;
addr=DATA_PAGE_ADDR;
ptr=(uint8_t*)data;
for(i = 0; i < size; i++)
{
tmp=TICK;
while(1)
{
k=I2C_WriteIadr(I2C1,EEPROM_ADDR,addr,ptr,1);
if( (k==-I2C_BUS_ERROR) || (k==-TIMEOUT) )
{
return k;
}
else if (k==-I2C_SLAVE_NACK)
{
if( (TICK-tmp) >= 50 ) //czekamy max 50ms
return k;
else
continue;
}
else
break;
}
ptr++;
addr++;
}
return 0;
}