野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 29187|回复: 4

I2C的问题

[复制链接]
发表于 2013-8-6 13:00:43 | 显示全部楼层 |阅读模式
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite) //writeaddr是程序写数据的地址还是芯片的地址?
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;//定义addr count这两个变量干嘛,不知道这两个变量
在芯片中作用?
  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();
      }
    }
  }  
}
这里定义了很多变量,我不知道定义了到底有什么用,也不知道为什么这样操作这些变量。希望理解这个程序的朋友可以给我讲一下思路,在这里先谢谢各位了,如果可以给每句话加点备注的话,那就再好不过了
回复

使用道具 举报

发表于 2013-8-6 13:29:49 | 显示全部楼层
楼主是不是没看教程,直接看代码的?
楼主没搞清楚分页的概念,所以搞不懂
[code=cpp]  Addr = WriteAddr % I2C_PageSize;    //这句到底有什么作用,不理解?
  count = I2C_PageSize - Addr;       //这句到底是什么意思,不理解?[/code]
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 15:26:00 | 显示全部楼层
恐发之际 发表于 2013-8-6 13:29
楼主是不是没看教程,直接看代码的?
楼主没搞清楚分页的概念,所以搞不懂

现在弄差不懂了,但是还有几个问题啊: else   
  {
    /* If NumByteToWrite < I2C_PageSize */
    if(NumOfPage== 0)
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }假设我不是在页码的首地址写的,writeaddr=6,numbitytowrite=5,那么这个程序的最后三位是不是没有写呢?
回复 支持 反对

使用道具 举报

发表于 2014-3-21 10:03:49 | 显示全部楼层
lemon_balm 发表于 2013-8-6 15:26
现在弄差不懂了,但是还有几个问题啊: else   
  {
    /* If NumByteToWrite < I2C_PageSize */

朋友说的确实有问题,发现问题自己改正。野火又不是神,程序有BUG正常的事。
回复 支持 反对

使用道具 举报

发表于 2014-3-21 11:48:07 | 显示全部楼层
从这里开始代码改下 用NumByteToWrite 和 count 比较进行存储
/* If NumByteToWrite < I2C_PageSize */

    if(NumOfPage== 0)
    {
      I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
      I2C_EE_WaitEepromStandbyState();
    }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:59 , Processed in 0.031244 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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