打印

I2C总线模拟碰到的问题

[复制链接]
4784|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eyuge2|  楼主 | 2008-4-28 13:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用16F73的两个脚模拟I2C总线,读写24LC512。虽然现在已经读写成功,但在编写代码的过程中遇到了一些疑惑,想在这里听听一下大家的看法。
1.在空闲时候,SCL脚的信号应该置成高电平,还是低电平?
我在网上下了几个例子,在停止位发出以后,有的例子中SCL为高电平,有的例子是低电平。
空闲时段SCL的电平,我觉得应该置为低电平,如果是高,SDA脚要是有个电平变化,岂不是给24LC512一个错误的信号。
2.有的例子中,在起始位、发送字节、停止位这些操作中,都刻意在操作的结尾部分将SCL置为低电平,有没有这种必要?
我觉得在没有必要每次操作刻意将SCL置低电平,要说需要的话,在停止位操作的结尾部分将SCL置低即可
3.使用PIC单片机,SDA脚涉及到输入输出方向的切换。切换的时刻是不是有讲究,要在置SCL为低的之后,才能切换方向?
沙发
xieyuanbin| | 2008-4-28 18:31 | 只看该作者

1.空闲时应该是浮高.
2.你再去理解一下I2C的协议,弄清楚START,STOP,和数据传送不同电平的含义
3.同上.
4.不晓得你怎样会可以读写的.

使用特权

评论回复
板凳
兰天白云| | 2008-4-29 21:17 | 只看该作者

I2C总线总是有很多人搞不请楚

本人准备在5.1期间在写一次

使用特权

评论回复
地板
machunshui| | 2008-4-30 12:50 | 只看该作者

PIC很多都带I2c模块

PIC很多都带I2c模块,
为什么非得自己来模拟呢?

使用特权

评论回复
5
cheungman| | 2008-4-30 23:00 | 只看该作者

我喜欢模拟I2C

使用特权

评论回复
6
eyuge2|  楼主 | 2008-5-3 13:28 | 只看该作者

谢谢

1.不好意思,SCL空闲时应该是浮高.
在这点上认识有些偏差。我老想着在空闲的时候,SCL是高电平,所以用16F73的“SCL”脚做输出将电平拉高,没考虑到可以将16F73的“SCL”置为输入,利用总线上的上拉电阻,将SCL浮高。
在空闲的时候16F73的“SCL”输出低电平,表面上看违反了I2C的规范,实际上总线上只有两个器件,且主控器件是模拟的I2C接口,空闲时刻,SCL上电平的高低是无所谓的。不知道这样理解是否正确。所以我在网上看到有的例子在空闲时刻将SCL置低,总认为这样做是不是有I2C总线规范以外的目的。
2.16F73的“SDA”的方向切换是有讲究的。比如说,第8个时钟后,第9个时钟16F73的“SDA”的方向需要切换,做输入去读24LC152的应答信号。
如果第9个时钟按照这样的顺序去做:
置16F73的“SDA”方向为输入;
将16F73的“SCL”置低;
延时;
将16F73的“SCL”置高;
延时;
读16F73的“SDA”的值;
而第8个时钟的时候,16F73的“SDA”输出值恰巧为0,就会产生假的停止位。

使用特权

评论回复
7
xieyuanbin| | 2008-5-3 16:11 | 只看该作者

纠正一下楼上的笔误

"若要想将SCL拉低,只需将其改为输入模式即可.而不需要SCL=0"
应该为将其改成输出模式即可.

使用特权

评论回复
8
xieyuanbin| | 2008-5-3 16:21 | 只看该作者

I2C的协议,建议楼猪再去仔细看看

1.不管是输出高电平或者在空闲时,SDA和SCL的高电平都应该是浮高,虽然都是高电平,实际是外部上拉电阻的作用,而不是MASTER输出的高电平.因此不管楼主的做法:"空闲时刻,SCL上电平的高低是无所谓的"极易引起误动作,今后程序的兼容性也成问题.单片机在I2C中要输出高电平,需将相应的IO口设置成高阻状态(输入状态),而要输出低电平,则要先将对应锁存器设置成0,然后把端口状态设置成输出状态.
2.在I2C协议中,除START和STOP条件外,所有SDA的数据电平改变必须在SCL为低电平时,否则视为START或STOP条件.遵循此原则,楼主第二个问题就不应该存在

使用特权

评论回复
9
hotpower| | 2008-5-3 17:27 | 只看该作者

哈哈~~~确实是笔误~~~SCL/SDA恒为0后只需切换输入输出即可

楼主所述:
"我在网上看到有的例子在空闲时刻将SCL置低"

实际是SCL置低,但设置了输入IO模式,所以就"空闲"了...
若要想将SCL拉低,只需将其改为输出模式即可.而不需要SCL=0.

且记~~~

使用特权

评论回复
10
eyuge2|  楼主 | 2008-5-4 12:10 | 只看该作者

感谢两位的指点迷津

我看的例子,基本上都是针对51单片机的。51单片机的端口不是图腾结构,因此程序实现的方法上应该不一样。
51在操作SDA总线的时候,高低电平都是通过51的“SDA”脚直接输出。51的“SDA”脚输出“1”,实质上是通过上拉电阻实现的。
我在用PIC的时候,也是“SDA”脚直接输出,看来是犯错误了。
应该是先将PIC的“SDA”脚先置为0,需要操作SDA总线的时候,控制“SDA”脚的方向为输入或输出,在SDA总线上实现“1”或“0”。
操作SCL总线时的道理也是一样。
网上很多51模拟I2C的例子在发停止位后,将SCL置低电平的做法,看来需要改一下。
可以参考的是microchip的AN554

使用特权

评论回复
11
xieyuanbin| | 2008-5-4 13:26 | 只看该作者

楼上开窍了.

51是开漏输出,PIC是图腾柱输出,做法当然不一样,坛子里有现成的程序,查找一下I2C或IIC看看,

使用特权

评论回复
12
hotpower| | 2008-5-5 19:00 | 只看该作者

哈哈~~~祝贺11楼迷糊结束~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

1366

帖子

9

粉丝