91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

lhl545545 ? 來源:玩轉(zhuǎn)單片機(jī) ? 作者:玩轉(zhuǎn)單片機(jī) ? 2020-06-11 16:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

I2C(Inter-Integrated Circuit BUS) 集成電路總線,該總線由 NXP(原 PHILIPS)公司設(shè)計,多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場合使用,傳輸距離短,任意時刻只能有一個主機(jī)等特性。連接到總線的 IC 數(shù)量只是受到總線的最大負(fù)載電容 400pf 限制。

I2C 支持 0kHz~5MHz 的設(shè)備:

普通模式(100kHz)、快速模式(400kHz)、快速模式+(1MHz)、高速模式(3.4MHz)和超高速模式(5MHz)。

兩根數(shù)據(jù)線:SDA,SCL,均為漏級開路結(jié)構(gòu)。一般接上拉電阻,形成“線與”邏輯(只要一方為低電平,則此線即為低電平)。當(dāng) SDA,SCL 為高電平時,表示總線空閑。一般來說,主機(jī)發(fā)起傳輸之前都要檢查總線的電平狀態(tài)(稱為仲裁),以確定是否進(jìn)行數(shù)據(jù)傳輸(當(dāng)總線上只有一個主機(jī)時,可以不用)。如果 I/O 口既能輸入也能輸出,可以配置成開漏輸出,但是必須外接拉電阻;如果 I/O 不能配置成開漏輸出,則可以轉(zhuǎn)換 I/O 輸入輸出方向,輸出采用推挽輸出,輸入使用上拉輸入即可。注意使用轉(zhuǎn)換方向的方式時必須先轉(zhuǎn)換方向之后才開始釋放總線。

支持多主控,但是同一時間只能有一個主控。每個設(shè)備都有自己的設(shè)備地址(共 7bit,有的是 10bit),用于區(qū)分掛在在總線上的設(shè)備,廣播地址 0x00。最低位用于讀寫控制位,1 表示讀數(shù)據(jù),0 表示寫數(shù)據(jù)。”

?

開始信號

當(dāng)開始進(jìn)行一次數(shù)據(jù)傳輸時,需要向從設(shè)備發(fā)送一個開始信號,表示數(shù)據(jù)傳輸開始。

SCL 為高電平期間,SDA 由高到低表示開始信號。

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

?

結(jié)束信號

當(dāng)結(jié)束一次傳輸時,需要發(fā)送結(jié)束信號

SCL 為高電平期間,SDA 由低到高表示結(jié)束信號。

(若主機(jī)在對一個從機(jī)操作之后,若主機(jī)希望繼續(xù)占用總線進(jìn)行新的數(shù)據(jù)傳送,則可以不產(chǎn)生終止信號,馬上再次發(fā)出起始信號對另一從機(jī)進(jìn)行尋址)

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

?

數(shù)據(jù)位

當(dāng)傳輸數(shù)據(jù)位時,在 SCL 為低時改變 SDA,在 SCL 為高時保持 SDA 穩(wěn)定。高位先傳輸。

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

?

應(yīng)答位

數(shù)據(jù)的第 9 位為應(yīng)答位。

應(yīng)答:第 9 個 CLK 時鐘為高電平期間,如果 SDA 為為低電平,則為應(yīng)答信號。

非應(yīng)答:第 9 個 CLK 時鐘為高電平期間,如果 SDA 為為高電平,則為非應(yīng)答信號。

主機(jī)每向從機(jī)發(fā)送一個字節(jié)數(shù)據(jù),從機(jī)都需要發(fā)送一個應(yīng)答信號,而主機(jī)每接收一個字節(jié)都需要發(fā)送一個應(yīng)答信號,當(dāng)主機(jī)不準(zhǔn)備接收下一個字節(jié)時,發(fā)送一個非應(yīng)答信號,也就是說,非應(yīng)答信號是由主機(jī)發(fā)送的,從機(jī)只能發(fā)送應(yīng)答信號。應(yīng)答位的數(shù)據(jù)狀態(tài)則遵循“誰接收誰產(chǎn)生”的原則,即總是由接收器產(chǎn)生應(yīng)答位

可以通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在。

注意:任何在 SCL 為高電平期間的 SDA 上的電平改變都會被認(rèn)為是起始或者停止信號,所以數(shù)據(jù)線 SDA 必須要在時鐘線 SCL 為低電平時改變。

如下為傳輸一個字節(jié)的情況:

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

所有數(shù)據(jù)傳輸?shù)陌l(fā)起者都是主設(shè)備,從設(shè)備只能被動接受主設(shè)備的請求。

實際上發(fā)送一個字節(jié)之后就馬上發(fā)送停止信號一般是不能實現(xiàn)一次完整的數(shù)據(jù)傳輸?shù)?,那么正常傳輸流程?yīng)該是怎樣的呢?

因為 I2C 總線上可能掛在了很多設(shè)備,所以首先需要在總線上發(fā)送一個設(shè)備地址,并且指明本次傳輸?shù)姆较?。然后又因為一個設(shè)備里面有很多寄存器,所以還要再發(fā)送一個寄存器地址,最后才是發(fā)送寄存器的內(nèi)容。

? 發(fā)送數(shù)據(jù)(橘色為從機(jī)發(fā)送應(yīng)答位)

? 接收數(shù)據(jù)(灰色部分為主機(jī)應(yīng)答)

以上這些理論知識只是和 I2C 有關(guān)的,實際使用的時候根據(jù)驅(qū)動器件的不同又會有所不同。比如 AT2402,只能連續(xù)發(fā)送 8 個字節(jié)的寄存器內(nèi)容(類似 8 字節(jié)緩存),下次再發(fā)送的話需要重新發(fā)送開始信號,另外,進(jìn)行下一次數(shù)據(jù)的傳輸時,需要延時一段時間,讓器件將 8 字節(jié)緩存的內(nèi)容實際寫入 EEPROM 中才可,否則會將緩存內(nèi)容覆蓋,導(dǎo)致寫入錯誤。

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

通過編寫 I2C 驅(qū)動程序,并利用 KEIL仿真功能可以得到如下波形:

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

這是一個發(fā)送設(shè)備地址 0xA0 的波形,因為沒有從機(jī),所以在第 9 個 CLK 的高電平期間 SDA 為高。當(dāng)總線上有設(shè)備地址為 0xA0 的從機(jī)時,SDA 應(yīng)被從機(jī)設(shè)置為低電平。

以上知識實際上是比較簡單的,基礎(chǔ)的,適合用于單主機(jī)的情況下,如果是多主機(jī)通信,遠(yuǎn)比單主機(jī)復(fù)雜的多,涉及到時鐘同步和總線仲裁,有興趣的同學(xué)可以自行研究。

更多關(guān)于 I2C 的問題,可以查閱《I2C 總線規(guī)范》。

關(guān)于總線死鎖問題:

“總線死鎖主要是因為主從設(shè)備中的主機(jī)異常復(fù)位造成從機(jī)始終處于應(yīng)答狀態(tài)(應(yīng)答狀態(tài)時 SDA 為低電平,只有在 SCL 變?yōu)榈碗娖降臅r候,才會變?yōu)楦唠娖?,從而釋?SDA),解決方案可在鏈接中找到。”

STM32 的硬件 I2C 有缺陷,但是可以通過一些方法避免,具體尋找網(wǎng)上的方法。

一直以為可以連續(xù)寫入數(shù)據(jù),每寫入一個數(shù)據(jù)加入寫入延時,給 EEPROM 寫入時間,當(dāng)寫完最后一個數(shù)據(jù)之后發(fā)送一個寫入停止信號即可,可實際是上是必須要有一個停止信號,EEPROM 在收到這個停止信號后才會進(jìn)行寫寫入操作,否則必然導(dǎo)致寫入出錯。正是因為有這樣錯誤的認(rèn)識,所以在讀取數(shù)據(jù)的時候讀出的數(shù)據(jù)和自己想要的數(shù)據(jù)不一致,而這個數(shù)據(jù)剛好用于指針索引,好巧不巧的是因為這指針錯誤的指向,剛好將某個函數(shù)指針地址改變了,導(dǎo)致程序一直運行不正常。后來花了半天時間調(diào)試,才發(fā)現(xiàn)了函數(shù)指針數(shù)據(jù)被更改。但是我又奇怪為什么我的程序又能運行(正是因為能運行而不是直接死在某一個地方,才讓自己尋找 bug 的方向錯了)。后來才想通,雖然我的函數(shù)指針指向錯誤,運行出錯,但是因為我開啟了看門狗,所以當(dāng)函數(shù)運行出錯后,程序無法喂狗,導(dǎo)致成程序自動復(fù)位,又重新運行了,但是表明上看程序又運行到起來了,實際上呢,它已經(jīng)從程序的最開始重新運行了。記錄此教訓(xùn),以提醒后來人。

還有一點就是單字節(jié)寫入數(shù)據(jù)效率特別低,如果寫入數(shù)據(jù)超過兩個字節(jié),在內(nèi)存足夠的情況下,最好開啟一個頁緩沖區(qū),以加快寫入速度。但是如果你認(rèn)為寫入數(shù)據(jù)是你可以接受的,那么不需要這個頁緩沖區(qū)了,畢竟一旦加入頁緩沖,也是要加入不少邏輯去維護(hù)的。

再介紹一個頁寫入的算法,之前看了一些頁寫入的算法,發(fā)現(xiàn)實在是太麻煩了。我就在想肯定有一種更為簡單的算法的,直到這次更新筆記的時候才偶然發(fā)現(xiàn)了該算法。

主機(jī)通過發(fā)送設(shè)備地址后由應(yīng)答位確定該設(shè)備是否存在

自行理解吧,不是很難的邏輯思路。
責(zé)任編輯:pj

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

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    bk3633 usb 設(shè)備如何讀取主機(jī)向端點0 發(fā)送數(shù)據(jù)包

    bk3633 usb 設(shè)備如何讀取主機(jī)向端點0 發(fā)送數(shù)據(jù)包
    發(fā)表于 12-30 13:03

    I2C的總線協(xié)議

    用狀態(tài)。 I2C 通信采用主從結(jié)構(gòu),并由主機(jī)發(fā)起和結(jié)束通信。主機(jī)通過發(fā)送 START 起始信號來發(fā)起通信,之后發(fā)送SLA+W/R 共 8b
    發(fā)表于 12-15 08:07

    I2C使用10地址進(jìn)行主機(jī)發(fā)送從機(jī)接收

    I2C使用10地址進(jìn)行主機(jī)發(fā)送從機(jī)接收 示例下載 目的:演示AT32F403Axx I2C使用10
    發(fā)表于 11-19 13:10

    I2C使用10地址進(jìn)行主機(jī)接收從機(jī)發(fā)送

    I2C使用10地址進(jìn)行主機(jī)接收從機(jī)發(fā)送 示例下載 目的:演示AT32F403Axx I2C使用10
    發(fā)表于 11-19 13:07

    如何判斷通信問題是否設(shè)備故障引起?

    判斷通信問題是否由 “設(shè)備故障” 引起,核心邏輯是“聚焦設(shè)備本身的‘硬件狀態(tài)、軟件配置、通信交互能力’,通過‘孤立測試 + 替換驗證 + 故障定位’,排除鏈路、干擾、配置等外部因素,確
    的頭像 發(fā)表于 09-25 14:19 ?1640次閱讀
    如何判斷通信問題<b class='flag-5'>是否</b>由<b class='flag-5'>設(shè)備</b>故障引起?

    STM32G070 I2C主機(jī)發(fā)送設(shè)備地址讀測試是否產(chǎn)生stop

    程序主機(jī)配置NBYTES為0,AUTOEND為自動結(jié)束模式,發(fā)起讀,抓波形發(fā)現(xiàn)不會產(chǎn)生stop,是什么原因? 調(diào)用的函數(shù)是: if (HAL_I2C_Master_Receive_IT(&
    發(fā)表于 08-15 08:09

    STM32G070 I2C主機(jī)發(fā)送設(shè)備地址讀寫,測試從機(jī)是否應(yīng)答?

    程序主機(jī)配置NBYTES為0,AUTOEND為自動結(jié)束模式,發(fā)起讀寫,發(fā)現(xiàn)不會產(chǎn)生stop,是這樣的嗎?
    發(fā)表于 08-13 08:23

    【沁恒CH585開發(fā)板免費試用體驗】I2C 讀寫EEPROM (一)

    地址后,主機(jī)或從機(jī)會返回一個應(yīng)答(A)或非應(yīng)答信號,只有接收到應(yīng)答信號后,主機(jī)才能繼續(xù)
    發(fā)表于 08-05 22:09

    如何通過CYUSB3014的設(shè)備寄存器讀取主機(jī)發(fā)起的數(shù)據(jù)傳輸?shù)腁CK?如何通過寄存器讀取主機(jī)發(fā)送的復(fù)位命令?

    IN 事務(wù)。那么,可以讀取哪個寄存器來確認(rèn)設(shè)備是否收到了用于發(fā)起 IN 事務(wù)的第一個 ACK 數(shù)據(jù)包? 2. 主機(jī)端遠(yuǎn)程復(fù)位設(shè)備芯片使用哪個寄存器?讀取
    發(fā)表于 07-15 06:20

    CYW43907如果將SECURE_BIT設(shè)置為 1,設(shè)備上的USB和HSIC接口是否被禁用?

    SECURE_BIT 設(shè)置為 1,設(shè)備上的 USB 和 HSIC 接口是否被禁用,或者文檔是否不正確? 如果它是準(zhǔn)確的,這種行為是否會在特定的硅片修訂版中發(fā)生? 我們?nèi)绾?/div>
    發(fā)表于 07-09 07:19

    從零開始學(xué)IP地址

    IP地址是一種網(wǎng)絡(luò)編碼,用來唯一標(biāo)識網(wǎng)絡(luò)中的設(shè)備,以確保主機(jī)間正常通信。IP地址由32二進(jìn)制(32-bit)組成。
    的頭像 發(fā)表于 07-08 09:29 ?1941次閱讀
    從零開始學(xué)IP<b class='flag-5'>地址</b>

    使用CY7C65211將溫度傳感器讀出的I2C信號轉(zhuǎn)為USB信號,再連到電腦主機(jī)上,怎么設(shè)置其他從設(shè)備地址呢?

    地址位在哪里設(shè)置,比如0x44。用戶指南里提到的Slave Address (Slave mode only) 設(shè)置,是指從模式時設(shè)置自身的地址嗎?如果主模式,怎么設(shè)置其他從設(shè)備
    發(fā)表于 05-30 07:09

    使用 cy7c65216 作為主設(shè)備, MULTICH_CONNECT_PCB具有不同從設(shè)備地址的多個從設(shè)備

    請介紹一下 cy7c65216。 是否可以配置一個電路,使用 cy7c65216 作為主設(shè)備, MULTICH_CONNECT_PCB具有不同從設(shè)備地址的多個從
    發(fā)表于 05-23 06:33

    CYPD3177 I2C通信無應(yīng)答怎么解決?

    SOC端通過I2C與CYPD3177進(jìn)行通信,在讀芯片ID時(0x0002寄存器),主機(jī)發(fā)送數(shù)據(jù)后無應(yīng)答。目前SOC端和CYPD3177只連接了兩根I2C線,一根地線和3.3V供電。硬
    發(fā)表于 05-12 07:10

    【RA-Eco-RA4M2開發(fā)板評測】I2C讀取EEPROM(一)

    或者10,當(dāng)主機(jī)廣播的地址與某個設(shè)備相同地址時,這個設(shè)備就被選中了。 :傳輸方向選擇
    發(fā)表于 04-28 23:13