野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18674|回复: 4

IIC读写AT24C02疑问请教

[复制链接]
发表于 2018-7-24 18:11:14 | 显示全部楼层 |阅读模式
1火花
1.问题描述,一段IIC读写AT24C02的函数,有个地方不明白,下面的代码用红色字体标注出来了
/**
  * @brief   在EEPROM的一个写循环中可以写多个字节,但一次写入的字节数
  *          不能超过EEPROM页的大小,AT24C02每页有8个字节
  * @param   
  *uint32_t I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
{
  I2CTimeout = I2CT_LONG_TIMEOUT;

  while(I2C_GetFlagStatus(EEPROM_I2Cx, I2C_FLAG_BUSY))   
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(4);
  }

  /* Send START condition */
  I2C_GenerateSTART(EEPROM_I2Cx, ENABLE);

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_MODE_SELECT))  
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(5);
  }

  /* Send EEPROM address for write */
  I2C_Send7bitAddress(EEPROM_I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))  
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(6);
  }

  /* Send the EEPROM's internal address to write to */   
  I2C_SendData(EEPROM_I2Cx, WriteAddr);  

  I2CTimeout = I2CT_FLAG_TIMEOUT;
  /* Test on EV8 and clear it */
  while(! I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {
    if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(7);
  }

  /* While there is data to be written */
  while(NumByteToWrite--)  
  {
    /* Send the current byte */
    I2C_SendData(EEPROM_I2Cx, *pBuffer);

    /* Point to the next byte to be written */
    pBuffer++;
          
    I2CTimeout = I2CT_FLAG_TIMEOUT;

    /* Test on EV8 and clear it */
    while (!I2C_CheckEvent(EEPROM_I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
    {
      if((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(8);
    }
  }

  /* Send STOP condition */
  I2C_GenerateSTOP(EEPROM_I2Cx, ENABLE);

  return 1;
}

这是一个多个字节写入的程序,pBuffer++; 已经表示指向下一个即将要写入到AT24C02的数据了,但是要写入到AT24C02内存的地址没有自增(代码没有体现出来),所以我认为应该要加上WriteAddr++;身边没有设备验证,还麻烦有操作经验的前辈回答一下,是不是要写上WriteAddr++;谢谢!

最佳答案

查看完整内容

EEPROM 的页写入 每写入一个数据都需要向 EEPROM 发送写入的地址,我们希望 向连续地址写入多个数据的时候,只要告诉 EEPROM 第一个内存地址 address1,后面的数 据按次序写入到 address2、 address3… 这样可以节省通讯的内容,加快速度。为应对这种 需求, EEPROM 定义了一种页写入时序。 根据页写入时序,第一个数据被解释为要写入的内存地址 address1,后续可连续发送 n 个 数据,这些数据会依次写入到内存中。其中 AT24C02 ...
回复

使用道具 举报

发表于 2018-7-24 18:11:15 | 显示全部楼层
EEPROM 的页写入
每写入一个数据都需要向 EEPROM 发送写入的地址,我们希望
向连续地址写入多个数据的时候,只要告诉 EEPROM 第一个内存地址 address1,后面的数
据按次序写入到 address2、 address3… 这样可以节省通讯的内容,加快速度。为应对这种
需求, EEPROM 定义了一种页写入时序。

根据页写入时序,第一个数据被解释为要写入的内存地址 address1,后续可连续发送 n 个
数据,这些数据会依次写入到内存中。
其中 AT24C02 型号的芯片页写入时序最多可以一次
发送 8 个数据(即 n = 8 ),该值也称为页大小,某些型号的芯片每个页写入时序最多可传输
16 个数据。 EEPROM 的页写入代码实现见代码清单
回复

使用道具 举报

发表于 2018-7-25 08:57:54 | 显示全部楼层
教程里有介绍的,这是eeprom的页写入时序,它的地址会自增
回复

使用道具 举报

 楼主| 发表于 2018-7-25 11:37:15 | 显示全部楼层
Brave000 发表于 2018-7-25 09:04
EEPROM 的页写入
每写入一个数据都需要向 EEPROM 发送写入的地址,我们希望
向连续地址写入多个数据的时 ...

嗯嗯  我知道了 也就是说我们在写入多个数据时候,EEPROM的寄存器地址会自增,不需要我们做WriteAddr++操作了
回复

使用道具 举报

 楼主| 发表于 2018-7-25 11:37:57 | 显示全部楼层
flyleaf 发表于 2018-7-25 08:57
教程里有介绍的,这是eeprom的页写入时序,它的地址会自增

好的  我知道了 结贴
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 01:41 , Processed in 0.031321 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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