串口ok
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
#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****/
|
||||
|
||||
Reference in New Issue
Block a user