#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****/