在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

I2C七宗罪之第一罪

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

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

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

I2C第一罪

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

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

2005年, 在L公司(想想當年的L公司,那可是風光的很。)的光網絡系統上有一塊叫LKAXXX的線卡上出現了一個怪事,說到這里,肯定有人一看到MPC860, 就忍不住笑了, 一看就是上了年紀的大叔,哎,歲月不饒人吶 ^_^,我剛剛從學校里畢業的時候就是MPC860差不多誕生的時候。

先來描述一下問題:

1.經常當有人按下Resetbutton后發現系統起不來了,UART console打印了一半就死在那里;

2.再次按下復位后,癥狀一樣, 不管怎么按復位按鈕系統都死,UART打印一點點信息掛在那里;

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

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

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

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

那么究竟是什么原因導致SDA被EEPROM拉低了呢?

我們再來看一張圖:

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

1.當復位為低電平時,EEPROM的VDD連到低,斷電;

2.當復位為高電平時,EEPROM的VDD重新連到外部的VDD,恢復供電。

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

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

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

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

1.Master發出start;

2.Master發出地址和讀命令;

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

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

舉個“栗子”

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

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

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

2.這時候CPU收到一個復位指令,而且是強行復位,類似于接電話;

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

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

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

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

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

我們繼續看圖:

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

1.當檢測到SDA被拉低后;

2.軟件就持續發送9個時鐘;

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

4.當Device發完所有數據后,SDA被釋放;

5.此時狀態機到達NAK的phase時,SDA釋放變高,產生了一個NAK;

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

7.最后CPU再發送一個stop把整個讀操作結束掉;

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讀操作被中斷導致死機的情況,下面聊聊I2C寫操作被中斷的情況,解決辦法“簡單粗暴”一些, 大家想想為什么。

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

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。

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 示波器
    +關注

    關注

    113

    文章

    6273

    瀏覽量

    185507
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10889

    瀏覽量

    212388
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1494

    瀏覽量

    124104

原文標題:I2C七宗罪之第一罪

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

收藏 人收藏

    評論

    相關推薦

    生成式AI的「七宗罪」!

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

    i2c總線ppt(I2C總線器件應用)

    I2C總線器件應用第一I2C總線器件應用概述I2C總線工作原理I2C總線系統結構I2C總線系
    發表于 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
    發表于 04-23 13:55 ?36次下載

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

    選購低價筆記本:不得不說的五些人對低價機的性能和質量將信將疑時,另有部分人對低價筆記本產生了種過度的狂熱
    發表于 01-21 10:14 ?359次閱讀

    Proteus程序AMP應用I2C

    Proteus程序AMP應用I2C,好東西,喜歡的朋友可以下載來學習。
    發表于 01-18 17:42 ?6次下載

    i2c

    單片機i2c總線操作;單片機i2c總線操作;單片機i2c總線操作;
    發表于 05-17 11:09 ?35次下載

    從滴滴的七宗罪細數到七十

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

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

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

    人工智能也有歧視和偏見

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

    STM32學習I2C協議(讀寫EEPROM)

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

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

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

    硬件I2C與模擬I2C

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

    ESP32 ESP-IDF 教學(六)——I2C數據總線(I2C

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

    萬變不離其I2C總線要點總結

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

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

    電子發燒友網站提供《I2C掃描儀如何在Arduino上查找I2C地址.zip》資料免費下載
    發表于 01-31 10:19 ?2次下載
    <b class='flag-5'>I2C</b>掃描儀<b class='flag-5'>之</b>如何在Arduino上查找<b class='flag-5'>I2C</b>地址
    主站蜘蛛池模板: 婷婷在线网| 一级日本大片免费观看视频| 美女视频网站免费播放视| 国模小丫大尺度啪啪人体| 黄色在线播放网站| 国产h视频在线观看网站免费| 操她视频网站| 日本一区高清视频| 在线色| 五月六月伊人狠狠丁香网| 亚洲福利一区福利三区| 轻点灬大ji巴太粗太大了小说 | 国产免费卡1卡2卡| 欧美日本一区二区三区| 美女流白浆网站| 丁香婷婷影院| 天天插天天爽| 2021久久天天躁狠狠躁夜夜| 久久观看午夜精品| 天天操夜操| 国产午夜精品久久久久九九| 欧美乱理伦另类视频| 亚洲a视频在线| 亚洲成在人线久久综合| 日本大片免a费观看在线| 久久久综合视频| 伊人黄色| 俺要操| 国产免费久久| 日日夜夜噜| 国产91丝袜在线播放九色| 手机免费在线视频| 欧美18在线| 夜夜春色| 伦理一区二区三区| 夜夜爱夜夜爽| 2018天天干天天射| 曰本性l交片视频视频| 欧美三级日韩三级| 亚洲偷自偷白图片| 啪啪午夜|