OpenEdv-开源电子网

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

模拟IIC接收不到应答

[复制链接]

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
发表于 2013-12-26 17:08:08 | 显示全部楼层 |阅读模式
我用例程里的模拟IIC程序去和我自己板子上的芯片(PCA9534a)通信,在发了从机地址后接收应答失败,每次都失败。下面写寄存器的一个程序,大家帮我找一下问题

#define    CA9534     0x70     
#define   Cmd_Config    0x03    
#define   Cmd_PolarInv    0x02    
#define   Cmd_OutPut    0x01    
#define   Cmd_InPut     0x00    

void Write_config(u8 ConfigData)
{
u8 temp;
        IIC_Start();
IIC_Send_Byte(PCA9534);   
temp = IIC_Wait_Ack();
IIC_Send_Byte(Cmd_Config);
        IIC_Wait_Ack();
IIC_Send_Byte(ConfigData);
IIC_Wait_Ack();
IIC_Stop();
}


还有在  IIC_Wait_Ack()函数中有一段程序不是非常明白
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();     
IIC_SDA=1;delay_us(1);   
IIC_SCL=1;delay_us(1);  
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;   
return 0;  

SDA设置为输入之后还能给SDA赋值呢,SDA线不是本来就上拉的吗?
我用示波器看了,SDA上从地址数据发送都是正确的,但就是没有收到应答。还有我从开发板连出来的的线可能有50cm-80cm长,这样会影响IIC通信吗?芯片供电 从地址都没问题的,难道是芯片坏了,但是芯片上电默认值还是正确的啊
以前只在LPC上用过IIC,模拟IIC还是第一次用呢



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-27 21:53:07 | 显示全部楼层
回复【9楼】XavierZhang:
---------------------------------
1.器件ID就是他出厂的型号,存在器件寄存器里可以读出来,芯片手册里有专门的介绍,每个芯片读取时序都不一样,以此可以判断这个东东是不是好的或者有没有就位。
2.但是你这里都没应答说明IIC没搜到从设备,检查硬件吧。楼主慢慢调,有耐心。。
回复 支持 1 反对 0

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-26 20:40:16 | 显示全部楼层
1.你这段程序是没问题,你仔细翻下数据手册,几个Command宏有没有搞错?你IIC模拟代码直接用的原子的吧,那可能硬件问题,你尝试读一下器件ID。
2.主机在接收数据(包括接收应答)的时候SDA要释放!IIC_SDA=1;delay_us(1);就是释放总线的意思,应答信号也是通过SDA传送的。IIC就一条数据线,无论主机还是从机控制完总线或转为接收时及时释放SDA,养成好习惯。
回复 支持 1 反对 0

使用道具 举报

38

主题

2061

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3273
金钱
3273
注册时间
2012-1-16
在线时间
37 小时
发表于 2013-12-26 18:30:07 | 显示全部楼层
没用过,帮顶
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

8

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2013-12-21
在线时间
3 小时
发表于 2013-12-26 19:57:32 | 显示全部楼层
你在确认下你的配置,你线缆应该没影响的,芯片损坏的概率还是很小的。不过得记住:应答分为主器件应答和从器件应答。主器件写数据后要检查从器件是否正确应答,主器件读数据后,要发送应答信号给从器件的;多字节读完之后,要发送非应答信号给从器件,表示读结束了。总之一句话:谁接收数据,谁确认(应答)。
回复 支持 反对

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2013-12-26 20:21:57 | 显示全部楼层
谢谢3楼的提醒,这个是DS上的地址,A0 A1 A2都接地了,那地址是0x70不会错了,那我发了一个地址,应该会给我一个应答的呀

而且后面都是有时序的


这么一个简单的IIC控制的IO扩展芯片我都调一天了,现在我把线都换短了还是调不出来

回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-12-27 08:45:26 | 显示全部楼层
回复【4楼】XavierZhang:
---------------------------------
有种仪器叫逻辑分析仪,感觉这东西在调试低速的时候还是很有用的

我一般都是抓IIC两线的波形来分析的,分析仪上设定好IIC协议之后,一抓,就将你发送的数据、接收的数据等信息全部显示出来,方便快速
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2013-12-27 09:05:14 | 显示全部楼层
回复【5楼】hechao3225:
---------------------------------
估计就是硬件问题了,基本上所有的可能都排除了,我换个芯片试试吧。
原来是释放总线的意思啊,但还有个问题,在赋值之前SDA不是设置为输入了,这样也可以赋值啊?
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-27 12:02:07 | 显示全部楼层
回复【7楼】XavierZhang:
---------------------------------
1.芯片一般不会坏,我说的硬件问题可能是焊接等问题,先尝试读取器件ID,能读出来说明你的IIC模拟的代码没移植好,主要是GPIO配置部分。
2.这是两件事,设置输入是对IIC模拟对应的GPIO配置输入模式,而SDA=1是遵循IIC协议。
回复 支持 反对

使用道具 举报

32

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2013-10-25
在线时间
3 小时
 楼主| 发表于 2013-12-27 13:29:20 | 显示全部楼层
回复【8楼】hechao3225:
---------------------------------
第二个我明白了,但我不是很明白器件的ID是什么,原子的程序里也总是提到。
是这样,IO口我直接是从开发板上接的,和实验的IO一样。我现在写个地址都不给我ACK,我怎么读ID啊
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2012-11-2
在线时间
0 小时
发表于 2015-2-12 13:03:01 | 显示全部楼层
楼主的问题解决了吗  能不能分享下经验?
回复 支持 反对

使用道具 举报

8

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2015-6-1
在线时间
21 小时
发表于 2015-6-1 21:09:52 | 显示全部楼层
我也遇到这个问题,检查发现IIC_Wait_Ack()函数返回1,且每次读的得数都是固定不变的,地址变,返回的数据都不变,谁能告诉我这是咋回事?
回复 支持 反对

使用道具 举报

3

主题

62

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-5-29
在线时间
0 小时
发表于 2015-6-1 21:26:49 | 显示全部楼层
要像8051那样的双向IO口,你需要把电路做成带上拉电阻的。然后设置成OD输出。
A read access to the Input Data Register gets the I/O state in open drain mode
这样,你就不用把IO一下输出,一下输入了。直接读IDR寄存器就能知道IO的电平。

找一段8051的EEPROM代码试一下就可以了。
回复 支持 反对

使用道具 举报

6

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-9-20
在线时间
1 小时
发表于 2015-11-10 15:29:56 | 显示全部楼层
回复【9楼】XavierZhang:
---------------------------------
你的问题解决了吗?我也有遇到这样的问题,不知道是怎么回事?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 23:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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