野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11996|回复: 10

I2C读写EEPROM问题

[复制链接]
发表于 2014-3-25 18:26:54 | 显示全部楼层 |阅读模式
这是火哥写的写页函数
void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
{
    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); // Added by Najoua 27/08/2008
   
/* Send START condition */
  I2C_GenerateSTART(I2C1, ENABLE);
  
  /* Test on EV5 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
  
/* Send EEPROM address for write */
  I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);
  
  /* Test on EV6 and clear it */
  while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  
  /* Send the EEPROM's internal address to write to */   
  I2C_SendData(I2C1, WriteAddr);  
  /* Test on EARM and clear it */
  while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));

问题1、
//此处火哥写的是 I2C_EVENT_MASTER_BYTE_TRANSMITTED,但我看时序认为应该是I2C_EVENT_MASTER_BYTE_TRANSMITTING,改过来之后程序运行结果无变化,为什么?


  /* While there is data to be written */
  while(NumByteToWrite--)  
  {
    /* Send the current byte */
    I2C_SendData(I2C1, *pBuffer);
    /* Point to the next byte to be written */
    pBuffer++;
  
    /* Test on EARM and clear it */
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
  }
问题二、在这个循环中,为什么只把pBuffer进行加1运算,地址为什么不加??

  /* Send STOP condition */
  I2C_GenerateSTOP(I2C1, ENABLE);
}
在线等解答!!!

回复

使用道具 举报

 楼主| 发表于 2014-3-25 19:19:00 | 显示全部楼层
难道是往EEPROM写一页的时候地址自动加1吗??
回复 支持 反对

使用道具 举报

发表于 2014-3-25 20:27:59 | 显示全部楼层
Skyeye 发表于 2014-3-25 19:19
难道是往EEPROM写一页的时候地址自动加1吗??

地址不用加,连续写或者连续读EEPROM的地址会自动加1,所以我们需要把pbuffer指向的地址加1就可以了
回复 支持 反对

使用道具 举报

发表于 2014-3-25 20:29:52 | 显示全部楼层
I2C_EVENT_MASTER_BYTE_TRANSMITTED和I2C_EVENT_MASTER_BYTE_TRANSMITTING差别不大是因为只要它在发送或者还没发完,我们的程序都会在等待,ed 和ing 的差别不大
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 20:35:48 | 显示全部楼层
好,如果是这样的话,问题又出现了(问题三),看火哥void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)这个函数中的代码:
while(NumOfPage--)
      {
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
            I2C_EE_WaitEepromStandbyState();
        WriteAddr +=  I2C_PageSize;
        pBuffer += I2C_PageSize;
问题三、
//调用I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);函数后pBuff应该已经被加了I2C_PageSize,那为什么下面还要加一句 pBuffer += I2C_PageSize;呢??????

      }

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

使用道具 举报

发表于 2014-3-25 20:49:23 | 显示全部楼层
Skyeye 发表于 2014-3-25 20:35
好,如果是这样的话,问题又出现了(问题三),看火哥void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, ...

如果写完第一页就写第二页,没有问题呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 20:53:47 | 显示全部楼层
祁羽彤 发表于 2014-3-25 20:49
如果写完第一页就写第二页,没有问题呀

现在的问题是当我们调用void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)函数之后,pBuffer指针已经下移了8个字节,也就是说已经指向了第二页的起始位置,如果在加一句pBuffer += I2C_PageSize;指针岂不是指向了第三页了,不知道我分析的对不对
回复 支持 反对

使用道具 举报

发表于 2014-3-25 21:17:23 | 显示全部楼层
Skyeye 发表于 2014-3-25 20:53
现在的问题是当我们调用void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)函数之后, ...

在I2C_EE_PageWrite 里pBuffer是形参哦,所以++移动的是临时变量,所以出了pagewrite函数后还要加pagesize。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 22:03:14 | 显示全部楼层
汗,惭愧啊,刚翻了下c语言的书,才知道形参指针不能传递给实参指针
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 22:43:42 | 显示全部楼层
谢谢各位的帮助,终于全部懂了,谢谢flyleaf
回复 支持 反对

使用道具 举报

发表于 2015-8-20 16:31:56 | 显示全部楼层
这一段代码还是有点意思的
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 23:39 , Processed in 0.055271 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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