0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C七宗罪之第一罪

h1654155971.8456 ? 來源:lq ? 2018-11-30 15:51 ? 次閱讀

七宗罪,七個天主教的罪過,簡稱七宗罪。宗為來源、根源的意思。

天主教教義中提出“按若望格西安和教宗格里高利一世分辨出教徒常遇到的重大惡行”。“重大”在這里的意思在于這些惡行會引發(fā)其他罪行的發(fā)生,罪行按嚴(yán)重程度遞增依次為傲慢、嫉妒、憤怒、懶惰、貪婪、淫欲和暴食。

I2C第一罪

有些工程師聊起I2C的時候,會有不屑一顧的感覺, “切,不就是兩根線嗎,一個時鐘,一個數(shù)據(jù)”!每每碰到這些人,就會有一種感覺,兄dei,你真是坑沒有踩夠啊!

下面是我按照本人工作時間先后順序,列出碰到過的I2C的問題。有一點(diǎn)我要強(qiáng)調(diào)一下,我所列出的問題,不是從書上看來或者從哪里杜撰來的,每一個問題都是來自于不同的公司以及不同的項(xiàng)目,由本人親歷并且解決好的問題,希望對年輕的工程師有所幫助!

2005年, 在L公司(想想當(dāng)年的L公司,那可是風(fēng)光的很。)的光網(wǎng)絡(luò)系統(tǒng)上有一塊叫LKAXXX的線卡上出現(xiàn)了一個怪事,說到這里,肯定有人一看到MPC860, 就忍不住笑了, 一看就是上了年紀(jì)的大叔,哎,歲月不饒人吶 ^_^,我剛剛從學(xué)校里畢業(yè)的時候就是MPC860差不多誕生的時候。

先來描述一下問題:

1.經(jīng)常當(dāng)有人按下Resetbutton后發(fā)現(xiàn)系統(tǒng)起不來了,UART console打印了一半就死在那里;

2.再次按下復(fù)位后,癥狀一樣, 不管怎么按復(fù)位按鈕系統(tǒng)都死,UART打印一點(diǎn)點(diǎn)信息掛在那里;

3.多次按復(fù)位按鈕無效后,斷電重啟后OK;

4.大部分情況,同一塊板子按復(fù)位按鈕后是OK的,但是少數(shù)情況是Fail的。

這時候很多就會說,這不是很簡單,讓軟件用調(diào)試器加斷點(diǎn)跟蹤啊,說對了,我們firmware工程師還是很牛逼的,很快就告訴我們問題出在I2C上, 我們用示波器測量在死機(jī)情況下的I2C信號,發(fā)現(xiàn)SDA數(shù)據(jù)信號一直是低電平,怎么復(fù)位都沒有用,一直是低,只有斷電重啟后,SDA才變高。那么原因初步定位了,正式因?yàn)镮2C-SDA被強(qiáng)行拉低,才導(dǎo)致系統(tǒng)起不來,而斷電后SDA被釋放了,系統(tǒng)也就正常了。

我們知道I2C是opendrain的,肯定是被什么芯片給拉了啊,這個很容易想到,不應(yīng)該是CPU, 因?yàn)镃PU已經(jīng)被復(fù)位了啊, 那么懷疑的對象就到了和CPU相連的Device上,乍一看下面的原理圖, 我Kao,這是連連看么?還能有比這個更加簡單的事情嗎?

那么究竟是什么原因?qū)е耂DA被EEPROM拉低了呢?

我們再來看一張圖:

我們看到這里對EEPROM的處理比較特殊, 在絕大部分的原理圖里面,我從來都看不到,就是把EEPROM的電源加一個開關(guān):

1.當(dāng)復(fù)位為低電平時,EEPROM的VDD連到低,斷電;

2.當(dāng)復(fù)位為高電平時,EEPROM的VDD重新連到外部的VDD,恢復(fù)供電。

這時候聰明的小伙伴們已經(jīng)悟出來, Kao!剛剛上面的LKAXXX的板子,如果我們每次按下復(fù)位按鈕復(fù)位CPU的時候,通過按鈕產(chǎn)生的復(fù)位信號High-Low-High由這里的開關(guān)電路把EEPROM的電源斷開一會兒,是不是EEPROM就不會去把SDA拉低了啊,Bingo, 對了。

可是又有人說了,這不是增加成本嘛,還有啊,也沒有看見有人這么干過啊,哈哈,對了,只有日本人才會這么用一根筋的設(shè)計方法,我們中國人永遠(yuǎn)找到更好的解決辦法,我們繼續(xù)往下走。

請看下面這張圖,有沒有很熟悉?

這是一個I2C的讀操作,順序如下:

1.Master發(fā)出start;

2.Master發(fā)出地址和讀命令;

3.Slave給出ACK然后發(fā)出數(shù)據(jù)data7-0,這一共8拍由slave來驅(qū)動I2C SDA,(這里要記住SCL一直是由master來驅(qū)動的,當(dāng)然后面也有特殊情況,這個我們留在后面的七宗罪里面詳述),8拍的時間(假設(shè)100K的速率,周期為10us)是80us。

停停停停停, 搞笑的事情來了,如果在這80us的時間里面,有人按下了復(fù)位按鈕, 會怎樣 ?

舉個“栗子”

假設(shè)四個人打麻將,我的上家把牌打出來后,就該輪到我出牌了,可是這時候來了個電話,我去接電話了, 等我回到牌桌后,我忘記了剛剛輪到我出牌,我以為上一把結(jié)束了,直接把***了,這時候等著我的下家可就不干了,人家等著我出牌好胡呢。然后我這重來的舉動惹惱了人家,道歉也好,賠不是也罷,人家不接受,不玩了!得嘞,這局麻將是玩不下去了。

類比上面I2C的情況,想象一下:

1.80us的時候 EEPROM Slave正在配合CPU輸出讀的數(shù)據(jù),人家玩得正high呢;

2.這時候CPU收到一個復(fù)位指令,而且是強(qiáng)行復(fù)位,類似于接電話;

3.等到CPU復(fù)位完了,完全忘記了剛剛EEPROM正在drive數(shù)據(jù),甚至有可能EERPROM已經(jīng)傳完8bit數(shù)據(jù),正在CPU的NAK(看上圖),這事擱誰身上能受得了;

4.這種情況CPU看起來也是沒有辦法,誰叫我們按下了復(fù)位按鈕了呢。還有一種情況就是CPU自己不厚道,比如去執(zhí)行優(yōu)先級中斷程序后,回來也忘記了別人(EEPROM)正在等待自己繼續(xù)剛才的工作。

這里肯定會有人問,不是復(fù)位了嗎? 請仔細(xì)看上面的原理圖, EEPROM是沒有復(fù)位管腳的,也就是說, 我們按下復(fù)位按鈕時, CPU復(fù)位了,但是EEPROM沒有復(fù)位,它的狀態(tài)機(jī)還在等待輸出數(shù)據(jù)給CPU或者等待CPU的NAK指令以便結(jié)束當(dāng)前的這筆操作,這和上面打麻將的例子是一回事。

那么請問剛剛的SDA被拉低是怎么回事呢?很簡單, 上圖的ACK就是低電平,或者Slavedrive的databit7-0其中有高有低啊。

那么除了上面給EEPROM的電源加開關(guān)的方式,我們還有上面辦法來解決這個問題呢?

我們繼續(xù)看圖:

先來想想剛剛打麻將的事情,如果我打完麻將回來后,直接牌友每個人100塊錢,別人肯定是樂意繼續(xù)陪你玩的,很簡單的辦法解決了問題。如上圖, 我們讓軟件工程師在代碼里面做了下修改:

1.當(dāng)檢測到SDA被拉低后;

2.軟件就持續(xù)發(fā)送9個時鐘;

3.在發(fā)9個clock的過程中SDA會變高變低;

4.當(dāng)Device發(fā)完所有數(shù)據(jù)后,SDA被釋放;

5.此時狀態(tài)機(jī)到達(dá)NAK的phase時,SDA釋放變高,產(chǎn)生了一個NAK;

6.注意此時9個時鐘不一定用完,EEPROM就把到達(dá)NAK phase把SDA釋放了,但是CPU是不知道的,他會一直發(fā)完9個時鐘;

7.最后CPU再發(fā)送一個stop把整個讀操作結(jié)束掉;

The 9 clock pulses make the hanging device’s state machine move to the next state after each clock pulse while the SDA released (not pulled down) which will cause a NACK when the state machine will move to the ACK phase. The NACK will force the device to go to idle mode(意思和我上面的步驟一樣)。

1.Mastertriestoassertalogic 1 on the SDA line;

2.Master still see a logic 0 and then generate a clock pulse on SCL;

3.When device come to NAK phase, then master will generate SDA high which;is a NAK, but master does not know, until master send all the 9 clocks;

4.Master Generate a stop condition。

上面講的是I2C讀操作被中斷導(dǎo)致死機(jī)的情況,下面聊聊I2C寫操作被中斷的情況,解決辦法“簡單粗暴”一些, 大家想想為什么。

這里一樣還是只發(fā)9個時鐘,在9個時鐘的過程中,device就可能發(fā)出一個ack,CPU看到ACK后,再發(fā)一個stop結(jié)束本次操作:

1.Mastertriestoassertalogic 1 on the SDA line;

2.Master still see a logic 0 and then generate 9 clock pulse on SCL;

3.Generate a stop condition。

這里要注意,寫操作被中斷時,發(fā)出的9個clock一定是等到最后一個時鐘發(fā)完, device才被釋放。而讀操作則不一定,有可能發(fā)了第一個時鐘時device就被釋放了只是CPU不知道,到第9個時鐘時stop。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6147

    瀏覽量

    184065
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10772

    瀏覽量

    210452
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1468

    瀏覽量

    122789

原文標(biāo)題:I2C七宗罪之第一罪

文章出處:【微信號:eda365wx,微信公眾號:EDA365電子論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    生成式AI的「七宗罪」!

    面對生成式AI日漸增長的「罪惡」,我們該如何解決問題?
    的頭像 發(fā)表于 05-07 16:34 ?1688次閱讀
    生成式AI的「<b class='flag-5'>七宗罪</b>」!

    i2c總線ppt(I2C總線器件應(yīng)用)

    I2C總線器件應(yīng)用第一節(jié) I2C總線器件應(yīng)用概述I2C總線工作原理I2C總線系統(tǒng)結(jié)構(gòu)I2C總線系
    發(fā)表于 08-13 17:34 ?0次下載

    I2C Guid I2C指南

    I2C Guid  I2C指南 The I2C bus is used in a wide rangeof applications because it is simpleand
    發(fā)表于 04-23 13:55 ?36次下載

    選購低價筆記本:不得不說的五

    選購低價筆記本:不得不說的五些人對低價機(jī)的性能和質(zhì)量將信將疑時,另有部分人對低價筆記本產(chǎn)生了種過度的狂熱
    發(fā)表于 01-21 10:14 ?347次閱讀

    Proteus程序AMP應(yīng)用I2C

    Proteus程序AMP應(yīng)用I2C,好東西,喜歡的朋友可以下載來學(xué)習(xí)。
    發(fā)表于 01-18 17:42 ?6次下載

    i2c

    單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;
    發(fā)表于 05-17 11:09 ?35次下載

    從滴滴的七宗罪細(xì)數(shù)到七十

    十一黃金周,豆瓣小組里冒出了個帖子:“有點(diǎn)懷念順風(fēng)車了”,點(diǎn)開是句“會被噴嗎?” “水軍洗地的滾吧。”這是點(diǎn)贊量最高的評論,意料之中,經(jīng)過兩次風(fēng)波,很多人對“滴滴”兩個字產(chǎn)生條件反射般的偏激
    發(fā)表于 03-11 13:39 ?1754次閱讀

    分享編程的七宗罪,也許對你會有所啟發(fā)

    我不知道為什么,身邊總有些人,使用很短 / 隨機(jī)的名稱來給變量命名。當(dāng)你的項(xiàng)目只有 10-20 行代碼,或者只是代碼片段時,你可以使用這種方式進(jìn)行命名,但是在大項(xiàng)目中,不要這么做。不合適的命名,對可讀性和效率有致命的影響。
    的頭像 發(fā)表于 02-20 09:05 ?1593次閱讀

    人工智能也有歧視和偏見

    在大多數(shù)科幻電影里,冷漠又殘酷是 AI 的典型形象,它們從來不會考慮什么是人情世故,既沒有人性光輝的閃耀,也沒有人性墮落的七宗罪。
    發(fā)表于 06-13 16:25 ?539次閱讀

    STM32學(xué)習(xí)I2C協(xié)議(讀寫EEPROM)

    關(guān)于STM32學(xué)習(xí)分享第I2C協(xié)議(讀寫EEPROM)文章目錄關(guān)于STM32學(xué)習(xí)分享前言二、代碼1.i2c.c2.i2c.h3.main.c總結(jié)前言開始!開始!單片機(jī)的I2C協(xié)議
    發(fā)表于 11-30 15:21 ?32次下載
    STM32學(xué)習(xí)<b class='flag-5'>之</b><b class='flag-5'>I2C</b>協(xié)議(讀寫EEPROM)

    對不起!我還是堅持把I2C肝完了

    廢話I2C其實(shí)肝的我挺難受的,通訊協(xié)議這種規(guī)范往往可以摳出很多的細(xì)節(jié),看了波叔的文章《萬變不離其I2C總線要點(diǎn)總結(jié)》,很詳細(xì)。我打賭我還不會I2
    發(fā)表于 12-14 19:08 ?11次下載
    對不起!我還是堅持把<b class='flag-5'>I2C</b>肝完了

    硬件I2C與模擬I2C

    硬件I2C對應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬的I2C
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    ESP32 ESP-IDF 教學(xué)(六)——I2C數(shù)據(jù)總線(I2C

    ESP32 ESP-IDF 學(xué)習(xí)筆記(六)【I2C數(shù)據(jù)總線(I2C)】文章目錄ESP32 ESP-IDF 學(xué)習(xí)筆記(六)【
    發(fā)表于 12-28 19:25 ?22次下載
    ESP32 <b class='flag-5'>之</b> ESP-IDF 教學(xué)(六)——<b class='flag-5'>I2C</b>數(shù)據(jù)總線(<b class='flag-5'>I</b>2<b class='flag-5'>C</b>)

    萬變不離其I2C總線要點(diǎn)總結(jié)

    前文總結(jié)了單片機(jī)串口個人認(rèn)為值得注意的些要點(diǎn),本文來梳理I2C 總線的些要點(diǎn)。這個題目有點(diǎn)大,本文對于 I2C 其實(shí)很多地方也..
    發(fā)表于 01-26 17:47 ?1次下載
    萬變不離其<b class='flag-5'>宗</b><b class='flag-5'>之</b><b class='flag-5'>I2C</b>總線要點(diǎn)總結(jié)

    I2C掃描儀如何在Arduino上查找I2C地址

    電子發(fā)燒友網(wǎng)站提供《I2C掃描儀如何在Arduino上查找I2C地址.zip》資料免費(fèi)下載
    發(fā)表于 01-31 10:19 ?2次下載
    <b class='flag-5'>I2C</b>掃描儀<b class='flag-5'>之</b>如何在Arduino上查找<b class='flag-5'>I2C</b>地址