野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13640|回复: 4

关于I2C中Addr不等于0,且NumOfPage等于0写入代码问题的请教

[复制链接]
发表于 2016-5-9 00:45:51 | 显示全部楼层 |阅读模式
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

  Addr = WriteAddr % I2C_PageSize;
  count = I2C_PageSize - Addr;
  NumOfPage =  NumByteToWrite / I2C_PageSize;
  NumOfSingle = NumByteToWrite % I2C_PageSize;

  /* If WriteAddr is I2C_PageSize aligned  */
  if(Addr == 0)
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage == 0)
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }
    /* If NumByteToWrite > I2C_PageSize */
    else  
    {
      while(NumOfPage--)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
            I2C_EE_WaitEepromStandbyState();
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;
      }

      if(NumOfSingle!=0)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        I2C_EE_WaitEepromStandbyState();
      }
    }
  }
  /* If WriteAddr is not I2C_PageSize aligned  */
  else
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage== 0)
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }
    /* If NumByteToWrite > I2C_PageSize */
    else
    {
      NumByteToWrite -= count;
      NumOfPage =  NumByteToWrite / I2C_PageSize;
      NumOfSingle = NumByteToWrite % I2C_PageSize;       
      
      if(count != 0)
      {  
        I2C_EE_PageWrite(pBuffer, WriteAddr, count);
        I2C_EE_WaitEepromStandbyState();
        WriteAddr += count;
        pBuffer += count;
      }
      
      while(NumOfPage--)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        I2C_EE_WaitEepromStandbyState();
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;  
      }
      if(NumOfSingle != 0)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        I2C_EE_WaitEepromStandbyState();
      }
    }
  }  
}

如以上代码所示,无论Addr是否为0,NumOfPage只要为0都是按照
{I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EE_WaitEepromStandbyState();}代码写进去的。这样会存在一个问题。假如addr=7,count=7时,会不会覆盖掉6个数据?
回复

使用道具 举报

发表于 2016-5-9 09:05:25 | 显示全部楼层
不会,它是按地址顺序写的
回复 支持 反对

举报

 楼主| 发表于 2016-5-9 23:33:13 | 显示全部楼层
flyleaf 发表于 2016-5-9 09:05
不会,它是按地址顺序写的

意思是会自动跳转到下一页吗?如果是这也样,那么这个函数就没有必要还分页写了撒,直接地址++写代码不是要简便很多?
回复 支持 反对

举报

 楼主| 发表于 2016-5-9 23:33:55 | 显示全部楼层
flyleaf 发表于 2016-5-9 09:05
不会,它是按地址顺序写的

意思是会自动跳转到下一页吗?如果是这也样,那么这个函数就没有必要还分页写了撒,直接地址++写代码不是要简便很多?
回复 支持 反对

举报

发表于 2016-7-20 09:44:18 | 显示全部楼层
会覆盖,经测试,输入和输出不匹配,需要在ELSE中的if(NumOfPage== 0)加一个判断
回复 支持 反对

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-3-15 09:06 , Processed in 0.049867 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表