一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

?

開(kāi)始信號(hào)

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

SCL 為高電平期間,SDA 由高到低表示開(kāi)始信號(hào)。

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

?

結(jié)束信號(hào)

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

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

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

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

?

數(shù)據(jù)位

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

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

?

應(yīng)答位

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

    【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】I2C讀取EEPROM(一)

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

    iic協(xié)議的主從設(shè)備配置

    。 I2C協(xié)議概述 I2C協(xié)議的基本特性包括: 多主機(jī)支持 :多個(gè)主設(shè)備可以控制同一總線。 多從機(jī)支持 :多個(gè)從設(shè)備可以連接到同一總線。 地址識(shí)別 :每個(gè)從
    的頭像 發(fā)表于 02-05 11:42 ?1081次閱讀

    I2C總線設(shè)備地址設(shè)置方法

    I2C總線是一種廣泛使用的串行通信協(xié)議,它允許多個(gè)設(shè)備在兩條線上(數(shù)據(jù)線SDA和時(shí)鐘線SCL)進(jìn)行通信。每個(gè)設(shè)備都有一個(gè)唯一的地址,以確保數(shù)據(jù)能夠正確地發(fā)送到目標(biāo)
    的頭像 發(fā)表于 01-17 15:17 ?4193次閱讀

    決定IP地址的是電腦主機(jī)還是網(wǎng)絡(luò)?

    要搞清楚這個(gè)問(wèn)題,首先要明確一點(diǎn)就是IP地址它本身是用于標(biāo)識(shí)網(wǎng)絡(luò)中的設(shè)備或接口的邏輯地址,一般是有IPv4和IPv6兩種。 進(jìn)一步講,IP地址并不是電腦
    的頭像 發(fā)表于 11-25 10:32 ?3948次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-i2c與從設(shè)備通訊編程示例之i2c硬件原理

    無(wú)論是主機(jī)還是從機(jī),當(dāng)i2c設(shè)備接受一個(gè)字節(jié)數(shù)據(jù)后,會(huì)在下一個(gè)時(shí)鐘發(fā)送1個(gè)應(yīng)答,發(fā)送的數(shù)據(jù)為0
    發(fā)表于 10-29 16:29

    飛凌嵌入式ElfBoard ELF 1板卡-i2c與從設(shè)備通訊編程示例之i2c硬件原理

    無(wú)論是主機(jī)還是從機(jī),當(dāng)i2c設(shè)備接受一個(gè)字節(jié)數(shù)據(jù)后,會(huì)在下一個(gè)時(shí)鐘發(fā)送1個(gè)應(yīng)答,發(fā)送的數(shù)據(jù)為0
    發(fā)表于 10-28 08:58

    通過(guò)TMS320C6655的I2C接口配置PCM1864時(shí),PCM1864無(wú)應(yīng)答是怎么回事?

    地址分別是0x94和0x96, 通過(guò)I2C接口初始化AIC3106時(shí)沒(méi)有任何問(wèn)題,發(fā)送的從設(shè)備地址是0x18;
    發(fā)表于 10-14 07:06

    PCM2912A 聲卡通過(guò)USB連接到電腦,設(shè)備的顯示名及硬件ID地址是否可以修改?

    PCM2912A 聲卡 通過(guò) USB 連接 到 電腦,設(shè)備的顯示名 及 硬件ID 地址 是否可以修改?? 如果可以修改的話請(qǐng)教下方法 。謝謝
    發(fā)表于 10-09 06:35

    外部設(shè)備必須通過(guò)什么與主機(jī)

    外部設(shè)備(外設(shè))必須通過(guò)特定的接口與主機(jī)進(jìn)行連接和通信。這些接口可以是物理的,也可以是邏輯的,它們確保了數(shù)據(jù)、控制信號(hào)和狀態(tài)信息能夠在主機(jī)和外設(shè)之間有效傳輸。 物理接口 : 串行接口
    的頭像 發(fā)表于 09-30 14:16 ?1390次閱讀

    usb主機(jī)模式和設(shè)備模式的區(qū)別

    : USB主機(jī)模式 在USB主機(jī)模式下,計(jì)算機(jī)或其他設(shè)備扮演主機(jī)的角色,負(fù)責(zé)管理USB總線上的通信。主機(jī)控制數(shù)據(jù)流,包括初始化連接、傳輸數(shù)據(jù)
    的頭像 發(fā)表于 09-25 09:06 ?2399次閱讀

    EEPROM的地址怎么確定

    關(guān)于EEPROM(Electrically Erasable Programmable Read-Only Memory,電可擦可編程只讀存儲(chǔ)器)的地址確定,涉及多個(gè)方面,包括設(shè)備地址
    的頭像 發(fā)表于 09-05 10:53 ?3744次閱讀

    【龍芯2K0300蜂鳥(niǎo)板試用】+IIC設(shè)備讀取陀螺儀數(shù)據(jù)

    I2C 設(shè)備的器件地址訪問(wèn)指定的 I2C 設(shè)備了,一個(gè) I2C 總線連接多個(gè) I2C 設(shè)備。 幀起始:I2C 通信起始標(biāo)志,通過(guò)這個(gè)起始
    發(fā)表于 08-17 21:02

    工業(yè)設(shè)備IP地址沖突如何通過(guò)NAT網(wǎng)關(guān)解決

    已經(jīng)陷入枯竭,IP地址重復(fù)便有可能導(dǎo)致數(shù)據(jù)送錯(cuò),通信網(wǎng)絡(luò)便會(huì)出現(xiàn)故障,無(wú)論是廣域網(wǎng)還是局域網(wǎng)都有可能面對(duì)到IP沖突的問(wèn)題。 對(duì)此,物通博聯(lián)提供基于NAT網(wǎng)關(guān)的解決方案。網(wǎng)關(guān)可以通過(guò)WAN和LAN多個(gè)接口形成不同防火墻區(qū)域,從而對(duì)設(shè)備
    的頭像 發(fā)表于 08-07 15:21 ?692次閱讀
    工業(yè)<b class='flag-5'>設(shè)備</b>IP<b class='flag-5'>地址</b>沖突如何<b class='flag-5'>通過(guò)</b>NAT網(wǎng)關(guān)解決