OpenEdv-开源电子网

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

个人学习模拟IIC通信总结,分享给新手

  [复制链接]

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
发表于 2014-3-13 11:54:58 | 显示全部楼层 |阅读模式
        本人学习单片机几个月了,从51,avr到现在的STM32。我本是一个学机械的,但因为对电子这块有很大的兴趣,所以选择了自学单片机,也想着自己以后能去单独开发一款产品。因为基础薄弱,一路过来遇到了很多麻烦,还好买了原子哥的战舰版,知道了这个论坛,有不懂的地方可以问问大家。
        对IIC这块我花的时间也蛮长的,在51和STM32中用的都是模拟IIC,在AVR中用的是硬件的,我下面主要说的是模拟IIC,多机通信我还没做过,这里只说两机通信。以AT24C02来说:
        1.IIC总线空闲的时候,SDA和SCL都为高电平,所以硬件电路中一般在IIC两根总线上各接一个电阻后再接VCC,
        2.


        开始,终止信号就注意里面的几个时间就可以了,看AT24C02数据手册中提到的几个时间,下图中就有标示。通过软件延迟去满足。如果是IIC跟其余的芯片进行通信时也需要看看给的这个时间是否满足要求,一般都应该差不多。
        3.

        总线中的时序需要满足,比如SCL中提到的T_low,T_high。IIC总线速度在400KHZ以下,如果不给这个时间的话就可能超过400KHz了,也可以通过调整这几个时间去调整IIC通信的速度。
        SDA一般只有在SCL位低电平的时候才能变化,因为起始,停止信号是在SCL为高的时候SDA发生变化,为了区别,所以一般在写入/读出数据时只能在SCL为低时SDA发生变化。这点在编程的时候要特备注意。
        4.在用IIC总线向AT24C02写入一字节或读取一字节数据时需要知道什么时候在SDA总线上写入一个位或者什么时候从SDA总线上去读取一个位,有资料说是在SCL的上升沿才能将数据写入AT24C02中,在SCL的下降沿才能从 AT24C02 中读出数据。那就是在写入数据时就是要先改变SDA的值再去制造一个SCL的上升沿,需要在SCL的下降沿后从SDA总线上去读取数据。先后顺序必须把握好。
        5.重点想说的就是应答信号和非应答信号。在这块我吃过很多亏。
            应答信号分为主机应答 和从机应答 ,这两者有着很大的区别。主机应答是在主机从从机中读取数据时每次读取完一个字节的数据后主机给从机的一个应答信号,表示主机已收到数据了。而从机应答是指主机给从机发送数据时从机给主机的应答,给一个应答就代表从机已经收到了数据,为主机接下来的工作做个判断。主机在核查从机的应答信号的时候,必须先将SDA总线拉高,释放总线。
            非应答信号是主机给从机的,当读取完一字节数据以后,主机不再去读取数据就给从机一个非应答信号,接着一个停止信号,直接给停止信号也是可以结束此次读操作,但是会对后面的操作带来影响。我在操作RDA5820的时候就深受其害,所以还是不套图省事,养成好的习惯,非应答信号在需要的时候必须给。
        上面是我个人的一些总结,有什么不对的望指正!高手们有什么添加的可以再后面跟上,谢谢!大伙共同学习!


    


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-13 12:15:14 | 显示全部楼层
总结的不错,谢谢分享

我刚学IIC的时候就是在应答这块搞了好久,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-3-13 18:15:44 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
应答这块很多资料都说的不是很清楚,我这是经历了多次的挫折后总结出来的。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-14 08:39:46 | 显示全部楼层
回复【4楼】jiaozhu:
---------------------------------
赞同,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-3-24
在线时间
0 小时
发表于 2014-3-24 21:59:07 | 显示全部楼层
那请问从机地址怎么设置,假如TWAR=0x50,前七位是地址0x28 从机地址怎么设置,主机呢?????
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-3-24 22:14:00 | 显示全部楼层
回复【6楼】骑驴赶大象:
---------------------------------
从机地址一般都是硬件电路已经决定了,你只需要根据你是读还是写去更改最后一个位就可以了。不知道你说的TWAR是啥意思
回复 支持 反对

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2014-4-17 16:41:24 | 显示全部楼层
我也是学机械的。不过想转行玩电子,最近也是在弄模拟IIC,用来读取光强传感器数据,程序一直出问题,也觉得是应答那块出问题,楼主有没写过BH1750的chengxv ?
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-4-17 19:46:27 | 显示全部楼层
回复【8楼】爱博不专:
---------------------------------
同道中人啊 !没写过,仔细研究数据手册,最好是原版的。
回复 支持 反对

使用道具 举报

35

主题

227

帖子

3

精华

高级会员

Rank: 4

积分
956
金钱
956
注册时间
2014-3-5
在线时间
35 小时
发表于 2014-4-17 22:05:52 | 显示全部楼层
回复【9楼】jiaozhu:
---------------------------------
研究出来了,http://www.openedv.com/posts/list/0/31163.htm?privmsg=1#179507
把看到的有意义的例子进行扩充,并将其切实的运用到自己的设计中。 应用确实不容易,水平是在不断的实践中完善和发展的。
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2014-4-17 22:07:29 | 显示全部楼层
回复【10楼】爱博不专:
---------------------------------
恭喜,研究透了就简单了。
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2014-3-19
在线时间
29 小时
发表于 2014-10-15 11:46:28 | 显示全部楼层
总结的不错,很好!
永远不要让别人来告诉你,你不会做什么,一旦那样,你就失去了自身的意义。你总是要提前准备好别人想不到的事情,一旦机遇来临,你就赢得了先机。
回复 支持 反对

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
发表于 2014-11-13 16:01:04 | 显示全部楼层
markmarkmark
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-9-25
在线时间
23 小时
发表于 2014-12-8 15:45:34 | 显示全部楼层
楼主写的很好啊
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-16 14:25:18 | 显示全部楼层
mark學習學習
回复 支持 反对

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-16 18:57:26 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
 原子哥,“SDA一般只有在SCL位低电平的时候才能变化,一般在写入/读出数据时只能在SCL为低时SDA发生变化。”那为什么例程中读数据时SCL是高电平呢?
u8 IIC_Read_Byte(unsigned char ack)

           unsigned char i,receive=0;
        SDA_IN();      //SDA设置为输入
        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();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

1

主题

215

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2013-9-23
在线时间
4 小时
发表于 2014-12-17 16:05:18 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
好的,谢谢原子哥!
回复 支持 反对

使用道具 举报

3

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2013-12-6
在线时间
24 小时
发表于 2014-12-30 00:49:09 | 显示全部楼层
刚开始学IIC,MARK一下,谢谢楼主分享!
回复 支持 反对

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2014-8-2
在线时间
7 小时
发表于 2015-1-8 10:04:47 | 显示全部楼层
最近正在学习IIC,楼主总结的很通俗易懂,赞一个!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2015-1-29
在线时间
0 小时
发表于 2015-2-3 16:15:28 | 显示全部楼层
初学IIC 也打算做个主从通讯的  求源码 参考下  万分感谢!
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2015-6-2
在线时间
0 小时
发表于 2015-6-2 11:49:34 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
原子哥  请问你这句回答是什么意思
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-6-2 12:49:21 | 显示全部楼层
谢谢分享,学习了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-6-2 13:36:25 | 显示全部楼层
同是学机械。。。
Good good study , day day up...
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-3-26
在线时间
0 小时
发表于 2015-6-3 14:58:11 | 显示全部楼层
lz好棒,对于初学者来说真是节省了很多时间!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2015-5-27
在线时间
3 小时
发表于 2015-6-3 17:00:31 | 显示全部楼层
谢谢,学到了经验。
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2015-11-2
在线时间
17 小时
发表于 2015-11-24 14:48:02 | 显示全部楼层
mark this topic.
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2015-7-6
在线时间
0 小时
发表于 2015-12-18 11:15:15 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
原子哥,咱们例程模拟的IIC速率是多大,我看SCL频率是250k,是不是通信速率也大致一样,另外stm32或者51模拟IIC时,限制通信速率的因素有啥?最高能到多少呢?我希望能到标速400k,哈哈。
回复 支持 反对

使用道具 举报

16

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2015-11-1
在线时间
34 小时
发表于 2016-3-6 08:29:14 | 显示全部楼层
先标记了,有空慢慢看
这是我的小尾巴~
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-2
在线时间
7 小时
发表于 2016-3-15 08:57:22 | 显示全部楼层
感谢分享!适合新手学习!!
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-3-2
在线时间
7 小时
发表于 2016-3-15 08:58:41 | 显示全部楼层
正点原子 发表于 2014-12-17 00:23
回复【16楼】zzj:
---------------------------------
低电平变化,高电平稳定。

400Khz算是高速电路了吗??怎么区分高速和低速??
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2016-3-15 10:24:02 | 显示全部楼层
I2C通讯这儿感觉手把手教单片机这个视频里讲的挺清楚。
回复 支持 反对

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-3-15 12:39:48 | 显示全部楼层
学习了。
回复 支持 反对

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-3-22
在线时间
8 小时
发表于 2016-3-25 09:33:11 | 显示全部楼层
anazel 发表于 2016-3-15 10:24
I2C通讯这儿感觉手把手教单片机这个视频里讲的挺清楚。

具体哪个章节?视频有点多  不能一个一个找下去啊  …
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-3-29
在线时间
9 小时
发表于 2016-4-12 13:15:53 | 显示全部楼层
学习,学习,最近在学习IIC
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-3-24
在线时间
20 小时
发表于 2016-4-12 14:50:33 | 显示全部楼层
同样是在应答信号中坑了一把,这次又深入的学习了。
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-4-1
在线时间
17 小时
发表于 2016-6-7 14:44:41 | 显示全部楼层

请教,软件IIC的通信速率应该怎么计算呢
回复 支持 反对

使用道具 举报

13

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-9-22
在线时间
76 小时
发表于 2016-10-19 16:32:38 | 显示全部楼层
怎么修改模拟IIC的速率
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-8-25
在线时间
61 小时
发表于 2016-10-21 10:28:53 | 显示全部楼层
看到版主也用了RDA5820,请问版主一个问题,如何将正弦波加载到载波上?看RDA5820的PDF上说直接Rda5820WriteReg(0X40,0X000C);就可以了试了一下不可以,麻烦版主了。
回复 支持 反对

使用道具 举报

69

主题

475

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1334
金钱
1334
注册时间
2013-12-28
在线时间
197 小时
 楼主| 发表于 2016-10-21 22:31:09 | 显示全部楼层
Xulovling 发表于 2016-10-21 10:28
看到版主也用了RDA5820,请问版主一个问题,如何将正弦波加载到载波上?看RDA5820的PDF上说直接Rda5820Writ ...

那都是N多年前的事了  早忘记了  
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-8-25
在线时间
61 小时
发表于 2016-10-22 17:09:37 | 显示全部楼层
jiaozhu 发表于 2016-10-21 22:31
那都是N多年前的事了  早忘记了

              好吧
回复 支持 反对

使用道具 举报

1

主题

17

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2017-7-29
在线时间
18 小时
发表于 2017-7-31 13:54:59 | 显示全部楼层
mark!!
回复 支持 反对

使用道具 举报

12

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-9-20
在线时间
56 小时
发表于 2017-9-15 15:45:57 | 显示全部楼层
请教个问题哈
void IIC_Stop(void)
{
        SDA_OUT();//sda线输出
        IIC_SCL=0;
        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
        delay_us(4);
        IIC_SCL=1;
        IIC_SDA=1;//发送I2C总线结束信号
        delay_us(4);                                                                  
}
对于这个停止函数我不是很理解为什么要多此一举先把SDA和SCL设置为0;直接设置为结束的
IIC_SCL=1;
IIC_SDA=0;
delay_us(4);                                                                  
IIC_SDA=1;
这样是有什么问题么?
回复 支持 反对

使用道具 举报

18

主题

50

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1894
金钱
1894
注册时间
2017-10-8
在线时间
229 小时
发表于 2017-10-16 19:37:51 | 显示全部楼层
Riven丶叮当 发表于 2017-9-15 15:45
请教个问题哈
void IIC_Stop(void)
{

我也遇到这样的疑问,明明说好的在SCL为高电平时,SDA由高电平变为低电平,表示截至信号,为什么还要把IIC-SDA和IIC_SCL先同时置低呢??
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-10-16
在线时间
2 小时
发表于 2017-10-17 21:00:12 | 显示全部楼层
Riven丶叮当 发表于 2017-9-15 15:45
请教个问题哈
void IIC_Stop(void)
{

你仔细看一下上面那个停止的图,最后那一截,应该能看出来,时钟线先变高之后数据线再变高,所以你写的那样应该是不行的
回复 支持 反对

使用道具 举报

8

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2017-10-13
在线时间
19 小时
发表于 2018-8-16 10:08:49 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2018-8-16 10:14:48 | 显示全部楼层
羡慕学机械的。又可以自己设计结构,又可以自己画电路编程序。完全不像我们这里,结构说你硬件先出来我们才能设计结构;硬件说你结构不搭好,我们电路板画多大,什么东西画哪里怎么知道?
猪猪熊呢?
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1013
金钱
1013
注册时间
2017-8-8
在线时间
67 小时
发表于 2018-8-16 10:17:59 | 显示全部楼层
特么有用了!
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2016-8-29
在线时间
128 小时
发表于 2018-8-18 09:54:01 | 显示全部楼层
IIC mark
回复 支持 反对

使用道具 举报

1

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3139
金钱
3139
注册时间
2015-3-29
在线时间
300 小时
发表于 2018-8-18 15:06:11 | 显示全部楼层
这个提醒真的很好,以前一直没特别理会应答信号
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 18:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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