野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 31|回复: 0

STM32__I2C__EEPROM示例代码中的问题

[复制链接]
发表于 前天 14:41 | 显示全部楼层 |阅读模式

在这段代码中,如果写地址没有对齐页,并且写入数据小于页大小时,我认为并不能直接用整页写入。
如果写地址为 WriteAddr = 5,页大小为8,并且要写入 7 字节数据,这是满足上述条件的。那么从地址 5 开始写入 7 字节,写操作将涉及地址 5, 6, 7, 8, 9, 10, 11。这意味着,数据的第四个字节将落在页面边界之后(即页大小为 8 字节,地址 8 是一个新页面的开始)。因此,数据将跨越页面边界。EEPROM 无法跨页面进行写操作

有大佬解答一下我的问题吗?





  1. /**
  2.   * [url=home.php?mod=space&uid=41770]@brief[/url]   将缓冲区中的数据写到I2C EEPROM中
  3.   * @param   
  4.   *        @arg pBuffer:缓冲区指针
  5.   *        @arg WriteAddr:写地址
  6.   *     @arg NumByteToWrite:写的字节数
  7.   * @retval  无
  8.   */
  9. void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
  10. {
  11.   u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

  12.   Addr = WriteAddr % I2C_PageSize;
  13.   count = I2C_PageSize - Addr;
  14.   NumOfPage =  NumByteToWrite / I2C_PageSize;
  15.   NumOfSingle = NumByteToWrite % I2C_PageSize;

  16.   /* If WriteAddr is I2C_PageSize aligned  */
  17.   if(Addr == 0)
  18.   {
  19.     /* If NumByteToWrite < I2C_PageSize */
  20.     if(NumOfPage == 0)
  21.     {
  22.       I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  23.       I2C_EE_WaitEepromStandbyState();
  24.     }
  25.     /* If NumByteToWrite > I2C_PageSize */
  26.     else  
  27.     {
  28.       while(NumOfPage--)
  29.       {
  30.         I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
  31.         I2C_EE_WaitEepromStandbyState();
  32.         WriteAddr +=  I2C_PageSize;
  33.         pBuffer += I2C_PageSize;
  34.       }

  35.       if(NumOfSingle!=0)
  36.       {
  37.         I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  38.         I2C_EE_WaitEepromStandbyState();
  39.       }
  40.     }
  41.   }
  42.   /* If WriteAddr is not I2C_PageSize aligned  */
  43.   else
  44.   {
  45.     /* If NumByteToWrite < I2C_PageSize */
  46.     if(NumOfPage== 0)
  47.     {
  48.       I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  49.       I2C_EE_WaitEepromStandbyState();
  50.     }
  51.     /* If NumByteToWrite > I2C_PageSize */
  52.     else
  53.     {
  54.       NumByteToWrite -= count;
  55.       NumOfPage =  NumByteToWrite / I2C_PageSize;
  56.       NumOfSingle = NumByteToWrite % I2C_PageSize;   
  57.       
  58.       if(count != 0)
  59.       {  
  60.         I2C_EE_PageWrite(pBuffer, WriteAddr, count);
  61.         I2C_EE_WaitEepromStandbyState();
  62.         WriteAddr += count;
  63.         pBuffer += count;
  64.       }
  65.       
  66.       while(NumOfPage--)
  67.       {
  68.         I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
  69.         I2C_EE_WaitEepromStandbyState();
  70.         WriteAddr +=  I2C_PageSize;
  71.         pBuffer += I2C_PageSize;  
  72.       }
  73.       if(NumOfSingle != 0)
  74.       {
  75.         I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
  76.         I2C_EE_WaitEepromStandbyState();
  77.       }
  78.     }
  79.   }  
  80. }
复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 06:30 , Processed in 0.120689 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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