long xxxPageWrite(long uAddr, const void *pSrcData, long iLen)
{
#define PAGE_SIZE 128 //页面大小
#define MAX_ADDRESS 0x10000UL //最大地址
long iDoneBytes=0; //写入的长度
long iOffset, iNewWrLen;
unsigned char PageBuff[PAGE_SIZE]; //页面缓冲区
const char *pData = (const char *)pSrcData; //源数据
while(iDoneBytes < iLen)
{
iOffset = (uAddr % PAGE_SIZE); //页内偏移
uAddr -= iOffset; //地址对齐到页起始
if((uAddr + PAGE_SIZE) > MAX_ADDRESS)//超出最大地址
break;
//需要写入的字节数
iNewWrLen = min(PAGE_SIZE, iLen - iDoneBytes) - iOffset;
if(iOffset //起始部分没有对齐
|| iNewWrLen != PAGE_SIZE //非整页数据
|| 0)//需要读出原始数据
{
//整页读出
//读出从 uAddr 开始的 PAGE_SIZE 个字节数据到 PageBuff
//比如 I2cRead(uAddr, PageBuff, PAGE_SIZE);
}
//合并新写入数据
memcpy(PageBuff + iOffset, pData, iNewWrLen);
//页面写入
{
//循环写入PageBuff 的 PAGE_SIZE个字节的数据 到 uAddr
//比如 I2cWrite(uAddr, PageBuff, PAGE_SIZE);
}
//准备下帧
uAddr += PAGE_SIZE; //页写地址
pData += iNewWrLen; //源数据地址
iDoneBytes += iNewWrLen; //写入的长度
}
return iDoneBytes;
}
Flash memory E2Rom 等常用到的页写算法
最新推荐文章于 2024-03-27 15:45:53 发布