[爆卦]i2c範例是什麼?優點缺點精華區懶人包

為什麼這篇i2c範例鄉民發文收入到精華區:因為在i2c範例這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者zzss2003 (brotherD)看板Electronics標題[問題] 求救!!寫不出I2...


小弟是社會新鮮人,剛到公司自學不到一個月就被任命要在一個禮拜內寫出I2C通訊的程式
是的,您沒看錯,沒有前輩帶。

小弟現在要用PIC16F1824與OZ8920(battery protection IC)通訊,我已經把I2C的spec看
完一遍了,也把PIC16F1824的MSSP module稍微看過一輪,但還是不知道怎麼起頭。

我知道所有I2C的流程,Start, slave address, R/W, ACK, Stop,但是要如何變成程式碼
就是有困難。

我有上網抓I2C的範例,但是看了之後覺得跟SPEC上寫的流程完全不一樣,我還上國外論壇
請教,但沒有人能幫助到我的情況。我發文的網址:http://www.microchip.com/forums/m994750.aspx?tree=true

接著我又找了這個視頻https://www.youtube.com/watch?v=yM9OpRPMEAE,然後發現明明都
是I2C的通訊規格,為什麼這個視頻有分address high跟address low,我才懷疑會不會是
跟不同IC通訊時,都要配合各個IC相對應的Timing diagram,我不確定,所以想上來請教
前輩們。

我現在要做的事情只有從OZ8920的register中抓取想要的資料,OZ8920其他的動作皆由硬
體完成,想請前輩們給小弟一點方向,讓我知道能從哪裡下手,拜託了!不然我就要GG了!

這裡是OZ8920的datasheet:https://www.dropbox.com/sh/apiqddpjlv26ceq/AAA_HjaRwg8dPN0fSVTg2ddTa?dl=0


6/1補充:下載過datasheet的大大,請幫小弟一個忙,看完之後刪掉此檔案,因為主管說此
文件不能外流QQ
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.215.197.69
※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1495980900.A.E29.html
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:16:10
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:16:54
TWkobe: 有先確定接線都符合spec規範? 05/28 22:23
有,我們公司全部都是硬體工程師,版子已經做好了,只有我一個韌體工程師
現在的情況是deadline已經要到了,版子已經全部弄好了,就差在韌體寫進去就完了
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:28:47
TWkobe: mcu有先量過gpio產生的方波符合spec的要求? 05/28 22:29
這個......我完全不知道也沒這個觀念,但我想前輩們應該都知道這個要求,因為他們使
用這顆ic很久了
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:33:36
TWkobe: 看spec這i2c是write/read的basic function看page 34 05/28 22:33
TWkobe: slave addr就是你這個外部設備的地址 05/28 22:33
TWkobe: 你看p16有寫要符合方波的要求 05/28 22:35
我看了page34,他要先給slave address(這顆IC是60H),但我有個疑問,60H不是1個byte
的表示法嗎?可是它只能給7個bits,意思是我60H要用7個bits表示嗎?(變成C0H)
給slave address後,接著給reg_index,這跟PIC上的spec寫的方式不同,PIC上面是給
slave後就直接給data了。這樣是不是代表是說,不同IC雖然都是用I2C規格通訊,但傳送
訊息的方式卻是要依照IC的spec下去指定?

我有看Page16了,但我沒有看到方波的需求,都是跟時間有關係的參數
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:45:55
TWkobe: address high/low 應該只是一次接收量不夠分high low 05/28 22:39
TWkobe: 實際上還是當作address而已 05/28 22:39
hsucheng: ti的文件,只有7頁希望對你有幫助 05/28 22:41
另外,在page34,在Write_data的後面有一個叫CRC,想請問前輩那是什麼?
謝謝hsucheng大大
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:48:28
TWkobe: CRC是校驗碼, 偶爾會因為有雜訊造成data錯誤 利用這個可以 05/28 22:51
TWkobe: 簡單還原正確的data 05/28 22:51
那我猜我應該不用理它,因為我現在只是要抓電流跟電壓的register判斷是否在充電放電
跟充飽了沒,就算有誤差也不影響。
我想請教一下,我上面假設的60H→C0H是對的嗎?我應該只要照著page34的方式下去寫就行
了吧?
※ 編輯: zzss2003 (49.215.197.69), 05/28/2017 22:54:39
TWkobe: 地址是0x60, 但實際上只要餵7bit address, 有些可以直接給 05/28 22:55
TWkobe: 0x60, 有些要手動shit 1bit 05/28 22:55
TWkobe: 我是有遇過要手動shift的 05/28 22:55
tommycc: PIC 8bit系列應該可以用plib降低開發難度 05/28 22:55
TWkobe: 你就弄一個#define addr 0x60 05/28 22:56
TWkobe: #define addr_msg addr>>1 05/28 22:56
TWkobe: 實驗看看需不需要手動移, 正確的話,slave端會回傳一個ack 05/28 22:57
TWkobe: 至於pic的講的應該是他的libs作法, 我習慣先自己寫一個 05/28 22:58
TWkobe: software i2c function先驗證是否正確 05/28 22:58
tommycc: 喔不,不支援pic16f 05/28 23:00
TWkobe: 還有p16重點是看此裝置的i2c是active high or low 05/28 23:00
TWkobe: 通常是看start signal, 這spec看起來是active low 05/28 23:01
TWkobe: 意思是說sda先low一段時間後, 接著scl開始low 05/28 23:04
TWkobe: 弄個虛擬碼你大概就知道怎麼做 05/28 23:05
TWkobe: void swi2c_START (int delyTime) { 05/28 23:05
TWkobe: sda_set(); delay_us(delayTime); 05/28 23:07
TWkobe: scl_set(); delay_us(delayTime); 05/28 23:08
TWkobe: sda_clear(); delay_us(delayTime); 05/28 23:08
TWkobe: scl_clear(); delay_us(delayTime); } 05/28 23:09
TWkobe: 然後再弄一個swi2c_WRITE(int msg) { 05/28 23:12
TWkobe: int data=msg; for(int i=0; i<8; i++) { 05/28 23:13
TWkobe: if(data & 0x01) sda_set(); else sda_clear(); delay; 05/28 23:16
TWkobe: data >= 1; } 05/28 23:16
TWkobe: 這個function 可以用來解析要寫入的data來控制sda 05/28 23:17
TWkobe: 例如要寫入的slav_addr / reg_index / write_data都可用到 05/28 23:19
TWkobe: 最後再湊一個swi2c_writeMSG function來組合完整的write 05/28 23:21
TWkobe: sequence 05/28 23:21
TWkobe: 寫好後拿示波器量測scl/sda是否有符合完整個write signal 05/28 23:22
TWkobe: 當你完成寫入上述三者都應該會在sda看到正確的ack signal 05/28 23:23
TWkobe: 還有pic說給完address就給data的說法為何跟你spec不同的 05/28 23:26
TWkobe: 原因是你裝置spec的reg_index/write_data也是data呀 05/28 23:27
TWkobe: 不是因此i2c有何不同, i2c是標準大家都差不多, 只差在餵的 05/28 23:28
TWkobe: data會不同 所以pic官方才說直接後面給data 05/28 23:28
TWkobe: 剩下的就可以依據我說的弄出read的完整function了 05/28 23:30
TWkobe: 我忘了說msg之間的w/r bit是幹嘛 05/28 23:34
TWkobe: 這個是說接下來要對slave裝置是要進行read或write動作 05/28 23:35
TWkobe: 然後在說一下read sequence, 比較複雜一點 05/28 23:37
TWkobe: 他等於要先對slave寫入address/reg_index後 05/28 23:38
TWkobe: 結束一次i2c再重新restart寫入地址, 接著就重slave端讀取 05/28 23:39
TWkobe: sda signal 05/28 23:39
amistad: 推好人 TWkobe。補充一下,雖然都是 I2C 但各家實作的 05/29 00:06
amistad: 略有不同,但基本原理類似。需要跟預slave 端IC 來加以確 05/29 00:09
amistad: 認。 05/29 00:09
amistad: 另外,之前經驗因為sda是三態連線,驅動方向跟驅動能力都 05/29 00:10
amistad: 小心調整。 05/29 00:11
bxc: 其實你這問題分成幾個1.你要發出正確I2C 2.OZ8920 3.硬體問題 05/29 09:02
Williamette: TWkobe真是佛心來的 05/29 14:37
teddy98: 看似TWkobe是你的貴人了 05/29 15:20
katzlee: 佛心推文 05/29 15:31
katzlee: 先用示波器看是不是有ACK吧 05/29 15:33
katzlee: 另外你不用去國外論壇,microchip的台灣論壇就有小編和其 05/29 15:34
katzlee: 他高手會幫忙你了 05/29 15:34
NCTUbigGG: 推TWkobe! 05/29 17:22
jeffic0730: 推kobe~ 05/29 19:13
ping870224: 推 05/29 20:26
furio: 推TWkobe好人 05/29 21:46
doubletime: 推twkibe 05/29 21:57
Biglottery: 推Kobe 真的是活菩薩 05/29 22:54
porpoisewise: 用GPIO 兜,把時序一個一個輸出再換成輸入... 確認 05/30 01:40
fxp87117: 佛心推 會有好報 05/30 19:29
yugi2567: 推好人一生平安 05/30 23:59
※ 編輯: zzss2003 (60.248.26.157), 06/01/2017 10:59:44
kobe8112: 幫你推TWkobe好人一生平安,真的是大貴人 06/01 12:56
yugi2567: 原來道歉露出咪咪不犯法 因為咪咪只要被人知道 就不算是 06/04 21:43
yugi2567: 咪咪啊!!!! 還主管說不能外流 06/04 21:43
k012727: 連I2C都沒辦法自學…我是覺得你不要去雷人家硬體了…後 06/04 23:33
k012727: 續bug會解不完 06/04 23:33
dysyase: 蜜月期都沒過完就要包生(還指定性別)!2號才剛找書耶 06/16 11:02

你可能也想看看

搜尋相關網站