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

[复制链接]
3629|9
 楼主| datouyuan 发表于 2014-5-18 12:00 | 显示全部楼层 |阅读模式
24c64的地址范围是0x0~0x1fff。
假如我写地址为0xffff,有人说还是会写如24c64,我现在没条件测试,请大侠讲解一下。
假如会写入,如何不让写入?
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应该不会给出应答,主机检查不到应答可判断为出错。
 楼主| datouyuan 发表于 2014-5-20 00:21 | 显示全部楼层
因为产品有可能安装24C64、24C128、24C256、24C512这几种型号,
想要根据IIC的存储容量自动识别IIC的型号。

uint8 testROM(void)
{

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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;
}
 楼主| datouyuan 发表于 2014-5-20 00:25 | 显示全部楼层
上面的是测试函数。
返回8,表示IC为24c512
返回5,表示IC为24c64

可实测,安装的是24c64,返回值确是8.
 楼主| datouyuan 发表于 2014-5-20 00:49 | 显示全部楼层
  1. //IIC测试程序
  2. //IIC是好的  返回ROM_MAX
  3. //IIC是坏的  返回读写不正确的地址
  4. //uint8 uart_buf[48];
  5. #define N 32//31        //定义不要与页写字节数有整数关系,好测试页写功能
  6. #define ROM_MAX 0x8000        //8192//0x2000        //c32-4096 c64-8192 c128-16384 c256-32768
  7. uint16 IIC_test(void)
  8. {
  9.         uint16 Addr;
  10.         uint8 i;

  11.         Addr=0;
  12.         do
  13.         {
  14.                 for(i=0;i<N;i++)
  15.                 {
  16.                         uart_buf[i]=(uint8)(Addr++);
  17.                 }
  18.                 WrToROM(uart_buf, Addr-N, N);
  19.                 WDT = ~WDT;       
  20.         }
  21.         while(Addr<ROM_MAX);
  22.         Addr=0;
  23.         do
  24.         {
  25.                 RdFromROM(uart_buf, Addr, sizeof(uart_buf));       
  26.                 for(i=0;i<sizeof(uart_buf);i++)
  27.                 {
  28.                         if(!(uart_buf[i]==(Addr%256)))
  29.                         {
  30.                                 return Addr;
  31.                         }
  32.                         Addr++;
  33.                 }
  34.                 WDT = ~WDT;
  35.         }
  36.         while(Addr<ROM_MAX);
  37.         return Addr;
  38. }
以前测试时是IICrom是多大就ROM_MAX定义成多大,现在故意定义成0x8000,返回值还是还是0x8000。这表明24C64在典型应用下,溢出地址还是能够读写。

有什么办法能让它在地址超出范围时,不进行读写?
 楼主| datouyuan 发表于 2014-5-20 09:16 | 显示全部楼层


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部