打印

24c64写地址超出范围,还会不会写入?

[复制链接]
3334|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
dirtwillfly| | 2014-5-18 14:02 | 只看该作者
写之前先判断地址是不是在允许的范围内

使用特权

评论回复
板凳
sfesdm| | 2014-5-18 14:03 | 只看该作者
本帖最后由 sfesdm 于 2014-5-18 14:07 编辑

超出的部分应该会被溢出丢弃吧?

使用特权

评论回复
地板
yewuyi| | 2014-5-18 20:14 | 只看该作者
分情况:
1、采用的是连续写,当超出其最大地址后,就会从头开始覆盖。
2、如果你采用的直接单字节写,因为你送入的地址无效,EEPROM应该不会给出应答,主机检查不到应答可判断为出错。

使用特权

评论回复
5
datouyuan|  楼主 | 2014-5-20 00:21 | 只看该作者
因为产品有可能安装24C64、24C128、24C256、24C512这几种型号,
想要根据IIC的存储容量自动识别IIC的型号。

uint8 testROM(void)
{

ScreenHunter_014.gif (3.95 KB )

ScreenHunter_014.gif

使用特权

评论回复
6
datouyuan|  楼主 | 2014-5-20 00:22 | 只看该作者
uint8 testROM(void)
{
        addr=0xffff;
        for(i=8;i>0;i--)
        {
                WDT = ~WDT;
                t[0]=0xaa;
                Write24C64(addr,t,1);
                t[0]=0;
                Read24C64(addr,t,1);
                if(t[0]==0xaa) break;
                addr>>=1;
        }
        return i;
}

使用特权

评论回复
7
datouyuan|  楼主 | 2014-5-20 00:25 | 只看该作者
上面的是测试函数。
返回8,表示IC为24c512
返回5,表示IC为24c64

可实测,安装的是24c64,返回值确是8.

使用特权

评论回复
8
datouyuan|  楼主 | 2014-5-20 00:49 | 只看该作者
//IIC测试程序
//IIC是好的  返回ROM_MAX
//IIC是坏的  返回读写不正确的地址
//uint8 uart_buf[48];
#define N 32//31        //定义不要与页写字节数有整数关系,好测试页写功能
#define ROM_MAX 0x8000        //8192//0x2000        //c32-4096 c64-8192 c128-16384 c256-32768
uint16 IIC_test(void)
{
        uint16 Addr;
        uint8 i;

        Addr=0;
        do
        {
                for(i=0;i<N;i++)
                {
                        uart_buf[i]=(uint8)(Addr++);
                }
                WrToROM(uart_buf, Addr-N, N);
                WDT = ~WDT;       
        }
        while(Addr<ROM_MAX);
        Addr=0;
        do
        {
                RdFromROM(uart_buf, Addr, sizeof(uart_buf));       
                for(i=0;i<sizeof(uart_buf);i++)
                {
                        if(!(uart_buf[i]==(Addr%256)))
                        {
                                return Addr;
                        }
                        Addr++;
                }
                WDT = ~WDT;
        }
        while(Addr<ROM_MAX);
        return Addr;
}
以前测试时是IICrom是多大就ROM_MAX定义成多大,现在故意定义成0x8000,返回值还是还是0x8000。这表明24C64在典型应用下,溢出地址还是能够读写。

有什么办法能让它在地址超出范围时,不进行读写?

使用特权

评论回复
9
datouyuan|  楼主 | 2014-5-20 09:16 | 只看该作者


上图是AT24C64 AT24C32的datasheet中关于写的描述。
* = DON’T CARE bits 是不是不需要在意的意思,表示随便是什么数值都不影响功能?

假如这样,只靠软件识别型号好像是没办法了。

使用特权

评论回复
10
datouyuan|  楼主 | 2014-7-26 14:31 | 只看该作者
那时脑袋短路了,没想到。实际单靠软件还是很容易解决这个问题的。
1.地址0xffff、0x7fff、0x3fff、0x1fff、0x0fff的数据先备份
2.向上述5个地址写入互不相同的数据
3.再读出这5个地址,恢复数据备份
4.和写入的数进行比较,就可以知道IIC的型号了。

24c512数据全部相同。
24C256第1个数据不同。
24C64前面3个数据不同。



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:maowenyuan@126.com

31

主题

1088

帖子

9

粉丝