Files
motor/Common/i2c/EEprom_M24C64.c
T
2024-09-26 22:32:20 +08:00

153 lines
3.4 KiB
C

#include "EEprom_M24C64.h"
#define EEP_M24C64_BYTES_PER_SECTOR (32) //bytes per sector
#define WRITE_NEED_TIME (7) //datasheet shows Byte Write within 5 ms
bool EEprom_M24C64_init(EEprom_M24C64_t *eep, const char *name, I2C_DEV_t *dev)
{
eep->name = name;
eep->_dev = dev;
return true;
}
bool EEprom_M24C64_read(EEprom_M24C64_t *eep, uint16_t offset, uint8_t* Buf, uint16_t Size)
{
uint16_t AddrStart = offset;
uint16_t AddrEnd = 0;
uint16_t SectorTemp = 0;
uint16_t SectorStart = 0;
uint16_t SectorEnd = 0;
uint8_t* BufPtr = Buf;
uint16_t SizeRead = Size;
if(0 == Size)
return false;
AddrEnd = AddrStart + Size - 1;
SectorStart = AddrStart/EEP_M24C64_BYTES_PER_SECTOR;
SectorEnd = AddrEnd/EEP_M24C64_BYTES_PER_SECTOR;
if( SectorStart == SectorEnd ) //if all data in one sector
{
if(!I2C_DEV_read_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeRead))
{
return false;
}
}
else //if data in multi sector
{
//except the last sector
for( SectorTemp = SectorStart; SectorTemp < SectorEnd; SectorTemp++ )
{
SizeRead = (SectorTemp+1)*EEP_M24C64_BYTES_PER_SECTOR - AddrStart;
if(!I2C_DEV_read_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeRead))
{
return false;
}
BufPtr += SizeRead;
AddrStart += SizeRead;
}
//the last sector
SizeRead = AddrEnd - AddrStart + 1;
if(!I2C_DEV_read_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeRead))
{
return false;
}
}
return true;
}
bool EEprom_M24C64_write(EEprom_M24C64_t *eep, uint16_t Addr, uint8_t* Buf, uint16_t Size)
{
uint16_t AddrStart = Addr;
uint16_t AddrEnd = 0;
uint16_t SectorTemp = 0;
uint16_t SectorStart = 0;
uint16_t SectorEnd = 0;
uint8_t* BufPtr = Buf;
uint16_t SizeWrite = Size;
if(0 == Size)
return false;
AddrEnd = AddrStart + Size - 1;
SectorStart = AddrStart/EEP_M24C64_BYTES_PER_SECTOR;
SectorEnd = AddrEnd/EEP_M24C64_BYTES_PER_SECTOR;
if( SectorStart == SectorEnd ) //if all data in one sector
{
if(!I2C_DEV_write_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeWrite))
{
return false;
}
}
else //if data in multi sector
{
//except the last sector
for( SectorTemp = SectorStart; SectorTemp < SectorEnd; SectorTemp++ )
{
SizeWrite = (SectorTemp+1)*EEP_M24C64_BYTES_PER_SECTOR - AddrStart;
if(!I2C_DEV_write_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeWrite))
{
return false;
}
BufPtr += SizeWrite;
AddrStart += SizeWrite;
osDelay(WRITE_NEED_TIME); //datasheet shows Byte Write within 5 ms
}
//the last sector
SizeWrite = AddrEnd - AddrStart + 1;
if(!I2C_DEV_write_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, BufPtr, SizeWrite))
{
return false;
}
}
osDelay(WRITE_NEED_TIME);
return true;
}
/** clear sector from 0sector to end_sector */
bool EEprom_M24C64_clear_sector(EEprom_M24C64_t *eep, uint32_t end_sector)
{
uint8_t ClearBuf[EEP_M24C64_BYTES_PER_SECTOR] = {0xff};
uint16_t AddrStart = 0;
memset(ClearBuf, 0 ,EEP_M24C64_BYTES_PER_SECTOR);
for(uint16_t i = 0; i < end_sector; i++)//M24C64 has 256 sectors
{
if(!I2C_DEV_write_mem(eep->_dev, AddrStart, I2C_MEMADD_SIZE_16BIT, ClearBuf, EEP_M24C64_BYTES_PER_SECTOR))
{
return false;
}
AddrStart += EEP_M24C64_BYTES_PER_SECTOR;
osDelay(WRITE_NEED_TIME); //datasheet shows Byte Write within 5 ms
}
return true;
}
/*********END OF FILE****/