OpenEdv-开源电子网

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

在示波器上检测IIC波形时一直有一个奇怪的尖凸

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-6-18
在线时间
18 小时
发表于 2016-10-24 15:43:57 | 显示全部楼层 |阅读模式
5金钱
      我是个嵌入式的小白,最近一直再调ADXL312的三轴传感器,这款不像ADXL345有那么多资料,一直没调通。问题是无法读到传感器寄存器的值,拿示波器看IIC信号,发现输出信号其实是有点就是高电平电压太低,捕捉不到,所以每次读到都是0x00,如黄框所示,不知道是怎么回事,一直在找原因。
     每次在ACK之后,也就是第九个SCL波形后面(红框表示),总有一个奇怪的尖凸,不知道会不会是这个的原因。     还有我用的代码也附在下面了,不知道软件上是不是也存在问题,希望大神能够帮我解答一下。

1.png
2.png
3.png

代码.zip

9.18 KB, 下载次数: 265

最佳答案

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

明显是两个信号打架了。 你设置SDA输出高,此时ADXL345输出低(反之亦然),这样就打架了,出现你这样的波形。检查时序就行了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-24 15:43:58 | 显示全部楼层
明显是两个信号打架了。 你设置SDA输出高,此时ADXL345输出低(反之亦然),这样就打架了,出现你这样的波形。检查时序就行了。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-6-18
在线时间
18 小时
 楼主| 发表于 2016-10-25 10:03:14 | 显示全部楼层
正点原子 发表于 2016-10-24 15:43
明显是两个信号打架了。 你设置SDA输出高,此时ADXL345输出低(反之亦然),这样就打架了,出现你这样的波 ...

多谢原子哥的解答,把SDA拉高,然后等待ADXL拉低不是等待ack的步骤么?所以我一直在想是不是那个尖凸就是因为等待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;  
}

还有,原子哥,我一直不理解,把IO口设置为输入SDA_IN(),再调用SDA=1拉高SDA,这样没问题么,在输入模式下拉高io口是什么用处。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-6-18
在线时间
18 小时
 楼主| 发表于 2016-10-25 10:43:31 | 显示全部楼层
正点原子 发表于 2016-10-24 15:43
明显是两个信号打架了。 你设置SDA输出高,此时ADXL345输出低(反之亦然),这样就打架了,出现你这样的波 ...

是不是这个样子的,那个地方刚刚是下一个字节的开始。而io口为输入模式时,SDA是高电平,而是第一位是0,所以有了那个拉高拉低的东西
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11537
金钱
11537
注册时间
2014-4-1
在线时间
1314 小时
发表于 2016-10-25 11:13:51 | 显示全部楼层
zykcumt 发表于 2016-10-25 10:43
是不是这个样子的,那个地方刚刚是下一个字节的开始。而io口为输入模式时,SDA是高电平,而是第一位是0, ...


不是输入模式,
而是相反,两边的SDA同时做输出了,而且一个出高,一个出低。

回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-6-18
在线时间
18 小时
 楼主| 发表于 2016-10-25 15:03:36 | 显示全部楼层
正点原子 发表于 2016-10-24 15:43
明显是两个信号打架了。 你设置SDA输出高,此时ADXL345输出低(反之亦然),这样就打架了,出现你这样的波 ...

还有原子哥,我想问一下,ADXL在发送ACK的时候是怎么样判断ACK可以停止发送了的?就是它是在发送ACK的时候一直拉低SDA,它是依据什么来决定释放SDA不再拉低它,我写了一个while(!ReadSDA),在waitACK()函数的最后,发现它一直死循环,说明它一直在发送ACK拉低SDA,而不是按照时间来结束发送ACK,是根据主机的状态(输入/输出)来判断的么?
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2016-6-18
在线时间
18 小时
 楼主| 发表于 2016-10-25 15:03:57 | 显示全部楼层
xuande 发表于 2016-10-25 11:13
不是输入模式,
而是相反,两边的SDA同时做输出了,而且一个出高,一个出低。

哦哦,这段理解了,谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 06:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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