Fw: [請益] 使用I2C的I/O使用一定要用提升電阻嗎?

看板ASM作者 (貝纳頌)時間12年前 (2012/06/19 11:58), 編輯推噓4(4040)
留言44則, 10人參與, 最新討論串1/1
※ [本文轉錄自 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

06/19 12:49, , 1F
SPI跟I2C不一樣,不能拿來類比吧
06/19 12:49, 1F

06/19 13:57, , 2F
你用push-pull作IO的話你會不知道衝撞也比較容易miss ACK
06/19 13:57, 2F

06/19 21:22, , 3F
二樓專業
06/19 21:22, 3F

06/19 23:47, , 4F
input時先pull-high然後馬上open-drain試看看
06/19 23:47, 4F

06/20 00:10, , 5F
想請問二樓所說的那個現象是怎麼回事呢?
06/20 00:10, 5F

06/20 09:38, , 6F
I2C是可以支援多重M&S的,當其中有一組在佔住bus的時候
06/20 09:38, 6F

06/20 09:39, , 7F
你必須要先看一下Bus線上是否空的
06/20 09:39, 7F

06/20 09:41, , 8F
如果用push-pull就看不到了
06/20 09:41, 8F
謝謝各位前輩 小弟修正一下處理的方式 ***************** 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)

06/20 21:31, , 9F
想請教一下... Master端push pull高電位時,如果剛好Slave端
06/20 21:31, 9F

06/20 21:32, , 10F
open drain拉low,這樣Slave不會燒電路嗎?
06/20 21:32, 10F

06/20 21:33, , 11F
不好意思,我不是很了解,能不能請高手幫忙解惑一下@@?
06/20 21:33, 11F

06/21 00:05, , 12F
不會,只是耗電。另外SPI中slave不輸出CLK
06/21 00:05, 12F

06/21 00:09, , 13F
這邊SPI指的是 SCK(CLK) SDO(MISO) SDI(MOSI) CS(SS)
06/21 00:09, 13F

06/21 10:01, , 14F
不論是SPI或是I2C,都是由M來輸出CLK
06/21 10:01, 14F

06/21 10:06, , 15F
1~8CLK是Data,9是ack,10CLK是指?下一筆資料?
06/21 10:06, 15F

06/21 10:06, , 16F
這顆看來是有硬體I2C的,是純粹想練功嘛?
06/21 10:06, 16F

06/21 10:12, , 17F
『當SCL在Hi時,SDA才有意義』,SCL為Low時,是拿來給Reload
06/21 10:12, 17F

06/21 10:12, , 18F
Data用的
06/21 10:12, 18F
報告前輩: 說練功也不是,因為小弟想靠軟體達成我要的功能,這樣以後轉換其他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)

06/21 16:14, , 19F
通常Slave端,不會主動發送ST訊號,(但不代表不可以)
06/21 16:14, 19F

06/21 16:16, , 20F
但是就算觸發了,Master也不知道是誰觸發的 (沒Slave的id)
06/21 16:16, 20F

06/21 16:22, , 21F
當Slave跟不上Master的速度時,可以將scl拉至Low
06/21 16:22, 21F

06/21 16:23, , 22F
叫master暫停一下
06/21 16:23, 22F

06/21 16:24, , 23F
當slave放開(回復至hi),master就可以繼續往下送
06/21 16:24, 23F

06/21 16:32, , 24F
SPEC是這樣寫,但是實做又不太一樣了,大多數都不會這樣搞
06/21 16:32, 24F

06/21 16:44, , 25F
你的sck跟clk是同一隻嘛?
06/21 16:44, 25F

06/21 16:51, , 26F
有沒有圖可以看一下?
06/21 16:51, 26F
TO前輩: 所以說我可以不用去管SYNC 直接硬幹Slave端嗎? 我的SPI 跟I2C I/O是分開的 因為OrCAD很貴 目前還沒有畫電路圖XD ※ 編輯: Deltaguita 來自: 60.251.222.115 (06/21 17:30)

06/21 17:57, , 27F
提供波型圖和SCH圖吧,這兩種用啥軟體畫都可以
06/21 17:57, 27F

06/21 18:21, , 28F
波形圖可以用TimeGen畫,有demo版的
06/21 18:21, 28F
TO兩位前輩: 我有接電腦的LA可以紀錄波形 這幾天我還在弄一個SPI介面的RF I2C的部分原廠給的DEMO CODE 要編譯一直都還有問題(太多要定義的沒交代) 可能要等到下禮拜才有半法正式測試 到時候在麻煩你們了Q_Q ※ 編輯: Deltaguita 來自: 60.251.222.115 (06/21 18:30)

06/22 01:02, , 29F
i2c的規格就是要pull up電阻,你練這個功沒有意義吧
06/22 01:02, 29F

06/22 01:02, , 30F
就算讓你在這邊做出來,也不能保證期它的devices都可用啊
06/22 01:02, 30F

06/22 01:03, , 31F
其他的devices (any masters and any slaves)
06/22 01:03, 31F

06/22 01:05, , 32F
i2c是很基本的東西,如果這個也要參考別人的code
06/22 01:05, 32F

06/22 01:05, , 33F
其實你有很多題目可以練功可以努力吧 :) 加油
06/22 01:05, 33F
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)

06/22 12:53, , 34F
sorry口氣不好,我沒資格教訓你啊。我是說你用GPIO不掛電阻
06/22 12:53, 34F

06/22 12:54, , 35F
模擬i2c這件事不值得去做,太tricky,省那兩個電阻後系統
06/22 12:54, 35F

06/22 12:55, , 36F
可以保證穩定嗎?i2c register的意義是廠商才知道的
06/22 12:55, 36F

06/22 12:56, , 37F
我不會知道。而操作i2c這件事本身沒什麼難度,不因register
06/22 12:56, 37F

06/22 12:56, , 38F
內容而有難度。
06/22 12:56, 38F
謝謝前輩: 雖然我還沒實際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)

06/25 14:43, , 39F
基本上,I2C用電阻Pull Hihg是在做Multi AND Gate,不是
06/25 14:43, 39F

06/25 14:44, , 40F
硬體廠商發明的獨門秘密,這只是一個基本硬體常識而已
06/25 14:44, 40F

07/01 23:44, , 41F
I2C在最後一個bit的clk變low前切成OD就可以了,因為slave端
07/01 23:44, 41F

07/01 23:46, , 42F
它不知道何時clk會來,所以會在falling後丟出ACK訊號
07/01 23:46, 42F

07/01 23:50, , 43F
謝謝以上兩位前輩
07/01 23:50, 43F

07/02 00:22, , 44F
Pull-high電阻還是要加喔,在OD時會用到
07/02 00:22, 44F
對吼 感謝前輩們的提醒! 果然還是得加 因為Slvae 端沒有推挽輸出... ※ 編輯: Deltaguita 來自: 60.251.222.115 (07/12 14:14)
文章代碼(AID): #1Ft_ZvJP (ASM)