MicroChip的芯片手冊真的好看,恨不得都做筆記,今天這篇文章先對IIC協(xié)議進(jìn)行了一個回顧,針對具體的數(shù)據(jù)手冊逐位描述。
后面就是STM32的工程,以及一個數(shù)據(jù)處理上面的運(yùn)算。
5塊錢性價比真的很高
在時鐘的高電平周期內(nèi),SDA線上的數(shù)據(jù)必須保持穩(wěn)定,數(shù)據(jù)線僅可以在時鐘SCL為低電平時改變。

SCL高的時候,DATA是要穩(wěn)定讀取的

每次都是8位的數(shù)據(jù)一個字節(jié),+讀寫+ACK

高->低

前面的1101,是固定的電平,也叫器件碼。后面的A2,A1,A1,是000,閉合圖形的意思大概是固定的。


一次傳輸一個字節(jié),那么最后就是一個第九位,為0的時候是ACK收到

前面的7位為地址碼,第八位是寫入標(biāo)志,第九位是回復(fù)
在總線的一次數(shù)據(jù)傳輸過程中,可以有以下幾種組合方式:
[1]主機(jī)向從機(jī)發(fā)送數(shù)據(jù),數(shù)據(jù)傳送方向在整個傳送過程中不變:

注:有陰影部分表示數(shù)據(jù)由主機(jī)向從機(jī)傳送,無陰影部分則表示數(shù)據(jù)由從機(jī)向主機(jī)傳送。
A表示應(yīng)答(低電平), A非表示非應(yīng)答(高電平)。S表示起始信號,P表示終止信號。
[2]主機(jī)在第一個字節(jié)后,立即從從機(jī)讀數(shù)據(jù):

[3]在傳送過程中,當(dāng)需要改變傳送方向時,起始信號和從機(jī)地址都被重復(fù)產(chǎn)生一次,但兩次讀/寫方向位正好反相:


我來說一個這個18位是什么意思,一個數(shù)據(jù)有18位,除去別的樣板數(shù)據(jù)。我們知道這個18bit的數(shù)據(jù)就是18個2進(jìn)制位置,紅色的部分,D0-D17就是18個也就是說18位的數(shù)據(jù)都是傳輸完整了,LSB就是D0,數(shù)據(jù)從這里開始。接著從右往左排列三個時鐘周期,一個完整的應(yīng)該是9位,前兩個數(shù)據(jù)位滿滿的,第三個用了兩位,最后的數(shù)據(jù)位怎么辦?因?yàn)槭沁B續(xù)完整的,所以這里的做法就是把剩下的位置都補(bǔ)18位數(shù)據(jù)的MSB,就是最后一個數(shù)字,我們忽略就可以。

這個就是說你是12或者是14的情況下,也是有多余的位置沒有傳輸

這是低位數(shù)下的傳輸




IIC的輸入輸出結(jié)構(gòu)采用的是開漏的結(jié)構(gòu)。
開漏結(jié)構(gòu)不能夠自主得到高電平,所以需要通過外部上拉電阻Rp來的實(shí)現(xiàn)IIC通信過程中的高電平。
Rp的大小取決于IIC不同模式時的灌電流大小。
由于種類的設(shè)備都有可能連接到IIC總線上面,比如說CMOS、NMOS等,所以IIC的高電平和低電平的標(biāo)準(zhǔn)是不一定的。高電平和低電平的值分別為0.7VDD和0.3VDD。

應(yīng)答位、非應(yīng)答位:當(dāng)主機(jī)傳送8位數(shù)據(jù)結(jié)束后,主機(jī)會將SDA線拉高,此時如果從機(jī)正確接收數(shù)據(jù)則會將SDA拉低并在SCL高電平時保持低電平,這個信號為ACK信號。如果在傳輸8位數(shù)據(jù)后從機(jī)沒有將SDA拉低則該信號為NACK。如果出現(xiàn)NACK則表示數(shù)據(jù)傳輸出錯。

是主動拉低的意思
數(shù)據(jù)有效性:當(dāng)時鐘信號為高電平的時候,數(shù)據(jù)線上的信號需要保持不變也就是在時鐘線為高電平的時候數(shù)據(jù)線出現(xiàn)上升下降沿的話就會產(chǎn)生停止和啟動信號,從而導(dǎo)致數(shù)據(jù)的傳輸出錯。

byte:SDA上的數(shù)據(jù)傳輸是以8bit即一個字節(jié)為單位傳輸?shù)模恳淮蝹鬏數(shù)淖止?jié)數(shù)沒有限制,每傳輸完一個字節(jié)后必須跟隨一個應(yīng)答位。 我們以01001001(0X49)為例,其時序圖如下:

寫操作:主機(jī)確定了從機(jī)的設(shè)備地址后,生成一個開始信號,然后向IIC總線上面發(fā)送設(shè)備的地址和讀寫方向標(biāo)志。從機(jī)檢測到該地址和自己設(shè)備地址相對應(yīng)后,回復(fù)主機(jī)一個應(yīng)答信號。主機(jī)接收到應(yīng)答信號后就開始向這個設(shè)備以字節(jié)為單位發(fā)送數(shù)據(jù),每一個字節(jié)后面都會帶有從機(jī)的應(yīng)答信號,直到主機(jī)發(fā)送完成最后一個數(shù)據(jù)后生成一個停止信號結(jié)束此次數(shù)據(jù)的傳輸。

寫就是主機(jī)一直搗鼓,后來問下從機(jī),逼崽子聽見沒有

讀操作:讀操作與寫操作有一些類似,同樣的是需要確定需要讀取的從設(shè)備的地址。然后主機(jī)生成開始信號,再向IIC總線上發(fā)送從設(shè)備的地址和讀數(shù)據(jù)的指令。從設(shè)備接收到地址與自己的吻合后會產(chǎn)生一個應(yīng)答信號。就這從設(shè)備就開始向主機(jī)發(fā)送主機(jī)想要讀取的數(shù)據(jù),主機(jī)正確接收數(shù)據(jù)后會向從機(jī)回復(fù)應(yīng)答信號,當(dāng)主機(jī)想要結(jié)束讀取操作時,主機(jī)會回復(fù)一個非應(yīng)答信號,然后生成停止信號結(jié)束數(shù)據(jù)的讀取。


牛鼻


所示是示波器采集的IIC信號,我們通過自己的觀察得到這一段IIC包含的信息,主機(jī)向地址為0XA0 的設(shè)備寫入0X0C。

配置寄存器
IIC總線的傳輸速率一般是幾百KHZ,傳輸速率設(shè)置為幾MHz就可以。這里我們采用4MHz的采樣率對IIC進(jìn)行采樣。

這些是一些函數(shù),順手翻譯

這個是配置位


第4位

11 18位

最后兩個00,不增益

1101是跑不了的

那就000,最后再補(bǔ)一個

地址也就是這樣的

IIC的CubeMX配置,就默認(rèn)就好

這個是初始化函數(shù)

翻譯的另外一個函數(shù)

計數(shù)值滿了以后就開始一次轉(zhuǎn)換

輸出的位數(shù)字

這個就是建立的一個數(shù)組

好,兩個位

先留啊

具體就是這樣算的,然后除了最后兩位,前面都是0

中,低

直接拼接

這是就是左移,將一個二進(jìn)制數(shù)的所有位向左移動指定的位數(shù),右邊用0填充。
之后相加是很簡單的事情了。

也可以寫成完整的位運(yùn)算的樣子,一個字節(jié)一個字節(jié)的去取

我們上面拿到的數(shù)據(jù)才是一堆位數(shù)據(jù),我們要變成人類可讀的數(shù)字
所有的數(shù)據(jù)都是補(bǔ)碼:

判斷一個32位無符號整數(shù)(Voltage)的最高位符號位是否為1。 & 是按位與運(yùn)算符,用于將兩個數(shù)的對應(yīng)位進(jìn)行邏輯與操作。 0x00020000 是一個十六進(jìn)制數(shù),其二進(jìn)制表示為 : 00000001 00000000 00000000 00000000。 Voltage & 0x00020000 的結(jié)果是將 Voltage 的最高位符號位與 0x00020000 進(jìn)行按位與操作。 如果結(jié)果等于 0x00020000,則說明 Voltage 的最高位符號位為1,返回 True;否則返回 False。
如果是1的話,也就是算過的數(shù)字是不變的

我們知道了是負(fù)數(shù),接著把他還原
這段代碼是用于將一個32位無符號整數(shù)(Voltage)的最高位符號位清零,并將其轉(zhuǎn)換為正數(shù)。 Voltage &= 0x0001ffff; 這行代碼將 Voltage 與十六進(jìn)制數(shù) 0x0001ffff 進(jìn)行按位與操作。 0x0001ffff 的二進(jìn)制表示為: 00000001 11111111 11111111 11111111。 這個操作的目的是保留 Voltage 的低20位,并將最高位符號位清零。 Voltage = (~Voltage) + 1; 這行代碼首先對 Voltage 進(jìn)行按位取反操作,然后加1。加1是為了將取反后的負(fù)數(shù)轉(zhuǎn)換為正數(shù)。 Voltage &= 0x0001ffff; 這行代碼再次將 Voltage 與十六進(jìn)制數(shù) 0x0001ffff 進(jìn)行按位與操作。 這個操作的目的是保留 Voltage 的低20位,將其轉(zhuǎn)換為正數(shù)。 最終,這段代碼的作用是將一個32位無符號整數(shù)的最高位符號位清零,并將其轉(zhuǎn)換為正數(shù)。

這個就是負(fù)數(shù)的

正數(shù)的

如果是CubeMX的工程,記得把自己的頭文件放這里

C文件是在這里添加

這樣就添加好了

編譯通過



審核編輯:湯梓紅
-
芯片
+關(guān)注
關(guān)注
463文章
54024瀏覽量
466368 -
microchip
+關(guān)注
關(guān)注
53文章
1640瀏覽量
120925 -
adc
+關(guān)注
關(guān)注
100文章
7513瀏覽量
556090 -
STM32
+關(guān)注
關(guān)注
2310文章
11162瀏覽量
373546 -
IIC協(xié)議
+關(guān)注
關(guān)注
0文章
31瀏覽量
4248
原文標(biāo)題:MCP3421-18bit ADC 調(diào)試
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
模數(shù)轉(zhuǎn)換器MCP3421電子資料
MCP3421的基礎(chǔ)知識點(diǎn),總結(jié)的太到位了
mcp3421 18不起作用是怎么回事?
MCP3421 pdf datasheet
MCP3421電池電量監(jiān)測演示板
MCP3421 SOT23-6評估板的詳細(xì)中文資料概述
MCP3421電池電量計演示板的詳細(xì)中文資料概述
電池電量監(jiān)測解決方案的演示介紹
MCP3421 18位delta-sigma ADC,采用小型SOT-23封裝,具有基準(zhǔn)電壓源。
MCP3421DM 電池電力測定參考設(shè)計
基于MCP3421DM-WS權(quán)重系統(tǒng)的參考設(shè)計
基于MCP3421EV模擬到數(shù)字轉(zhuǎn)換的參考設(shè)計
MCP3421-18bit ADC調(diào)試方案
評論