OpenEdv-开源电子网

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

用24c512来做eeprom,参考原子哥24c02来修改的,读不到数据怎么回事??

[复制链接]

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
发表于 2015-3-3 10:48:52 | 显示全部楼层 |阅读模式
5金钱
用的pb6、7,这段代码应该没问题
#define SDA_IN()  {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=0x80000000;}
#define SDA_OUT() {GPIOB->CRL&=0XFFFF0FFF;GPIOB->CRL|=0X30000000;}

//IO操作函数  
#define IIC_SCL    Bout(6) //SCL
#define IIC_SDA    Bout(7) //SDA  
#define READ_SDA   PBin(7)  //输入SDA 


#define EE_TYPE AT24C512这里改成了512

然后下面这段,我把255改成了65535,是不是有问题?
u8 AT24CXX_Check(void)
{
u8 temp;
temp=AT24CXX_ReadOneByte(65535);//避免每次开机都写AT24CXX   
if(temp==0X55)return 0;   
else//排除第一次初始化的情况
{
AT24CXX_WriteOneByte(65535,0X55);
   temp=AT24CXX_ReadOneByte(65535);  
if(temp==0X55)return 0;
}
return 1;  
}

目前的情况是读数据是temp一直等于0,也就是说READ_SDA在读数据过程中一直为低,弄不明白?
还有,以下这段代码怎么理解?是否需要修改?
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{  
u8 temp=0;        
    IIC_Start();  
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);   //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
// IIC_Wait_Ack();  
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据  

IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
IIC_Wait_Ack();    
IIC_Start();     
IIC_Send_Byte(0XA1);           //进入接收模式   
IIC_Wait_Ack();  
    temp=IIC_Read_Byte(0);   
    IIC_Stop();//产生一个停止条件    
return temp;
}


最佳答案

查看完整内容[请看2#楼]

回复【7楼】fangchenyi: --------------------------------- 注意下你的 IIC器件地址   焊接问题    器件型号
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-3-3 10:48:53 | 显示全部楼层
回复【7楼】fangchenyi:
---------------------------------
注意下你的 IIC器件地址   焊接问题    器件型号
学无止境
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 10:48:53 | 显示全部楼层
问题已找到。。
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-3-3 10:51:21 | 显示全部楼层
楼主   你的移植也太随便了。。

还是潜心打好基础,再弄别的吧 

又要被喷了
学无止境
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12028
金钱
12028
注册时间
2013-3-8
在线时间
1280 小时
发表于 2015-3-3 10:51:27 | 显示全部楼层
理论上也可以读写24c512

I2C.rar

3.28 KB, 下载次数: 1731

回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 10:56:16 | 显示全部楼层
回复【2楼】jermy_z:
----------------------------
时间仓促啊,能拿来用最好了。。
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 10:56:54 | 显示全部楼层
回复【3楼】augustedward:
---------------------------------
这个是用的硬件iic吧,感谢分享。
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-3-3 10:57:34 | 显示全部楼层
回复【4楼】fangchenyi:
---------------------------------
学无止境
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 10:59:58 | 显示全部楼层
回复【6楼】jermy_z:
---------------------------------
spi确实没用过。。还请前辈指点一二啊,就24c512这一块来说,我该如何入手?
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-3-3 11:01:13 | 显示全部楼层
回复【7楼】fangchenyi:
---------------------------------
不是SPI啊   这个软件模拟IIC的  ,理论上原子的程序已经适配到C512的   你是直接把IC焊上去的 ,还是自己做板的?
学无止境
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2015-3-3 11:06:41 | 显示全部楼层
回复【7楼】fangchenyi:
---------------------------------
去看了下代码  原子的没有适配到512的    不过应该也差不多了,下面的你可能得重新配下试试,不行的话,网上搜示例吧

#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64     8191
#define AT24C128 16383
#define AT24C256 32767
学无止境
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 11:06:51 | 显示全部楼层
回复【9楼】jermy_z:
---------------------------------
板子是硬件工程师做的,焊上了24c512,个人感觉是iic器件的地址问题,a0、a1、a2都接地了,下面这段代码还没看懂,前辈给指个方向就好了,如何入手。
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{   
u8 temp=0;           
    IIC_Start();  
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);    //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
// IIC_Wait_Ack();   
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据  

IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
IIC_Wait_Ack();     
IIC_Start();      
IIC_Send_Byte(0XA1);           //进入接收模式    
IIC_Wait_Ack();  
    temp=IIC_Read_Byte(0);    
    IIC_Stop();//产生一个停止条件     
return temp;
}
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-3-3 11:07:40 | 显示全部楼层
回复【10楼】jermy_z:

回复

使用道具 举报

18

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2015-1-16
在线时间
28 小时
发表于 2015-3-3 14:09:45 | 显示全部楼层
回复【13楼】fangchenyi:
---------------------------------
和我当初一样,就是这一部分的问题,不过我是把GPIOB->CRL|=0x8FFFFFFF,改为GPIOB->CRL|=0x80000000 就可以了
回复

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2015-12-9 16:09:00 | 显示全部楼层
回复【14楼】Fong0716:
---------------------------------
回复

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2015-12-9 16:10:13 | 显示全部楼层
回复【13楼】fangchenyi:
---------------------------------
AT24C512代码还有吗  我也是例程改的 读出来是FF
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-12-22 09:45:48 | 显示全部楼层
回复【16楼】freewayflyer:SDA、SCL配置不出错就没问题,文件见楼下
---------------------------------
#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0x80000000;} 
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=0X30000000;}
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-12-22 09:47:22 | 显示全部楼层
24c512驱动--------------------------------

24c512.rar

4.34 KB, 下载次数: 1529

回复

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2015-12-22 15:06:27 | 显示全部楼层
回复【18楼】fangchenyi:
---------------------------------
我可以保证配置没错,换成AT24C08就正常 AT24c512就不行
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2015-12-24 15:36:04 | 显示全部楼层
回复【19楼】freewayflyer:
---------------------------------
17楼代码能用的
回复

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2015-12-24 16:01:23 | 显示全部楼层
回复【20楼】fangchenyi:
---------------------------------
不行
回复

使用道具 举报

0

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2014-12-13
在线时间
89 小时
发表于 2016-1-1 23:41:12 | 显示全部楼层
24c256经测试改动三个地方,就可以用
1、24cxx.h 里面替换 #define EE_TYPE AT24C256
2、//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);//发送高地址
        //        IIC_Wait_Ack();        //经测试使用24c256此句必须屏蔽         
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据
3、//检查AT24CXX是否正常
//这里用了24XX的最后一个地址(32767)来存储标志字.
//如果用其他24C系列,这个地址要修改
//返回1:检测失败
//返回0:检测成功
u8 AT24CXX_Check(void)
{
        u8 temp;
        temp=AT24CXX_ReadOneByte(32767);//避免每次开机都写AT24CXX                          
        if(temp==0X55)return 0;                  
        else//排除第一次初始化的情况
        {
                AT24CXX_WriteOneByte(32767,0X55);
            temp=AT24CXX_ReadOneByte(32767);          
                if(temp==0X55)return 0;
        }
        return 1;                                                                                          
}
其余代码无需改动,另外SCL SDA 记得改哦
回复

使用道具 举报

31

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2939
金钱
2939
注册时间
2015-12-30
在线时间
358 小时
发表于 2016-1-18 17:14:10 | 显示全部楼层
fangchenyi 发表于 2015-12-22 09:47
24c512驱动--------------------------------

兄弟 ,用的例程,我怎么检测的时候,一直检测不到呢,temp一直为0xFF,求帮助啊
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2016-1-19 09:27:31 | 显示全部楼层
freewayflyer 发表于 2015-12-24 16:01
回复【20楼】fangchenyi:
---------------------------------
不行

代码我用到项目中的,你找找硬件问题。
回复

使用道具 举报

9

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-2-12
在线时间
9 小时
 楼主| 发表于 2016-1-19 09:29:25 | 显示全部楼层
lophost 发表于 2016-1-18 17:14
兄弟 ,用的例程,我怎么检测的时候,一直检测不到呢,temp一直为0xFF,求帮助啊

SCL SDA仔细看看有没有修改对
回复

使用道具 举报

69

主题

269

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2014-7-4
在线时间
237 小时
发表于 2016-1-19 13:14:55 | 显示全部楼层
fangchenyi 发表于 2016-1-19 09:27
代码我用到项目中的,你找找硬件问题。

同样的电路测试at24c08没问题,电路应该没问题了
回复

使用道具 举报

31

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2939
金钱
2939
注册时间
2015-12-30
在线时间
358 小时
发表于 2016-1-19 16:09:02 | 显示全部楼层
本帖最后由 lophost 于 2016-1-19 16:10 编辑
freewayflyer 发表于 2016-1-19 13:14
同样的电路测试at24c08没问题,电路应该没问题了

这个代码我刚验证过了,没有问题,可以使用,我刚开始测试的时候也一直不行,最终找到是我们电路这边他们把A1,A0接的高电平的原因,总之代码是没有问题的,不行的话,你可以用示波器看看时序
回复

使用道具 举报

31

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2939
金钱
2939
注册时间
2015-12-30
在线时间
358 小时
发表于 2016-1-19 16:13:16 | 显示全部楼层
本帖最后由 lophost 于 2016-1-19 16:14 编辑
fangchenyi 发表于 2016-1-19 09:29
SCL SDA仔细看看有没有修改对

已解决。我们电路这边把A1,A0接的高电平了,刚好可以给以后的兄弟们,检查问题多一个检测点,多谢了
回复

使用道具 举报

3

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-5-22
在线时间
21 小时
发表于 2016-5-22 12:52:21 | 显示全部楼层
lophost 发表于 2016-1-19 16:13
已解决。我们电路这边把A1,A0接的高电平了,刚好可以给以后的兄弟们,检查问题多一个检测点,多谢了

怎么解决呀,我也是这个问题
回复

使用道具 举报

31

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2939
金钱
2939
注册时间
2015-12-30
在线时间
358 小时
发表于 2016-5-23 08:37:31 | 显示全部楼层
BigLion 发表于 2016-5-22 12:52
怎么解决呀,我也是这个问题

看看你的硬件电路,A1,A0接的是高电平还是低电平
回复

使用道具 举报

3

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2016-5-22
在线时间
21 小时
发表于 2016-5-24 10:20:04 | 显示全部楼层
lophost 发表于 2016-5-23 08:37
看看你的硬件电路,A1,A0接的是高电平还是低电平

焊在32板子上的,都是低电平然后还是0xff,唉,麻烦了大兄弟
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2019-2-16
在线时间
1 小时
发表于 2020-6-7 08:52:26 | 显示全部楼层
fangchenyi 发表于 2015-3-3 10:48
问题已找到。。
#define&nbsp;SDA_IN()&nbsp;&nbsp;{GPIOB-&gt;CRL&=0X0FFFFFFF;GPIOB-&gt;CRL|=0x80000000;} ...

EMMM,请问楼主,PB7做SDA不应该是0XF0FFFFFF;08000000吗?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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