OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21133|回复: 28

AT24C256写不进去

[复制链接]
头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
发表于 2014-11-10 18:24:21 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11569
金钱
11569
注册时间
2014-4-1
在线时间
1320 小时
发表于 2014-11-10 18:24:22 | 显示全部楼层
---------------------------------
回复【12楼】DADONG:
---------------------------------

关于地址,说个道理,自己就可以总结出来:

操作存储器,不论读或写,都需要指明目的字节的地址;
不同容量,地址的位数不同。比如2402是256字节,需要8位地址;24C16是2048字节,需要11位地址;容量越大,地址位数越多。

地址靠的是两个字节来表示:DEVICE ADDRESS 和之后的 WORD ADDRESS。
DEVICE ADDRESS中的5位有固定用途,剩下3位可以作为地址位使用,和后面的WORD ADDRESS拼起来,最长11位。
容量在2048字节以内的芯片,11位地址就足够了。

那么,容量再大,怎么办?
只好再增加一个字节,一共 11 + 8 =19位。这样,容量大到512K,都可以照顾到。

道理上说,制定协议的时候,可以只增加1位、2位、3位等,同样能达到目的,
但协议就显得有点乱,用户程序的兼容性也不好。所以,厂家索性一次增加8位。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-10 19:39:40 | 显示全部楼层
一个数据也写不了?
单独写一个数据测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
 楼主| 发表于 2014-11-10 19:44:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-11 19:35:08 | 显示全部楼层
等我买个24C256试试。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

头像被屏蔽

243

主题

429

帖子

0

精华

禁止发言

积分
1067
金钱
1067
注册时间
2011-12-23
在线时间
17 小时
 楼主| 发表于 2014-11-11 19:58:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-16
在线时间
47 小时
发表于 2014-11-16 15:22:34 | 显示全部楼层
估计芯片定义没改。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2013-10-24
在线时间
2 小时
发表于 2015-5-20 14:01:14 | 显示全部楼层
好吧,等了好久,我也是AT24C64不能写,停在了芯片识别的地方了!芯片类型已经改了
Happy Everyday!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-5-21
在线时间
0 小时
发表于 2015-5-21 17:49:33 | 显示全部楼层
回复【7楼】jordanwys:
---------------------------------
你好,你的AT24C64可以用了吗
回复

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2014-7-14
在线时间
11 小时
发表于 2015-6-26 16:38:02 | 显示全部楼层
我也在用24C256楼主搞定了没有?期待原子哥的验证... ...
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-6-26 17:30:44 | 显示全部楼层
回复【9楼】DADONG:
---------------------------------
void IIC_Start(void)
{
SDA_OUT();
IIC_SDA = 1;
IIC_SCL = 1;
delay_us(4);
IIC_SDA = 0;
delay_us(4);
IIC_SCL = 0;
}

void IIC_Stop(void)
{
SDA_OUT();
IIC_SCL = 0;
IIC_SDA = 0;
delay_us(4);
IIC_SCL = 1;
IIC_SDA = 1;
delay_us(4);
}

uchar IIC_Wait_Ack(void)
{
uchar errtime=0;
SDA_IN();
IIC_SDA = 1;
delay_us(1);
IIC_SCL = 1;
delay_us(1);
while(READ_SDA)
{
errtime++;
if(errtime>250)
{
// IIC_Stop();
return 1;
}
}
IIC_SCL = 0;
return 0;
}

void IIC_Ack(void)
{
// IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 0;
delay_us(5);
IIC_SCL = 1;
delay_us(5);
IIC_SCL = 0;
delay_us(5);
}

void IIC_NAck(void)
{
// IIC_SCL = 0;
SDA_OUT();
IIC_SDA = 1;
delay_us(5);
IIC_SCL = 1;
delay_us(5);
IIC_SCL = 0;
delay_us(5);
}

void IIC_Send(uchar IICbyte)
{
uchar t=0;
SDA_OUT();
IIC_SCL = 0;
for(t=0;t<8;t++)
{
IIC_SDA = (IICbyte&0x80)>>7;
IICbyte <<= 1;
delay_us(2);
IIC_SCL = 1;
delay_us(2);
IIC_SCL = 0;
delay_us(2);
}
}

uchar IIC_Read(void)
{
uchar i,receive=0;
SDA_IN();
for(i=0;i<8;i++)
{
IIC_SCL = 0;
delay_us(2);
IIC_SCL = 1;
receive <<= 1;
if(READ_SDA)
receive++;
delay_us(1);
}
// if(!ack)
// IIC_NAck();
// else
// IIC_Ack();

return receive;
}

void Write_Onebyte(uint addr,uchar data)
{
IIC_Start();
IIC_Send(0xa0);
IIC_Wait_Ack();
IIC_Send(addr>>8);
IIC_Wait_Ack();
IIC_Send(addr%256);
IIC_Wait_Ack();
IIC_Send(data);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(5);              //???????±10ms?????????????ò??·¨????10ms???????±5ms???é
}

uchar Read_Onebyte(uint addr)
{
uchar temp = 0;
IIC_Start();
IIC_Send(0xa0);
IIC_Wait_Ack();
IIC_Send(addr/256);
// IIC_Send(addr>>8);
IIC_Wait_Ack();
IIC_Send(addr%256);
IIC_Wait_Ack();
IIC_Start();
IIC_Send(0xa1);
IIC_Wait_Ack();
temp = IIC_Read();
IIC_Stop();

return temp;
}

void Write_Longbytes(uint addr,uchar *table,uchar len)
{
uchar t=0;
IIC_Start();
IIC_Send(0xa0);
IIC_Wait_Ack();
IIC_Send(addr>>8);
IIC_Wait_Ack();
IIC_Send(addr%256);
IIC_Wait_Ack();

for(t=0;t<len;t++)
{
IIC_Send(table[t]);
IIC_Wait_Ack();
delay_us(1);
}
IIC_Stop();
delay_ms(8); 
}


这个在网上应该资料挺多的啊,上面是我AT24C512的关于IIC的函数,至于IO口根据自己硬件配置一下,程序在512可以使用,对于256、64等应该兼容>
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2014-7-14
在线时间
11 小时
发表于 2015-6-26 20:10:45 | 显示全部楼层
回复【10楼】龙之谷:
---------------------------------
谢谢了,我试试去,这个资料是比较多,但是都是鱼龙混杂的感觉,可能是看资料还比较少吧, 我想多研究下,然后搞个比较全面的文档出来
回复

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2014-7-14
在线时间
11 小时
发表于 2015-6-26 20:56:39 | 显示全部楼层
回复【10楼】龙之谷:
---------------------------------
我现在就是不是很清楚是怎么读写的,比如我要存一个123数据在固定的地址里面,读写的时候地址怎么写?
我在网上看到一个帖子,http://www.360doc.com/content/11/0921/11/3988347_150056232.shtml
感觉这个还不错,但是还是不够详细。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-6-27 00:31:42 | 显示全部楼层
回复【12楼】DADONG:
---------------------------------
片选--写地址--写数据,单纯写地址和写数据的过程是一样的,都是调用同一个子函数
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-6-27 00:33:34 | 显示全部楼层
回复【13楼】xuande:
---------------------------------
果然解疑老师级别,问题分析得够透彻
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2014-7-14
在线时间
11 小时
发表于 2015-6-29 14:11:00 | 显示全部楼层
回复【13楼】xuande:
---------------------------------
谢谢了哈,思路清晰好多!
回复

使用道具 举报

4

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2014-7-14
在线时间
11 小时
发表于 2015-6-29 14:11:21 | 显示全部楼层
回复【14楼】龙之谷:
---------------------------------
谢谢了哈
回复

使用道具 举报

22

主题

2254

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4486
金钱
4486
注册时间
2013-4-22
在线时间
337 小时
发表于 2015-6-29 14:33:56 | 显示全部楼层
自己一步一步调试吧,这个又不难,我们用的时候也没出现什么问题
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-10
在线时间
0 小时
发表于 2015-7-10 14:17:32 | 显示全部楼层
我的AT24C256只能读写一个,页读写就只能读写第一个成功而已:代码如下:void I2C_Read_AT24C64(uint WAddrH,uint WAddrL,uint RNum){ //??WAddrH,WAddrL???×???·??????????RNum??×???
uchar Cnt; //????×??à32??×???
uchar ACK;
uchar recvie_count=0;
I2C_SDA_OUT(); 
I2C_SDA_IN();
  IIC_Start(); //?????¨??
  do{
  IIC_Send(0xa0);//AT24C64???????·
             ACK = IIC_Wait_Ack();
        }while(ACK);
do{
IIC_Send(WAddrH); //???????·????5??
     ACK = IIC_Wait_Ack();
}while(ACK);
do{
IIC_Send(WAddrL); //???????·????8??
     ACK = IIC_Wait_Ack();
}while(ACK);
IIC_Start(); //?????????¨??
do{
IIC_Send(0xa1); //AT24C64???????·
     ACK = IIC_Wait_Ack();
}while(ACK);
for(Cnt = 0;Cnt < RNum;Cnt ++){ //???·????RNum??×???

RD24C64[Cnt]=IIC_Read();
recvie_count=RD24C64[Cnt];
printf("??????????????\r\n");
printf("%c\r\n",recvie_count);
if(Cnt != RNum - 1)
I2C_ACK_Send(0);
// IIC_Ack();
}
I2C_ACK_Send(1); //????×??ó????×??????????ó??·?????
// IIC_NAck();
IIC_Stop(); //?¨???á??
// return 0;
}
回复

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-26
在线时间
29 小时
发表于 2016-8-21 16:23:35 | 显示全部楼层
你知道
IIC_Send_Byte(ReadAddr%256);   //发送低地址
代表什么意思吗?

为什么发送低地址要用上求余???
360反馈意见截图16390410569484.jpg
回复

使用道具 举报

20

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2016-9-26
在线时间
59 小时
发表于 2016-10-5 08:55:56 | 显示全部楼层
zzsj1990 发表于 2016-8-21 16:23
你知道
IIC_Send_Byte(ReadAddr%256);   //发送低地址
代表什么意思吗?

假如ReadAddr这个地址位高于8位的话,除以256,也就是2的8次方,剩下的余数自然就是低地址了。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2017-5-28
在线时间
4 小时
发表于 2017-5-28 23:22:36 | 显示全部楼层
楼主能发解决后的代码上来吗?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-6-21
在线时间
2 小时
发表于 2017-6-21 14:01:27 | 显示全部楼层
问题解决了吗 ,我的也是这个问题   
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2017-3-8
在线时间
44 小时
发表于 2017-6-22 22:55:33 来自手机 | 显示全部楼层
I2C脚初始化的时候,SCL设为PP,SDA设为OD
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-1-19
在线时间
1 小时
发表于 2017-10-17 02:06:25 | 显示全部楼层
这个IIC例程有点挑芯片:ATLML原厂芯片AT24C02B可以正常读写,如果换成ATLML原厂芯片AT24C02C,就不能读写成功了,请原子看一下是什么问题,谢谢了~
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2019-5-8
在线时间
1 小时
发表于 2019-5-8 19:11:36 | 显示全部楼层
楼上正解啊,原子的例程I2C脚初始化的时候,将SCL和SDA初始化为PP了,怎么读写都失败,之后将SCL设为PP,SDA设为OD后,验证OK
回复

使用道具 举报

17

主题

140

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5957
金钱
5957
注册时间
2018-7-24
在线时间
2237 小时
发表于 2019-5-8 19:49:36 来自手机 | 显示全部楼层
我用原子哥的程序读写我的24c128可以的
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2020-5-6
在线时间
19 小时
发表于 2021-6-1 21:23:23 | 显示全部楼层
查询无结果 发表于 2019-5-8 19:49
我用原子哥的程序读写我的24c128可以的

你号的,代码是改的哪里
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2020-7-29
在线时间
7 小时
发表于 2022-1-25 09:53:14 | 显示全部楼层
我用的是stm32fC8 芯片 将SDA SCL 都配置成开漏输出就行了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 07:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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