EEPROM跨页写伪码

//EEPROM 缓冲跨页写任务
void EepBufWrTask()
{
    if(GetUserTimer(TIMER_ID_PAGE_WR))
    {
        if(eepBufWrCtrl.queLen > 0)
        {
            if(eepPageWrCtrl.bPageWr == 0)  //第一次进入页写,初始化页写控制数据,并计算初始页边界
            {
                eepPageWrCtrl.len = eepBufWrCtrl.wrLen[eepBufWrCtrl.tail];
                eepPageWrCtrl.addr = eepBufWrCtrl.chipAddr[eepBufWrCtrl.tail];
                eepPageWrCtrl.pBuf = &eepBufWrCtrl.buf[eepBufWrCtrl.tail][0];
                eepPageWrCtrl.bPageWr = 1;
                eepPageWrCtrl.wrCnt = 0;   //写入字节计数器
                eepPageWrCtrl.remainByteNum = eepPageWrCtrl.len;


                //计算页边界
                eepPageWrCtrl.pageBoundary = 0;
                while(eepPageWrCtrl.pageBoundary <= eepPageWrCtrl.addr)
                  eepPageWrCtrl.pageBoundary += PAGE_SZIE;
            }
            EepPageWrTask();
            if(eepPageWrCtrl.bPageWr == 0)  //页写完成
            {
                eepBufWrCtrl.queLen --;
                eepBufWrCtrl.tail ++;
                if(eepBufWrCtrl.tail == 3)
                    eepBufWrCtrl.tail = 0;
            }
        }

        SetUserTimer(TIMER_ID_PAGE_WR,2); //定时10ms
    }
}
//EEPROM跨写写任务
void EepPageWrTask()
{
    unsigned char temp;
    short temp1;
    unsigned char tempLen;
    unsigned short *pTemp;
    if(eepPageWrCtrl.remainByteNum > 0)
    {
          //计算页内可写入的数目
          temp = eepPageWrCtrl.pageBoundary - eepPageWrCtrl.addr;
          //计算剩余字节和业内可写字节数目差值
          temp1 = eepPageWrCtrl.remainByteNum - temp;
          if(temp1 > 0)  // 本页内写不完剩余字节数目
          {
              tempLen = temp;
              eepPageWrCtrl.pageBoundary += PAGE_SZIE;
          }
          else  //写完成
          {
              tempLen = eepPageWrCtrl.remainByteNum;
              eepPageWrCtrl.bPageWr = 0;
          }

          pTemp = eepPageWrCtrl.pBuf + eepPageWrCtrl.wrCnt; //写入缓冲区地址
          WriteI2C_Eep_polling(eepPageWrCtrl.addr,tempLen,pTemp);
          eepPageWrCtrl.remainByteNum -= tempLen;
          eepPageWrCtrl.addr += tempLen;
          eepPageWrCtrl.wrCnt += tempLen;
    }
}

/*启动EEPROM缓冲写
 *    pBuf 数据写临时缓冲区, len写入数据的长度,addr 芯片内存地址
 */
unsigned char StartupEepBufWr(unsigned char *pBuf,unsigned char len,unsigned char addr)
{
    int i;
    unsigned char rt;
    if(eepBufWrCtrl.queLen < 3)
    {
        //设置本次队列元素对应的缓冲区,写入地址和写入数据长度
        eepBufWrCtrl.chipAddr[eepBufWrCtrl.head] = addr;
        eepBufWrCtrl.wrLen[eepBufWrCtrl.head] = len;
        for(i = 0; i < len; i++)
            eepBufWrCtrl.buf[eepBufWrCtrl.head][i] = *(pBuf +i);

        eepBufWrCtrl.queLen ++;
        eepBufWrCtrl.head ++;   //指向下一次要写入数据的队列头部
        if(eepBufWrCtrl.head == 3)
          eepBufWrCtrl.head = 0;

        rt = 1;
    }
    else
        rt = 0;

    return rt;
}
#define EEP_BUF_SIZE 32
/*EEPROM 页写控制数据结构*/
typedef struct __EEP_PAGE_WR_CTRL
{
    unsigned char remainByteNum; //剩余字节数目
    unsigned  char bPageWr; //页写标志
    unsigned short pageBoundary;  //页边界
    unsigned short addr;    //写入地址
    unsigned char len;      //写入数据长度
    unsigned char *pBuf;

    unsigned char wrCnt;  //缓冲区写入计数
} _EEP_PAGE_WR_CTRL;

typedef struct __EEP_BUF_WR_QUE_CTRL
{
    unsigned char queLen;  //队列长度
    unsigned char head;
    unsigned char tail;

    unsigned char buf[3][EEP_BUF_SIZE];
    unsigned char wrLen[3];
    unsigned char chipAddr[3];
} _EEP_BUF_WR_QUE_CTRL;
_EEP_PAGE_WR_CTRL eepPageWrCtrl = {.remainByteNum = 0,.bPageWr = 0,};
_EEP_BUF_WR_QUE_CTRL eepBufWrCtrl = {.queLen = 0,.head = 0,.tail = 0};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值