Flash memory E2Rom 等常用到的页写算法

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值