153 lines
3.4 KiB
C
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****/
|
|
|