野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 21766|回复: 8

I2C EEPROM 程序修改

[复制链接]
发表于 2014-3-21 10:11:44 | 显示全部楼层 |阅读模式
本帖最后由 Ω囿圉Ω 于 2014-3-21 14:12 编辑

学习STM32有一段时间了

进度有点慢,到I2C通信这里的发现例有有个小BUG

问题会出现在:当写入地址不在页首地址,字节量小于一页,写入页剩余小于写入字节量时。

就是出现回到当前页起始地址写入的错误。

从例程序上作了一些修改,请大神看一下有没有不足之处

/**
  * @brief   将缓冲区中的数据写到I2C EEPROM中
  * @param   
  *                @arg pBuffer:缓冲区指针
  *                @arg WriteAddr:写地址
  *     @arg NumByteToWrite:写的字节数
  * @retval  无
  */
void I2C_EEPROM_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
        u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;

        Addr = WriteAddr % I2C_PageSize; //判断写入地址与页起始地址距离
        if(Addr != 0)                    //写入起始地址不在页起始位置
        {
                count = I2C_PageSize - Addr; //写入起始页最多还能写入字节数
        }
        
        if(NumByteToWrite > count)       //如果写入数量大于起始页还能写入的数量,先把起始页写完(count != 0,等于0无所谓)
        {
                NumByteToWrite -= count;     //减去起始页写入的字节数
        }
        else count = 0;
        NumOfPage =  NumByteToWrite / I2C_PageSize;  //剩余要写入的整页数
        NumOfSingle = NumByteToWrite % I2C_PageSize; //不足一页的写入数量
        
        //写入不在页起始地址,写完当前页剩余能写的量
        if(count != 0)
        {
                I2C_EEPROM_PageWrite(pBuffer, WriteAddr, count);
                I2C_EEPROM_WaitEepromStandbyState();
                WriteAddr += count;
                pBuffer += count;
        }
        //写入一页
        while(NumOfPage--)
        {
                I2C_EEPROM_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
                I2C_EEPROM_WaitEepromStandbyState();
                WriteAddr +=  I2C_PageSize;
                pBuffer += I2C_PageSize;
        }
        //写入不足一页
        if(NumOfSingle != 0)
        {
                I2C_EEPROM_PageWrite(pBuffer, WriteAddr, NumOfSingle);
                I2C_EEPROM_WaitEepromStandbyState();
        }
        
}

回复

使用道具 举报

发表于 2014-3-21 10:12:50 | 显示全部楼层
看看,哪部分是你修改的?
回复 支持 反对

使用道具 举报

发表于 2014-3-21 10:25:03 | 显示全部楼层
LZ直接说你改的地方吧,这不涉及到底层,也没啥好说的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-21 10:31:50 | 显示全部楼层
三流电工 发表于 2014-3-21 10:25
LZ直接说你改的地方吧,这不涉及到底层,也没啥好说的

我把原来先判断写入是不是页起始,再判断写入是不是多页 这几个判断去掉了,

这样代码量相应就减小了,也不再重复

也解决了我所说的那个写入的问题。
回复 支持 反对

使用道具 举报

发表于 2014-3-21 11:19:15 | 显示全部楼层
Ω囿圉Ω 发表于 2014-3-21 10:31
我把原来先判断写入是不是页起始,再判断写入是不是多页 这几个判断去掉了,

这样代码量相应就减小了, ...

能再说清楚你要实现的目的和出现的问题吗?还是没懂你要干嘛
回复 支持 反对

使用道具 举报

发表于 2014-3-21 11:35:19 | 显示全部楼层
I2C_PageSize 是多少?存储芯片是多大?
回复 支持 反对

使用道具 举报

发表于 2014-3-21 11:35:42 | 显示全部楼层
存储芯片是什么型号的?
回复 支持 反对

使用道具 举报

发表于 2014-3-21 12:03:08 | 显示全部楼层
flr 发表于 2014-3-21 11:35
存储芯片是什么型号的?

芯片型号是AT24c02
回复 支持 反对

使用道具 举报

发表于 2014-3-21 14:01:55 | 显示全部楼层
每页写不超过8个字节
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 19:56 , Processed in 0.032221 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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