I2C通信協議

I2C通信協議

項目要求是,通過通信線,是實現單片機讀寫外掛模塊寄存器的功能,至少實現,在指定位置寫寄存器和在指定位置讀寄存器,實現了讀寫寄存器,就實現對模塊的控制。
在這里插入圖片描述
MPU6050,OLED,AT24C02(存儲器模塊),DS3231(實時時鐘模塊)

一主多從指單片機作為主機主導I2C總線的運行,掛載在I2C總線上的所有設備都是從機,只有主機允許才可以控制I2C總線;多主多從是指多個主機,任何一個模塊都可以作為主機,當沖突時對其進行仲裁,誰勝利誰成為主機。

作為一個通信協議,I2C必須在硬件和軟件上作出規定。硬件上的規定包括電路的連接方式、端口的輸入輸出模式等;軟件上的規定包括時序的定義、字節的傳輸方式、高位先行還是低位先行等。這些硬件和軟件的規定結合起來構成了一個完整的通信協議。

硬件電路

在這里插入圖片描述

在這里插入圖片描述
主機永遠擁有SCL時鐘線的控制權,在空閑時可以主動操控SDA線,也可以將SDA線的控制權交給從機;從機權力較小,永遠只能被動的讀取SCL線,不允許控制,從機不允許主動發起對SDA的控制,只有在主機發送從機讀取的命令后或者從機應答的時候從機才能短暫的取得SDA的控制權。這就是一主多從模型中協議的規定。

如果總線時序沒有協調好,就極有可能發生兩個引腳同時處于輸出的狀態。如果此時一個引腳輸出高電平,一個引腳輸出低電平,就會造成電源短路的情況,這是要極力避免的。

為了避免這種情況,I2C的設計規定所有設備不輸出強上拉的高電平,而是采用外置弱上拉電阻加開漏輸出的電路結構。這兩點規定對應于前面提到的“設備的SCL和SDA均要配置成開漏輸出模式”以及“SCL和SDA各添加一個上拉電阻,阻值一般為4.7KΩ左右”。對應上面這個圖。

引腳內部結構圖

在這里插入圖片描述
圖左側展示的是SCL的結構,其中SClk代表SCL;右側則是SDA的結構,其中DATA代表SDA。

引腳的信號輸入都可以通過一個數據緩沖器或施密特觸發器進行,因為輸入對電路無影響,所以任何設備在任何時刻都可以輸入。然而,在輸出部分,采用的是開漏輸出的配置。

輸出低電平,這個開關管導通,引腳直接接地,是強下拉,輸出高電平,這個開關管斷開,引腳什么都不接,處于浮空狀態,這樣的話,所有的設備都只能輸出低電平而不能輸出高電平,為了避免高電平造成的引腳浮空,這時就需要在總線外面,SCL和SDA各外置一個上拉電阻,這是通過一個電阻拉到高電平的,所以這是一個弱上拉。

  • 第一,完全杜絕了電源短路現象,保證電路的安全。
    第二,避免了引腳模式的頻繁切換。開漏加弱上拉的模式,同時兼具了輸入和輸出的功能。因為開漏模式下,輸出高電平就相當于斷開引腳,所以在輸入之前,可以直接輸出高電平,不需要再切換成輸入模式了。
    第三,就是這個模式會有一個“線與”的現象。就是只要有任意一個或多個設備輸出了低電平總線就處于低電平,只有所有設備都輸出高電平,總線才處于高電平。
    I2C可以利用這個電路特性執行多主機模式下的時鐘同步和總線仲裁,所以這里SCL雖然在一主多從模式下可以用推挽輸出,但是它仍然采用了開漏加上拉輸出的模式,因為在多主機模式下會利用到這個特征。

I2C時序基本單元

在這里插入圖片描述
起始條件是指SCL高電平期間,SDA從高電平切換到低電平。在I2C總線處于空閑狀態時,SCL和SDA都處于高電平狀態,由外掛的上拉電阻保持。當主機需要數據收發時,會首先產生一個起始條件。這個起始條件是,SCL保持高電平,然后把SDA拉低,產生一個下降沿。當從機捕獲到這個SCL高電平,SDA下降沿信號時,就會進行自身的復位,等待主機的召喚。之后,主機需要將SCL拉低。這樣做一方面是占用這個總線,另一方面也是為了方便這些基本單元的拼接。這樣,除了起始和終止條件,每個時序單元的SCL都是以低電平開始,低電平結束。

**終止條件是,SCL高電平期間,**SDA從低電平切換到高電平。SCL先放開并回彈到高電平,SDA再放開并回彈高電平,產生一個上升沿。這個上升沿觸發終止條件,同時終止條件之后,SCL和SDA都是高電平,回歸到最初的平靜狀態。這個起始條件和終止條件就類似串口時序里的起始位和停止位。一個完整的數據幀總是以起始條件開始、終止條件結束。另外,起始和終止都是由主機產生的。因此,從機必須始終保持雙手放開,不允許主動跳出來去碰總線。如果允許從機這樣做,那么就會變成多主機模型,不在本節的討論范圍之內。這就是起始條件和終止條件的含義。

發送一個字節
在這里插入圖片描述
主機拉低SCL,把數據放在SDA上,主機松開SCL,從機讀取SDA的數據。
在SCL的同步下,依次進行主機發送和從機接收,循環8次,就發送了8位數據,也就是一個字節,另外注意,這里是高位先行,所以第一位是一個字節的最高位B7,然后依次是次高位B6…最后是B0。(串口時序是低位先行,I2C是高位先行)
另外,由于這里有時鐘線進行同步,所以如果主機一個字節發送一半,突然進中斷,不操作SDA,SCL,那時序就會在中斷不斷拉長,SDA,SCL電平都暫停變化,傳輸也暫停,等中斷結束后,主機繼續回來操作,傳輸仍然不會出問題,這就是同步時序的好處。

接收一個字節
在這里插入圖片描述
發送應答和接收應答

在這里插入圖片描述

I2C的完整時序

主要有指定地址寫,當前地址讀和指定地址讀這3種。
I2C總線上每個從機都確定一個唯一的設備地址,主機在起始條件之后會先發送一個字節確認相應的設備地址,相應的設備響應之后的讀寫操作,MPU6050地址為1101000

在這里插入圖片描述
首先,SCL高電平期間,拉低SDA,產生起始條件(start,s),在起始條件后,緊跟著時序,必須是發送一個字節的時序,字節的內容,必須是從機地址+讀寫位,正好從機地址是7位,讀寫位是1位,加起來是1個字節,8位,發送從機地址,就是確定從機的對象。發送讀寫位,就是確認接下來要寫入還是讀出。在這里低電平期間,SDA變換數據,高電平期間,從機讀取SDA。綠色的線,標明從機得到的數據。然后就是1101000,0表示之后的時序主機要進行寫操作,1表示之后的時序主機要進行讀出操作,這里是0說明之后要進行寫操作。
那這里,目前主機是發送一個字節,字節的內容轉換為16進制,高位先行,就是0xD0,然后根據協議規定,緊跟著單元是,就是接收從機的應答位,在這個時刻,主機要釋放SDA,釋放SDA后,引腳電平回彈到高電平,但是根據協議規定,從機要在這個位拉低SDA,所以從機的波形是這樣的,該應答的時候,從機立刻拽住SDA,然后應答結束后,從機在放開SDA,現在綜合兩者的波形,結合線與的特性,在主機釋放SDA后,由于SDA被從機拽住了,SDA沒有回彈高電平,這個過程代表從機產生了應答。

在這里插入圖片描述
在這里插入圖片描述

首先,SCL高電平期間,拉低SDA,產生起始條件(start,s),起始條件開始后,主機必須首先調用發送一個字節,來進行從機的尋址和指定讀寫標志位。圖示的波形,表示本次尋址的目標是1101 000的設備,同時最后一位,讀寫標志為1,表示主機接下來想要讀取數據,緊跟著,發送一個字節后,接收一下從機的應答位。從機應答0,代表從機收到一個字節。
在從機應答后,從這里開始,數據的傳輸方向就要反過來了,因為主機發出了讀的命令,所以之后,主機就不能繼續發送了,要把SDA控制權交給從機,主機調用接收一個字節的操作,進行接收操作。

指定地址讀=指定地址寫+當前地址讀
在這里插入圖片描述
該時序下從中間紅線分割,前半部分為指定地址寫在寫之前的時序,后半部分為當前地址讀的時序,因為在前半部分中指定了地址,所以可以讀出指定地址的數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22109.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ARM】Fusa Compiler 6.16 LTS的安全認證報告獲取

【更多軟件使用問題請點擊億道電子官方網站】 1、 文檔目標 了解ARM的Arm Compiler for Embedded FuSa 6.16 LTS的安全認證證書和報告的獲取 2、 問題場景 對于使用了ARM DS Gold/Platinum、MDK pro或者Arm Compiler for Embedded FuSa 6.16 LTS產品的客戶。在對于最終的產品…

生產問題排查:springboot項目啟動時注冊nacos失敗或運行時從nacos閃退

文章目錄 一、引出問題二、解決方案1、使用actuator健康檢查2、項目啟動時判斷nacos是否正常連接3、k8s設置探針 一、引出問題 生產項目是用k8s部署的,最近經常遇到啟動時注冊不到nacos(查找nacos的host地址找不到),或者運行的好…

有文字轉語音真人發聲嗎?這5個配音工具堪比真人配音

青春是一首永不老去的歌,它鐫刻在生命的唱片上,永不退色。 每當我們聽到那些熟悉的旋律,心中總會涌起一股暖流,仿佛回到了那個充滿活力和夢想的年代。借助現代科技的力量,我們可以通過文字轉語音軟件,讓這…

.NET集成DeveloperSharp實現圖片的裁剪、縮放、與加水印

🏆作者:科技、互聯網行業優質創作者 🏆專注領域:.Net技術、軟件架構、人工智能、數字化轉型、DeveloperSharp、微服務、工業互聯網、智能制造 🏆歡迎關注我(Net數字智慧化基地),里面…

Apache Doris 基礎 -- 數據表設計(表索引)

1、索引概述 索引用于幫助快速過濾或搜索數據。目前,Doris支持兩種類型的索引:內置智能索引和用戶創建的二級索引。 內置智能索引 排序鍵和前綴索引:Apache Doris基于排序鍵以有序的方式存儲數據。它為每1024行數據創建一個前綴索引。索引中的鍵是當前1024行組的…

github搭建個人博客

準備工作 windows安裝nodejs windows安裝git windows安裝hexo 擁有gitee個人賬戶 配置信息 通過gitee創建博客倉庫 登錄gitee平臺,進入主界面,右側加號,新建倉庫,注意:倉庫名稱和gitee用戶名稱一致 生成/添加 SSH 公…

初級網絡工程師之入門到入獄(一)

本文是我在學習過程中記錄學習的點點滴滴,目的是為了學完之后鞏固一下順便也和大家分享一下,日后忘記了也可以方便快速的復習。 網絡工程師從入門到入獄 前言一、交換機二、路由器三、DHCP(動態主機配置協議)四、路由器配置 DHCP自…

【golang】go語言讀取Excel表格中的數據

導入庫基本用法封裝 在Go語言中,可以使用第三方庫來讀取Excel文件。 常用的庫是github.com/tealeg/xlsx,提供了處理Excel文件的功能。 導入庫 首先,安裝"github.com/tealeg/xlsx"庫。可以通過以下命令在終端中安裝: g…

Transformer系列:Greedy Search貪婪搜索解碼流程原理解析

解碼器預測流程簡述 Encoder-Decoder這類框架需要在解碼器中分別拿到前文已經翻譯的輸入,以及編碼器的輸出這兩個輸入,一起預測出下一個翻譯的單詞。在訓練階段,一個句子通過右移一位的方式轉化為從第二個詞到最后一個詞的逐位預測任務&…

Springboot vue elementui 前后端分離 事故災害案例管理系統

源碼鏈接 系統演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

【Golang】go語言寫入數據并保存Excel表格

導入包創建文件添加表格添加行添加單元格保存文件封裝 導入包 首先,安裝github.com/tealeg/xlsx庫。可以通過以下命令在終端中安裝: go get github.com/tealeg/xlsx創建文件 指定好文件的名字 fileName : "D:\\a.xlsx"再判斷文件是否存在&…

Java集合概述

分類 分為兩大類:Collection接口類和Map接口類 這兩個接口都繼承自一個共同的接口:Iterable接口,意為可迭代的 Iterable接口當中有一個Iterator迭代器接口對象,作為接口的變量(public static final修飾)…

Win10字體模糊?記好這5個方法,解決問題很簡單!

“我的電腦是win10的,不知道是什么原因,電腦字體總是很模糊,大家有什么方法可以解決這個問題嗎?” 在數字時代的浪潮中,Win10以其出色的性能和豐富的功能贏得了廣大用戶的青睞。然而,就像任何一款操作系統一…

廣東電網突破2億千瓦,華火新能源電燃灶引領綠色烹飪“灶”未來

近日,廣東電網統調裝機容量歷史性突破2億千瓦,標志著廣東省在電力發展上邁出了堅實的步伐。這一重大成就不僅彰顯了廣東在能源領域的強勁實力,也為華火新能源電燃灶等綠色技術的普及應用提供了有力的支撐。 廣東電網統調裝機容量的突破&#…

用ffmpeg對視頻添加語音、背景音樂和字幕的方法

先看代碼: ffmpeg.exe ^ -i "D:/test/video.mp4" ^ -i "D:/test/voice.mp3" ^ -i "D:/test/music.mp3" ^ -i "D:/test/voice.srt" ^ -filter_complex "[1:a]volume1.0,asetptsPTS-STARTPTS[a_voice];[2:a]volume0.5,…

【 0 基礎 Docker 極速入門】鏡像、容器、常用命令總結

Docker Images(鏡像)生命周期 Docker 是一個用于創建、部署和運行應用容器的平臺。為了更好地理解 Docker 的生命周期,以下是相關概念的介紹,并說明它們如何相互關聯: Docker: Docker 是一個開源平臺&#…

重生奇跡mu五大王國

勇者大陸王國 奇跡大陸的戰士,他們因為非常重視劍,而且穿著黑色的衣服,所以叫他們魔劍士。古代勇者大陸王國的魔劍士們都是用鎧甲偽裝自己的。但是這些個聯合國統一成一個帝國之后,勇者大陸王國漸漸成為一個小城市。千年之后的現…

數據持久化第七課-URL重寫與Ajax

數據持久化第七課-URL重寫與Ajax 一.預習筆記 1.URL重寫(對網頁地址進行保護) 首先編寫module,實現對網絡地址的處理 其次就是module的配置 最后驗證url重寫技術 2.Ajax數據交互 編寫后端響應數據 處理跨域的配置問題 運行項目得到后端響應數據的地址 編寫前端ajax進行數據請…

程序人生 - 前端拿到后端數據,不能直接用還要再處理,合理嗎?

前言 從后端拿到的 list 是散的,需要前端遍歷 list 根據 item 的某些屬性把同類型的 item 合并到一個 list 中,這樣合理嗎?我覺得這個不是應該在后端完成的嗎? 這種撕扯,讓我想起很久之前的一個笑話。我有個朋友之前…

EXCEL上傳得時候特殊情況

比如excel里面不全是我們需要的,還有一些需要處理EXCEL中的日期,去掉‘-’等 DATA:begin_row TYPE i VALUE 2,begin_col TYPE i VALUE 1,end_row TYPE i VALUE 9999,end_col TYPE i VALUE 90,filename TYPE rlgrap-filename,gt_excel TYPE zalsme…