日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《STM32从零开始学习历程》——I2C协议层

發(fā)布時(shí)間:2024/1/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《STM32从零开始学习历程》——I2C协议层 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

《STM32從零開始學(xué)習(xí)歷程》@EnzoReventon

I2C理論部分——協(xié)議層

相關(guān)資料:

I2C物理層介紹
I2C固件庫介紹
STM32的I2C特性及架構(gòu)介紹

參考資料:
[野火EmbedFire]《STM32庫開發(fā)實(shí)戰(zhàn)指南——基于野火霸天虎開發(fā)板》
[正點(diǎn)原子]STM32F4開發(fā)指南-庫函數(shù)版本_V1.2
[ST]《STM32F4xx中文參考手冊(cè)》

I2C的協(xié)議規(guī)定了通訊的起始和停止信號(hào)、數(shù)據(jù)有效性、響應(yīng)、仲裁、時(shí)鐘同步和地址廣播等環(huán)節(jié)。
起始和停止信號(hào)指用什么來表示通訊的開始和結(jié)束。
數(shù)據(jù)有效性指在時(shí)鐘線(SCL)某個(gè)電平的時(shí)候?qū)?shù)據(jù)線(SDA)進(jìn)行數(shù)據(jù)采樣。

1. I2C基本讀寫過程

I2C寫過程:


上圖中,打斜杠的部分是指數(shù)據(jù)由主機(jī)傳輸至從機(jī);不打斜杠部分為數(shù)據(jù)由從機(jī)傳輸至主機(jī)。
S表示傳輸開始信號(hào)。
SLAVE_ADDRESS表示從機(jī)地址。
A或者非A表示應(yīng)答(ACK)或者非應(yīng)答(NACK)信號(hào)。
舉個(gè)例子:老師要告訴小明的數(shù)學(xué)成績(jī)。
首先老師說:“我要開始告訴某個(gè)同學(xué)的成績(jī)了。”————這一步被抽象成I2C通訊中的S,表示傳輸開始信號(hào)。
接著,老師點(diǎn)名小明。————這一步被抽象成I2C通訊中的SLAVE ADDRESS,表示從機(jī)地址,就是說老師需要吧成績(jī)告訴小明,小明是一個(gè)對(duì)象,當(dāng)然也就是一個(gè)地址。
老師說:“我要告訴你成績(jī)”————這一步被抽象成I2C通訊中的R/W,在這個(gè)場(chǎng)景中,老師是“主機(jī)”,要告訴小明(從機(jī))他的成績(jī),因此是由主機(jī)寫如從機(jī)。
這時(shí)候,小明回答:“好的。”表示小明已經(jīng)準(zhǔn)備好接收老師即將匯報(bào)的成績(jī)。————這一步被抽象成A,從機(jī)應(yīng)答。這樣可以保證數(shù)據(jù)發(fā)送與接收的準(zhǔn)確性。
老師說:“小明你的數(shù)學(xué)成績(jī)?yōu)?9分。” ————DATE
小明說:“好的老師!” ————A
老師說:“小明你的語文成績(jī)?yōu)?02分。” ————DATE
小明說:“好的老師!” ————A
老師說:“小明你的語文成績(jī)?yōu)?02分。” ————DATE
…………小明沒有應(yīng)答。有可能是他來不及記錄了。 ————非A
老師就停止報(bào)成績(jī)。 ————P
老師報(bào)成績(jī)是當(dāng)著全班的面報(bào)的,大家都可以聽到,老師是主機(jī),各位同學(xué)們就是從機(jī),老師向大家報(bào)小明的成績(jī),其實(shí)就是廣播的概念,但是只能有小明響應(yīng)。

以此類推讀過程也是一樣的。

比如說,老師讓小明報(bào)數(shù)學(xué)和語文的成績(jī)。
老師說:“我要同學(xué)給我報(bào)一下成績(jī)。” ————S,開始標(biāo)志。
老師點(diǎn)名小明。 ————SLAVE ADDRESS,從機(jī)地址。
老師說:“請(qǐng)你報(bào)你的成績(jī)。” ————R/W 讀還是寫,相對(duì)于從機(jī)而言。
小明說:“好的。” ————A 白色底的A,從機(jī)響應(yīng)。
小明說:“數(shù)學(xué):99。” ————DATE,從機(jī)發(fā)送數(shù)據(jù)。
老師說:“好,下一個(gè)。” ————A 條紋底的A,主機(jī)響應(yīng)。
小明說:“語文:102。” ————DATE,從機(jī)發(fā)送數(shù)據(jù)。
老師說:“好的,報(bào)完了請(qǐng)坐。” ————非A,數(shù)據(jù)接收完畢。
結(jié)束。————P,停止標(biāo)志。

I2C復(fù)合讀寫過程:

一般而言,I2C復(fù)合模式第一次通訊是告訴從機(jī)讀寫地址,第二次則是讀寫的實(shí)際內(nèi)容。

詳細(xì)過程:

  • S 表示由主機(jī)的I2C 接口產(chǎn)生的傳輸起始信號(hào)(S),這時(shí)連接到I2C 總線上的所有從機(jī)都會(huì)接收到這個(gè)信號(hào)。
  • 起始信號(hào)產(chǎn)生后,所有從機(jī)就開始等待主機(jī)緊接下來廣播的從機(jī)地址信號(hào)(SLAVE_ADDRESS)。在I2C總線上,每個(gè)設(shè)備的地址都是唯一的,當(dāng)主機(jī)廣播的地址與某個(gè)設(shè)備地址相同時(shí),這個(gè)設(shè)備就被選中了,沒被選中的設(shè)備將會(huì)忽略之后的數(shù)據(jù)信號(hào)。根據(jù)I2C 協(xié)議,這個(gè)從機(jī)地址可以是7 位或10 位
  • 在地址位之后,是傳輸方向的選擇位,該位為0 時(shí),表示后面的數(shù)據(jù)傳輸方向是由主機(jī)傳輸至從機(jī),即主機(jī)向從機(jī)寫數(shù)據(jù)。該位為1 時(shí),則相反,即主機(jī)由從機(jī)讀數(shù)據(jù)。
  • 從機(jī)接收到匹配的地址后,主機(jī)或從機(jī)會(huì)返回一個(gè)應(yīng)答(ACK) 或非應(yīng)答(NACK) 信號(hào),只有接收到應(yīng)答信號(hào)后,主機(jī)才能繼續(xù)發(fā)送或接收數(shù)據(jù)。
  • 若配置的方向傳輸位為“寫數(shù)據(jù)”方向,即第一幅圖的情況,廣播完地址,接收到應(yīng)答信號(hào)后,主機(jī)開始正式向從機(jī)傳輸數(shù)據(jù)(DATA),數(shù)據(jù)包的大小為8 位,主機(jī)每發(fā)送完一個(gè)字節(jié)數(shù)據(jù),都要等待從機(jī)的應(yīng)答信號(hào)(ACK),重復(fù)這個(gè)過程,可以向從機(jī)傳輸N 個(gè)數(shù)據(jù),這個(gè)N 沒有大小限制。當(dāng)數(shù)據(jù)傳輸結(jié)束時(shí),主機(jī)向從機(jī)發(fā)送一個(gè)停止傳輸信號(hào)§,表示不再傳輸數(shù)據(jù)。
  • 若配置的方向傳輸位為“讀數(shù)據(jù)”方向,即第二幅圖的情況,廣播完地址,接收到應(yīng)答信號(hào)后,從機(jī)開始向主機(jī)返回?cái)?shù)據(jù)(DATA),數(shù)據(jù)包大小也為8 位,從機(jī)每發(fā)送完一個(gè)數(shù)據(jù),都會(huì)等待主機(jī)的應(yīng)答信號(hào)(ACK),重復(fù)這個(gè)過程,可以返回N 個(gè)數(shù)據(jù),這個(gè)N 也沒有大小限制。當(dāng)主機(jī)希望停止接收數(shù)據(jù)時(shí),就向從機(jī)返回一個(gè)非應(yīng)答信號(hào)(NACK),則從機(jī)自動(dòng)停止數(shù)據(jù)傳輸。
  • 除了基本的讀寫,I2C 通訊更常用的是復(fù)合格式,即第三幅圖的情況,該傳輸過程有兩次起始信號(hào)(S)。一般在第一次傳輸中,主機(jī)通過SLAVE_ADDRESS 尋找到從設(shè)備后,發(fā)送一段“數(shù)據(jù)”,這段數(shù)據(jù)通常用于表示從設(shè)備內(nèi)部的寄存器或存儲(chǔ)器地址(注意區(qū)分它與SLAVE_ADDRESS 的區(qū)別);在第二次的傳輸中,對(duì)該地址的內(nèi)容進(jìn)行讀或?qū)?/strong>。也就是說,第一次通訊是告訴從機(jī)讀寫地址第二次則是讀寫的實(shí)際內(nèi)容。

1.1 I2C通訊的起始和停止信號(hào)

  • 起始(S) 和停止§ 信號(hào)是兩種特殊的狀態(tài)。
  • 當(dāng)SCL 線是高電平時(shí)SDA 線從高電平向低電平切換,這個(gè)情況表示通訊的起始。
  • 當(dāng)SCL 是高電平時(shí)SDA 線由低電平向高電平切換,表示通訊的停止。起始和停止信號(hào)一般由主機(jī)產(chǎn)生。

1.2 I2C通訊的數(shù)據(jù)有效性

  • I2C 使用SDA 信號(hào)線來傳輸數(shù)據(jù),使用SCL 信號(hào)線進(jìn)行數(shù)據(jù)同步。
  • SDA 數(shù)據(jù)線在SCL 的每個(gè)時(shí)鐘周期傳輸一位數(shù)據(jù)。
  • 傳輸時(shí),SCL 為高電平的時(shí)候SDA 表示的數(shù)據(jù)有效,即此時(shí)的SDA 為高電平時(shí)表示數(shù)據(jù)“1”,為低電平時(shí)表示數(shù)據(jù)“0”。
  • 當(dāng)SCL 為低電平時(shí),SDA的數(shù)據(jù)無效,一般在這個(gè)時(shí)候SDA 進(jìn)行電平切換,為下一次表示數(shù)據(jù)做好準(zhǔn)備。

1.3 I2C通訊地址及數(shù)據(jù)方向

  • I2C 總線上的每個(gè)設(shè)備都有自己的獨(dú)立地址,主機(jī)發(fā)起通訊時(shí),通過SDA 信號(hào)線發(fā)送設(shè)備地址(SLAVE_ADDRESS) 來查找從機(jī)。
  • I2C 協(xié)議規(guī)定設(shè)備地址可以是7 位或10 位,實(shí)際中7 位的地址應(yīng)用比較廣泛。
  • 緊跟設(shè)備地址的一個(gè)數(shù)據(jù)位用來表示數(shù)據(jù)傳輸方向,它是數(shù)據(jù)方向位(R/),第8位或第11 位。
  • 數(shù)據(jù)方向位為“1”時(shí)表示主機(jī)由從機(jī)讀數(shù)據(jù),該位為“0”時(shí)表示主機(jī)向從機(jī)寫數(shù)據(jù)。
  • 讀數(shù)據(jù)方向時(shí),主機(jī)會(huì)釋放對(duì)SDA 信號(hào)線的控制,由從機(jī)控制SDA 信號(hào)線,主機(jī)接收信號(hào)。
  • 寫數(shù)據(jù)方向時(shí),SDA 由主機(jī)控制,從機(jī)接收信號(hào)。

1.4 響應(yīng)

  • I2C 的數(shù)據(jù)和地址傳輸都帶響應(yīng)。響應(yīng)包括 “應(yīng)答(ACK)”“非應(yīng)答(NACK)” 兩種信號(hào)。
  • 作為數(shù)據(jù)接收端時(shí),當(dāng)設(shè)備(無論主從機(jī)) 接收到I2C 傳輸?shù)囊粋€(gè)字節(jié)數(shù)據(jù)或地址后,若希望對(duì)方繼續(xù)發(fā)送數(shù)據(jù),則需要向?qū)Ψ桨l(fā)送 “應(yīng)答(ACK)” 信號(hào),發(fā)送方會(huì)繼續(xù)發(fā)送下一個(gè)數(shù)據(jù)。
  • 若接收端希望結(jié)束數(shù)據(jù)傳輸,則向?qū)Ψ桨l(fā)送 “非應(yīng)答(NACK)” 信號(hào),發(fā)送方接收到該信號(hào)后會(huì)產(chǎn)生一個(gè)停止信號(hào),結(jié)束信號(hào)傳輸。
  • 傳輸時(shí)主機(jī)產(chǎn)生時(shí)鐘,在第9個(gè)時(shí)鐘時(shí),數(shù)據(jù)發(fā)送端會(huì)釋放SDA的控制權(quán),由數(shù)據(jù)接收端控制SDA,若SDA為高電平,表示非應(yīng)答信號(hào)(NACK),低電平表示應(yīng)答信號(hào)(ACK)。

總結(jié)

以上是生活随笔為你收集整理的《STM32从零开始学习历程》——I2C协议层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。