OpenEdv-开源电子网

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

原子的模拟IIC驱动24c64读取数据一直是0xFF

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-27
在线时间
0 小时
发表于 2013-8-27 08:38:28 | 显示全部楼层 |阅读模式
 我移植正点原子的模拟IIC程序之后,根据我的硬件做了如下修改:
1、修改头文件的宏定义为“#define EE_TYPE AT24C64”驱动24c64,
2、配置PA0为SCL,  A1为SDA.
3、修改初始化以及头文件里面的输入输出为PA0和PA1.

在main()中依然添加此函数:
u8 AT24CXX_Check(void)
{
u8 temp;
temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX    
if(temp==0X55)return 0;    
else//排除第一次初始化的情况
{
AT24CXX_WriteOneByte(255,0X55);
    temp=AT24CXX_ReadOneByte(255);   
if(temp==0X55)return 0;
}
return 1;   
}

我仿真进入此函数之后,每次读出来的temp=0xFF.
一直很郁闷,不知道问题到底出在哪里?请帮忙分析一下。谢谢。 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-4-11
在线时间
0 小时
发表于 2014-5-30 18:44:50 | 显示全部楼层
回复【8楼】驯马师:
---------------------------------
请问一下 我也出现了temp=0xff 的情况 请问多了那个ACK
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-4 15:25:25 | 显示全部楼层
[mw_shl_code=c,true]//在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);//发送高地址 }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256); //发送低地址 IIC_Wait_Ack(); IIC_Start(); if(EE_TYPE>AT24C16)IIC_Send_Byte(0XA1); //进入接收模式 else IIC_Send_Byte(0XA1+((ReadAddr/256)<<1)); //进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop();//产生一个停止条件 return temp; } //在AT24CXX指定地址写入一个数据 //WriteAddr :写入数据的目的地址 //DataToWrite:要写入的数据 void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr>>8);//发送高地址 }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //发送低地址 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //发送字节 IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10); }[/mw_shl_code]
这是最新代码,没有多ACK的
多的是在>24C16这个if的最后,会有个ACK,实际是不需要的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2013-8-27 08:59:49 | 显示全部楼层
回复【楼主位】驯马师:
---------------------------------
你还没有修改完毕!!有个.h文件。。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-27
在线时间
0 小时
 楼主| 发表于 2013-8-27 09:39:48 | 显示全部楼层
回复【2楼】冰是睡着的水:
---------------------------------
已经修改了,如下:还是不可以。
//IO方向设置
#define SDA_IN()  {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=0X00000080;}
#define SDA_OUT() {GPIOA->CRL&=0XFFFFFF0F;GPIOA->CRL|=0X00000030;}

//IO操作函数  
#define IIC_SCL    Aout(0) //SCL
#define IIC_SDA    Aout(1) //SDA  
#define READ_SDA   Ain(1)  //输入SDA
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2013-8-27 09:49:59 | 显示全部楼层
回复【3楼】驯马师:
---------------------------------
原子的驱动可以支持64的。。你看看是不是硬件的问题。
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-27 10:37:21 | 显示全部楼层
看你用的是不是最新的,老版本的读写多了一个ACK,要去掉。新版本的去掉了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-27
在线时间
0 小时
 楼主| 发表于 2013-8-27 10:52:06 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//IIC驱动 代码    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/9
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved


这个应该是最新的吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-27 11:49:42 | 显示全部楼层
看这两个函数:
//在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);//发送高地址     
}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;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr:写入数据的目的地址    
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{              
    IIC_Start();  
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);     //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址   
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   
IIC_Wait_Ack();    
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
IIC_Wait_Ack();          
IIC_Send_Byte(DataToWrite);     //发送字节    
IIC_Wait_Ack();           
    IIC_Stop();//产生一个停止条件 
delay_ms(10);  
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-8-27
在线时间
0 小时
 楼主| 发表于 2013-8-27 12:29:34 | 显示全部楼层
回复【7楼】正点原子:
----------------------------
问题已经解决,谢谢原子哥。就是多了一个ACK。
回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-10-16 14:27:20 | 显示全部楼层
昨天读写还没有问题,程序没有变今天就不行了,怪事
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-10-24
在线时间
0 小时
发表于 2013-10-24 21:29:46 | 显示全部楼层
回复【8楼】驯马师:
---------------------------------
请问一下,您是删除了哪个ACK的,您修改后的程序和原子哥提供的是一样的么?谢谢。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-10-24
在线时间
0 小时
发表于 2013-10-25 09:57:30 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
请问一下,我用的就是这个程序,但还是读出的都是0xFF!谢谢
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-10-25 13:35:40 | 显示全部楼层
回复【11楼】Vincent_t:
---------------------------------
一般你对着datasheet来写的话都可以啊
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-3-17
在线时间
0 小时
发表于 2014-3-17 16:50:43 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
很给力
这是个学习stm32的好地方
回复 支持 反对

使用道具 举报

25

主题

80

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2014-5-14
在线时间
6 小时
发表于 2014-6-19 20:22:36 | 显示全部楼层
我的也是,弄了好长时间,还是没明白怎么回事
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2014-8-4 11:04:50 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------原子哥,旧的版本哪个地方多了一个ACK啊,我用的 就是你的哪个miniStm32的板子
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2014-8-4 11:05:39 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
在线等你的回复,急求解决方案,已经弄了好几天了,读出来的全是0XFF
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2014-8-4 15:10:08 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
原子哥,我去下载了最新的 ministm32的资料,也进行了对比,没有发现什么地方多了一个ACK呀?能不能指教指教我一下,倒是地在什么地方多了一个ACK呀,我到现在读出来的IIC的数据还是0XFF呢。。。。。。在线急等,,谢谢原子哥啦
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-8-4
在线时间
1 小时
发表于 2014-8-4 15:29:28 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
原子哥解释好清晰,我得代码也是直接修改你的,可是不知道为什么读出来的都是0XFF,原子哥,请教你一下,可能出现问题在哪里?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-8-4 19:15:33 | 显示全部楼层
回复【21楼】小罗洛克:
---------------------------------
这就难说了
可能硬件电路问题?软件问题?芯片问题?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
发表于 2014-10-15 16:34:41 | 显示全部楼层
我的也是这样的问题啊,读出来的是0XFF,这是怎么回事????
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-1-8 12:25:33 | 显示全部楼层
用AT24C256也是读出的0XFF,用原子的程序,原来就是多了一个ACK
谢谢!
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

31

主题

108

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2919
金钱
2919
注册时间
2015-12-30
在线时间
356 小时
发表于 2016-1-16 15:05:29 | 显示全部楼层
lison0103 发表于 2016-1-8 12:25
用AT24C256也是读出的0XFF,用原子的程序,原来就是多了一个ACK
谢谢!

我的也是0xFF,也没多ACK()呀,怎么回事
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-3-30
在线时间
5 小时
发表于 2016-3-30 10:24:26 | 显示全部楼层
小罗洛克 发表于 2014-8-4 15:29
回复【20楼】正点原子:
---------------------------------
原子哥解释好清晰,我得代码也是直接修改你的, ...

解决了么 其实没有写进去数据 默认的是0xFF 只要在写每一个数据后面加一个几毫秒的延迟就没有问题了
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-3-30
在线时间
5 小时
发表于 2016-3-30 10:25:11 | 显示全部楼层
正点原子 发表于 2014-8-4 19:15
回复【21楼】小罗洛克:
---------------------------------
这就难说了
可能硬件电路问题?软件问题?芯片 ...

软件问题 写一个比特的这个没写完一个需要一个延迟
回复 支持 反对

使用道具 举报

4

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2013-11-21
在线时间
42 小时
发表于 2016-4-4 09:48:40 | 显示全部楼层
正点原子 发表于 2014-8-4 15:25
[mw_shl_code=c,true]//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到 ...

谢谢原子哥,,,
回复 支持 反对

使用道具 举报

11

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
124
金钱
124
注册时间
2016-4-3
在线时间
41 小时
发表于 2016-4-18 20:57:29 | 显示全部楼层
temp=AT24CXX_ReadOneByte(255);//避免每次开机都写AT24CXX
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-6-30
在线时间
0 小时
发表于 2016-6-30 09:56:30 | 显示全部楼层
读字节这里都出一个应答,如何型号大于at24c16
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-8-2
在线时间
0 小时
发表于 2016-8-2 20:41:10 | 显示全部楼层
lison0103 发表于 2016-1-8 12:25
用AT24C256也是读出的0XFF,用原子的程序,原来就是多了一个ACK
谢谢!

你好!我也遇到这个问题,是多了哪一个ACK??谢谢!
回复 支持 反对

使用道具 举报

lijianfighting 该用户已被删除
发表于 2016-8-9 12:40:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2016-8-9 13:35:54 | 显示全部楼层
找不到的人,就是理论都还没弄懂。  不然分分钟就看到了
自己选择的路,成家前走完。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2018-12-10
在线时间
2 小时
发表于 2018-12-10 17:33:19 | 显示全部楼层
正点原子 发表于 2014-8-4 15:25
[mw_shl_code=c,true]//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到 ...

就是因为这个地方多了一个应答信号,后面的时序跟不上了,就会出现读错误。浪费了我这么长时间,唉。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-7-4
在线时间
12 小时
发表于 2019-7-4 19:35:23 | 显示全部楼层
666,学到了
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2019-2-20
在线时间
22 小时
发表于 2019-11-22 23:09:47 | 显示全部楼层
我的板子上的芯片是这个,照片拍的不是很清,芯片上的丝印是ATMLH440 64DM,不知道是不是AT24C64,一直检测不到,程序用的原子个的最新版的IIC例程,有哪位认识这个芯片指点一下迷津,不胜感激

IIC芯片

IIC芯片
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 10:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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