2 heart33k heart33k 于 2017.01.17 00:15 提问

AT24Cxx 读写问题 写出现不明白的问题

我用的是AT24C512来存储数据,但写地址的时候,写完16位的地址,然后再写一个8位数据;
在读出来的时候,读到的是高8位地址所指向的地址的数据,且数据等于地址的低8位,怎么也读不到16位地址所指向地址的数据。
//向指定地址写一个字节数据
Write_IIC(0x00,0x00,0x10); //向0x0000地址写数据0x10
Delay(5);
Write_IIC(0x01,0x01,0x11); //向0x0101地址写数据0x11
Delay(5);
Write_IIC(0x02,0x02,0x12); //向0x0202地址写数据0x12
Delay(5);
Write_IIC(0x03,0x03,0x13); //向0x0303地址写数据0x13
Delay(5);
Write_IIC(0x04,0x04,0x14); //向0x0404地址写数据0x14
Delay(5);
//读指定地址的数据
Send_Data(Read_ICC(0x00,0x00)); //读0x0000地址的数据
Delay(1);
Send_Data(Read_ICC(0x01,0x01)); //读0x0101地址的数据

Delay(1);
Send_Data(Read_ICC(0x02,0x02)); //读0x0202地址的数据
Delay(1);
Send_Data(Read_ICC(0x03,0x03)); //读0x0303地址的数据
Delay(1);
Send_Data(Read_ICC(0x04,0x04)); //读0x0404地址的数据
Delay(1);

我是从串口接收数据,读出来的数据为:
01 02 03 04 14
证明只有最后一次写,才把0x14写到0x0404里面;或者最后一次是往地址0x04写了一次0x04,然后再写0x14,0x14把0x04覆盖了。
第一次往0x0000写0x10不成功,第二次把地址的低8位0x01写到高8位地址0x01里去了,第三次,第四次与第二次一样。
为什么会这样

uchar Read_ICC(uchar ADD_H,uchar ADD_L)
{
uchar dat;
I2C_Start();
Send_Byte(0xa0); //发器件地址,并通知准备发送地址
Response(); //应答
Send_Byte(ADD_H); //发器件内部存储器地址高位
Response(); //应答
Send_Byte(ADD_L); //发器件内部存储器地址低位
Response(); //应答
I2C_Start();
Send_Byte(0xa1); //发器件地址,并通知准备读取数据
Response(); //应答
dat=Rcv_Byte(); //读取数据
I2C_Stop(); //停止I2C总线
return (dat);

}

void Write_ICC(uchar ADD_H,uchar ADD_L,uchar dat)
{
I2C_Start();
Send_Byte(0xa0); //发器件地址,并通知准备发送地址,要对应芯片地址
Response(); //应答
Send_Byte(ADD_H); //发器件内部存储器地址高位
Response(); //应答
Send_Byte(ADD_L); //发器件内部存储器地址低位
Response(); //应答
Send_Byte(dat); //写入数据
Response(); //应答
I2C_Stop(); //停止I2C总线
}

3个回答

JerryWu74
JerryWu74   2017.01.17 08:56

AT24C512是8位的存储器, 它的16位地址并不是常规16位存储器的地址.
你注意看其规格书的第3页: Memory Organization的描述. 它的16位地址包含2个部分,高9位是页地址, 低7位是页内偏址. 共512页,每页存储128字节.

heart33k
heart33k   2017.01.17 13:31

图片说明

在以单个字节写的时候,地址是两个8位数。还有就是我在程序里,写的地址跟读的地址是一样的,应该说就是页地址一样,页内地址也一样,那为什么数据就变以了。
这个程序之前用没问题,就在这次使用就出来这个问题了,说明:硬件一样,器件是同一批货,代码也是之前的代码,没修改过。太奇怪了,找了好久没找到原因。

heart33k
heart33k   2017.01.18 14:28

问题解决了,换了新的AT24C512芯片就好了。应该是器件放置时间长了,就出问题了。
刚开始测试出问题的是放置了两年的器件,现在拿来用,就不能用16位地址进行读写,只能用8位
新的就没问题

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
AT24CXX(器件) 和 IIC总线(从畅学网复制的)
6、AT24CXX(器件) 和 IIC总线 本讲解不涉及详细IIC通信,重点在于AT24C系列器件的介绍 和 IIC的通信流程,不喜勿喷, 望请修正。。。。。GO 图AT24C01/02/04/08/16的外形级封装和引脚说明 AT24C系列为美国ATMEL公司推出的串行COMS型E2PROM,是典型的串行通信E2PROM 。 AT24CXX是IIC总线串行器件,具有工
AT24CXX系列程序
存储空间分配 AT24C02A,2K 串行 EEPROM:共 32 页,每页 8 字节,寻址字需 8 位。 AT24C04A,4K 串行 EEPROM:共 32 页,每页 16 字节,寻址字需 9 位。 AT24C08A,8K 串行 EEPROM:共 64 页,每页 16 字节,寻址字需 10 位。 AT24C16A,16K 串行 EEPROM:共 128 页,每页 16 字节,寻址字需
AT24Cxx芯片读写--IIC总线
型号               容量               器件寻址字节(8位)       一次装载字节数  AT24C01        128×8        1010A2A1A0 R/W                 8 AT24C02       256×8         1010A2A1A0 R/W                 8  AT24C04      
STM32 AT24CXX代码
/***************  ****************  Time:2017.1.4  Name:MichaelBeechan  Dress:Chongqing university of science and technology **************** ****************/ #ifndef _AT24cxx_H #define _AT24
读写进程同步问题
std::atomic readers; std::mutex write; // One write, no reads. void write_fun() { write.lock();// We lock the resource while(readers > 0){}// We wait till everyone finishes read. // DO WR
多进程之读写并发问题
// Reader_Writer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using namespace std; HANDLE gEventNoReader=0,gEventWriting=0; int gReaderCount=0; const int READER_NUM = 5;
读写优先问题
关于读写问题的读优先代码如下:Mutex WR =1; Mutex CountMutex =1; int count=0; //首先编写write的大概框架; void write(){ //由于读写以及写写之间需要互斥,所以使用WR隔离; //保证了写与写以及读与写之间的互斥; P(WR); write operation; V(WR); } // read的大概
代码来解决多进程/线程同时读写一个文件的问题。
大家都知道,PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用。 function T_put($filename,$string){ //追加方式打开 $fp
servlet路径详解(转)
关键字: servlet路径详解 我同学小鲁对于 web.xml中配置的servlet url-pattern和jsp页面请求的action地址之间的关系搞不明白,我经过实验 总结如下: 假设我在com.servlet.test包下有一个 HelloServlet的Servlet package com.servlet.test;
VS2017,解决MFC无法插入类的simple文件
解决出现缺少默认js文件所带来的问题。。。。。。。。。。。。。。。。。。。。。。。不明白私信我