硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2234|回复: 3
收起左侧

关于【bsp_eeprom_24xx.c】中可能存在的BUG,请老大确认一下

[复制链接]

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2018-7-6 13:47:13 | 显示全部楼层 |阅读模式
函数【ee_WriteBytes】中:
usAddr = _usAddress;
        for (i = 0; i < _usSize; i++)
        {
                /* 当发送第1个字节或是页面首地址时,需要重新发起启动信号和地址 */
                if ((i == 0) || (usAddr & (EE_PAGE_SIZE - 1)) == 0)
                {
                        /* 第0步:发停止信号,启动内部写操作 */
                        i2c_Stop();

                        /* 通过检查器件应答的方式,判断内部写操作是否完成, 一般小于 10ms
                                CLK频率为200KHz时,查询次数为30次左右
                        */
                        for (m = 0; m < 1000; m++)
                        {
                                /* 第1步:发起I2C总线启动信号 */
                                i2c_Start();

                                /* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
                               
                                #if EE_ADDR_A8 == 1                                /* 此处原版可能有BUG  原版写的是 _usAddress,我觉得应该写 usAddr */
                                        i2c_SendByte(EE_DEV_ADDR | I2C_WR | ((usAddr >> 7) & 0x0E));        /* 此处是写指令 */
                                #else                               
                                        i2c_SendByte(EE_DEV_ADDR | I2C_WR);
                                #endif

                                /* 第3步:发送一个时钟,判断器件是否正确应答 */
                                if (i2c_WaitAck() == 0)
                                {
                                        break;
                                }
                        }
                        if (m  == 1000)
                        {
                                goto cmd_fail;        /* EEPROM器件写超时 */
                        }

                        /* 第4步:发送字节地址,24C02只有256字节,因此1个字节就够了,如果是24C04以上,那么此处需要连发多个地址 */
                        if (EE_ADDR_BYTES == 1)
                        {
                                i2c_SendByte((uint8_t)usAddr);
                                if (i2c_WaitAck() != 0)
                                {
                                        goto cmd_fail;        /* EEPROM器件无应答 */
                                }
                        }
                        else
                        {
                                i2c_SendByte(usAddr >> 8);
                                if (i2c_WaitAck() != 0)
                                {
                                        goto cmd_fail;        /* EEPROM器件无应答 */
                                }

                                i2c_SendByte(usAddr);
                                if (i2c_WaitAck() != 0)
                                {
                                        goto cmd_fail;        /* EEPROM器件无应答 */
                                }
                        }
                }

                /* 第6步:开始写入数据 */
                i2c_SendByte(_pWriteBuf);

                /* 第7步:发送ACK */
                if (i2c_WaitAck() != 0)
                {
                        goto cmd_fail;        /* EEPROM器件无应答 */
                }

                usAddr++;        /* 地址增1 */
        }


老大看一下红色字体,确认一下是不是BUG。
回复

使用道具 举报

2

主题

58

回帖

64

积分

初级会员

积分
64
发表于 2018-7-6 14:42:53 | 显示全部楼层
本帖最后由 365mcu 于 2018-7-6 14:46 编辑

我理解错了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106974
QQ
发表于 2018-7-6 17:03:26 | 显示全部楼层
非常感谢楼主指出,由于开发板是用的AT24C128,所以这里没问题。但使用04,08和16要修改,原因如下,页编程地址要占用设备地址的部分bit。

QQ截图20180706170144.png


最后这个驱动要升级下,写入结束后要在判断一次,防止写入结束,立即切换到读操作,会有问题。
http://www.armbbs.cn/forum.php?m ... mp;highlight=eeprom

QQ截图20180706170507.png


回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2018-7-6 17:40:54 | 显示全部楼层
eric2013 发表于 2018-7-6 17:03
非常感谢楼主指出,由于开发板是用的AT24C128,所以这里没问题。但使用04,08和16要修改,原因如下,页编程 ...

嗯,是的。我程序为了适配02/04/08/16/32/64/128,就需要修改一下了。多谢老大解答。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 16:33 , Processed in 0.166811 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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