作者Deltaguita (贝纳颂)
看板ASM
标题Fw: [请益] 使用I2C的SDA使用一定要用提升电阻吗?
时间Tue Jun 19 11:58:48 2012
※ [本文转录自 Electronics 看板 #1FsjVVOi ]
作者: Deltaguita (贝纳颂) 看板: Electronics
标题: [请益] 使用I2C的I/O使用一定要用open drain吗?
时间: Fri Jun 15 14:36:11 2012
请问使用I2C作为资料传输介面可以不使用提升电阻吗?
小弟目前用的c8051f340的I/O有提供推挽跟开集极两种选择
8051为master
sencer为slave
平时待机使用开集极I/O
纯输出我用推挽,纯输入我用开集极
因为I2C的SDA是双向的,所以我交替切换输出方式
Master端在8th clock 前使用推挽 8th clock後使用开集极
请问这样可行吗?
P.S
在使用SPI时 所以我是这样做的
这颗IC在push pull时 输出很强 slave端会无法pull dowm这只脚位
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.251.222.115
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/15 14:38)
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: Deltaguita (60.251.222.115), 时间: 06/19/2012 11:58:48
1F:→ proach:SPI跟I2C不一样,不能拿来类比吧 06/19 12:49
2F:→ WolfLord:你用push-pull作IO的话你会不知道冲撞也比较容易miss ACK 06/19 13:57
3F:推 ruemann:二楼专业 06/19 21:22
4F:→ ksmrt0123:input时先pull-high然後马上open-drain试看看 06/19 23:47
5F:→ Jhih8051:想请问二楼所说的那个现象是怎麽回事呢? 06/20 00:10
6F:→ m490521:I2C是可以支援多重M&S的,当其中有一组在占住bus的时候 06/20 09:38
7F:→ m490521:你必须要先看一下Bus线上是否空的 06/20 09:39
8F:→ m490521:如果用push-pull就看不到了 06/20 09:41
谢谢各位前辈 小弟修正一下处理的方式
*****************
1 Master & 1 slave
若以M端去写入S端
*****************
1.SCK&SDA为 open drain
(开始传送)
2.SDA在8th CLK前为push pull 9th CLK时为open drain 用以确ACK
3.SCK在9th CLK前为push pull 10th CLK时转为open drain
这边想请教是先进入10th CLK再转态open drain
还是先转态为open drain 再进入10th CLK比较OK?
4.SCK=1;
5.while(!CLK); // CLK Sync
以上是以Master 端来输出CLK的想法
如果今天是由slave 端来输出CLK 那我就没辄了@@"
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/20 14:12)
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/20 14:13)
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/20 14:16)
9F:→ jheli:想请教一下... Master端push pull高电位时,如果刚好Slave端 06/20 21:31
10F:→ jheli:open drain拉low,这样Slave不会烧电路吗? 06/20 21:32
11F:→ jheli:不好意思,我不是很了解,能不能请高手帮忙解惑一下@@? 06/20 21:33
12F:→ kikiqqp:不会,只是耗电。另外SPI中slave不输出CLK 06/21 00:05
13F:→ kikiqqp:这边SPI指的是 SCK(CLK) SDO(MISO) SDI(MOSI) CS(SS) 06/21 00:09
14F:→ m490521:不论是SPI或是I2C,都是由M来输出CLK 06/21 10:01
15F:→ m490521:1~8CLK是Data,9是ack,10CLK是指?下一笔资料? 06/21 10:06
16F:→ m490521:这颗看来是有硬体I2C的,是纯粹想练功嘛? 06/21 10:06
17F:→ m490521:『当SCL在Hi时,SDA才有意义』,SCL为Low时,是拿来给Reload 06/21 10:12
18F:→ m490521:Data用的 06/21 10:12
报告前辈:
说练功也不是,因为小弟想靠软体达成我要的功能,这样以後转换其他51BASE平台的时候
可以无痛转换
10th CLK 这边我有点说错了 是在9th~10th 之间会有一个CLK sync
这边我有一点搞不清楚是Slave把SDA 拉为LOW 还是单纯Master等待而已?
假设今天I2C是由Slave端去触发Master,也是由Master端送出CLK吗?
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/21 14:42)
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/21 14:55)
19F:→ m490521:通常Slave端,不会主动发送ST讯号,(但不代表不可以) 06/21 16:14
20F:→ m490521:但是就算触发了,Master也不知道是谁触发的 (没Slave的id) 06/21 16:16
21F:→ m490521:当Slave跟不上Master的速度时,可以将scl拉至Low 06/21 16:22
22F:→ m490521:叫master暂停一下 06/21 16:23
23F:→ m490521:当slave放开(回复至hi),master就可以继续往下送 06/21 16:24
24F:→ m490521:SPEC是这样写,但是实做又不太一样了,大多数都不会这样搞 06/21 16:32
25F:→ m490521:你的sck跟clk是同一只嘛? 06/21 16:44
26F:→ m490521:有没有图可以看一下? 06/21 16:51
TO前辈:
所以说我可以不用去管SYNC 直接硬干Slave端吗?
我的SPI 跟I2C I/O是分开的
因为OrCAD很贵 目前还没有画电路图XD
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/21 17:30)
27F:→ kikiqqp:提供波型图和SCH图吧,这两种用啥软体画都可以 06/21 17:57
28F:→ m490521:波形图可以用TimeGen画,有demo版的 06/21 18:21
TO两位前辈:
我有接电脑的LA可以纪录波形
这几天我还在弄一个SPI介面的RF
I2C的部分原厂给的DEMO CODE 要编译一直都还有问题(太多要定义的没交代)
可能要等到下礼拜才有半法正式测试
到时候在麻烦你们了Q_Q
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/21 18:30)
29F:→ proach:i2c的规格就是要pull up电阻,你练这个功没有意义吧 06/22 01:02
30F:→ proach:就算让你在这边做出来,也不能保证期它的devices都可用啊 06/22 01:02
31F:→ proach:其他的devices (any masters and any slaves) 06/22 01:03
32F:→ proach:i2c是很基本的东西,如果这个也要参考别人的code 06/22 01:05
33F:→ proach:其实你有很多题目可以练功可以努力吧 :) 加油 06/22 01:05
proach教训的是
小弟资质不是很好,过去也一直以为用8051做键盘一定要用提升电阻
直到看到网路上一些前辈不吝啬的分享才知道原来键盘扫描不需要提升电组也可以
我就是菜逼八才会来这里问人阿Q_Q
另外CODE的问题 是用来测试一颗设计中的IC
主要是一些define没有交代清楚
例如说给了一段CODE 其中在程式引用到inline_ptr这个变数7次
可是这个变数并没有被定义 也没有任何一段CODE有去给予他初值
结果D house的回覆是:
Search_parameter()以及StrToInt()是用来撷取由Hyper Terminal输入的参数值
原始的程式是用command shell来操作的
如果贵公司要测试, 直接指定参数值即可
以AP2010_Set_Frame()为例
if( Search_parameter() )
{
Frame = ( unsigned char )StrToInt( inline_ptr );
}
else
{
printf( "\n\rparameter errror!" );
return;
}
原本是用来取得参数Frame
可以直接指定参数 Frame = 0x01;
再由I2C送出
我手上的IC 是下到第2次的板本 每次的版本参数都有点不太一样
原厂没说 天知 地知 proach知而已...
※ 编辑: Deltaguita 来自: 114.25.126.198 (06/22 02:59)
34F:→ proach:sorry口气不好,我没资格教训你啊。我是说你用GPIO不挂电阻 06/22 12:53
35F:→ proach:模拟i2c这件事不值得去做,太tricky,省那两个电阻後系统 06/22 12:54
36F:→ proach:可以保证稳定吗?i2c register的意义是厂商才知道的 06/22 12:55
37F:→ proach:我不会知道。而操作i2c这件事本身没什麽难度,不因register 06/22 12:56
38F:→ proach:内容而有难度。 06/22 12:56
谢谢前辈:
虽然我还没实际RUN过 但是基本的I2C传输我想应该没有问题啦 o.oa
到现在一直都没有真正有经验的人可以教我,都要靠自己来摸索,
手头上又一堆事情
要自己选CHIP 、自己找仪器、自己学各种介面
还要搞IR HDMI-CEC USB
很多东西懵懵懂懂...
所以很容易遇到很多人看起来觉得是很蠢的问题,
如果让您见笑 真的很不好意思
※ 编辑: Deltaguita 来自: 60.251.222.115 (06/22 16:10)
※ 编辑: Deltaguita 来自: 114.25.126.198 (06/22 22:05)
39F:推 WolfLord:基本上,I2C用电阻Pull Hihg是在做Multi AND Gate,不是 06/25 14:43
40F:→ WolfLord:硬体厂商发明的独门秘密,这只是一个基本硬体常识而已 06/25 14:44
41F:推 selfhu:I2C在最後一个bit的clk变low前切成OD就可以了,因为slave端 07/01 23:44
42F:→ selfhu:它不知道何时clk会来,所以会在falling後丢出ACK讯号 07/01 23:46
43F:→ Deltaguita:谢谢以上两位前辈 07/01 23:50
44F:推 selfhu:Pull-high电阻还是要加喔,在OD时会用到 07/02 00:22
对吼 感谢前辈们的提醒!
果然还是得加 因为Slvae 端没有推挽输出...
※ 编辑: Deltaguita 来自: 60.251.222.115 (07/12 14:14)