MicroChip的芯片手冊真的好看,恨不得都做筆記,今天這篇文章先對IIC協議進行了一個回顧,針對具體的數據手冊逐位描述。
后面就是STM32的工程,以及一個數據處理上面的運算。
5塊錢性價比真的很高
在時鐘的高電平周期內,SDA線上的數據必須保持穩定,數據線僅可以在時鐘SCL為低電平時改變。
SCL高的時候,DATA是要穩定讀取的
每次都是8位的數據一個字節,+讀寫+ACK
高->低
前面的1101,是固定的電平,也叫器件碼。后面的A2,A1,A1,是000,閉合圖形的意思大概是固定的。
一次傳輸一個字節,那么最后就是一個第九位,為0的時候是ACK收到
前面的7位為地址碼,第八位是寫入標志,第九位是回復
在總線的一次數據傳輸過程中,可以有以下幾種組合方式:
[1]主機向從機發送數據,數據傳送方向在整個傳送過程中不變:
注:有陰影部分表示數據由主機向從機傳送,無陰影部分則表示數據由從機向主機傳送。
A表示應答(低電平), A非表示非應答(高電平)。S表示起始信號,P表示終止信號。
[2]主機在第一個字節后,立即從從機讀數據:
[3]在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產生一次,但兩次讀/寫方向位正好反相:
我來說一個這個18位是什么意思,一個數據有18位,除去別的樣板數據。我們知道這個18bit的數據就是18個2進制位置,紅色的部分,D0-D17就是18個也就是說18位的數據都是傳輸完整了,LSB就是D0,數據從這里開始。接著從右往左排列三個時鐘周期,一個完整的應該是9位,前兩個數據位滿滿的,第三個用了兩位,最后的數據位怎么辦?因為是連續完整的,所以這里的做法就是把剩下的位置都補18位數據的MSB,就是最后一個數字,我們忽略就可以。
這個就是說你是12或者是14的情況下,也是有多余的位置沒有傳輸
這是低位數下的傳輸
IIC的輸入輸出結構采用的是開漏的結構。
開漏結構不能夠自主得到高電平,所以需要通過外部上拉電阻Rp來的實現IIC通信過程中的高電平。
Rp的大小取決于IIC不同模式時的灌電流大小。
由于種類的設備都有可能連接到IIC總線上面,比如說CMOS、NMOS等,所以IIC的高電平和低電平的標準是不一定的。高電平和低電平的值分別為0.7VDD和0.3VDD。
應答位、非應答位:當主機傳送8位數據結束后,主機會將SDA線拉高,此時如果從機正確接收數據則會將SDA拉低并在SCL高電平時保持低電平,這個信號為ACK信號。如果在傳輸8位數據后從機沒有將SDA拉低則該信號為NACK。如果出現NACK則表示數據傳輸出錯。
是主動拉低的意思
數據有效性:當時鐘信號為高電平的時候,數據線上的信號需要保持不變也就是在時鐘線為高電平的時候數據線出現上升下降沿的話就會產生停止和啟動信號,從而導致數據的傳輸出錯。
byte:SDA上的數據傳輸是以8bit即一個字節為單位傳輸的,每一次傳輸的字節數沒有限制,每傳輸完一個字節后必須跟隨一個應答位。 我們以01001001(0X49)為例,其時序圖如下:
寫操作:主機確定了從機的設備地址后,生成一個開始信號,然后向IIC總線上面發送設備的地址和讀寫方向標志。從機檢測到該地址和自己設備地址相對應后,回復主機一個應答信號。主機接收到應答信號后就開始向這個設備以字節為單位發送數據,每一個字節后面都會帶有從機的應答信號,直到主機發送完成最后一個數據后生成一個停止信號結束此次數據的傳輸。
寫就是主機一直搗鼓,后來問下從機,逼崽子聽見沒有
讀操作:讀操作與寫操作有一些類似,同樣的是需要確定需要讀取的從設備的地址。然后主機生成開始信號,再向IIC總線上發送從設備的地址和讀數據的指令。從設備接收到地址與自己的吻合后會產生一個應答信號。就這從設備就開始向主機發送主機想要讀取的數據,主機正確接收數據后會向從機回復應答信號,當主機想要結束讀取操作時,主機會回復一個非應答信號,然后生成停止信號結束數據的讀取。
牛鼻
所示是示波器采集的IIC信號,我們通過自己的觀察得到這一段IIC包含的信息,主機向地址為0XA0 的設備寫入0X0C。
配置寄存器
IIC總線的傳輸速率一般是幾百KHZ,傳輸速率設置為幾MHz就可以。這里我們采用4MHz的采樣率對IIC進行采樣。
這些是一些函數,順手翻譯
這個是配置位
第4位
11 18位
最后兩個00,不增益
1101是跑不了的
那就000,最后再補一個
地址也就是這樣的
IIC的CubeMX配置,就默認就好
這個是初始化函數
翻譯的另外一個函數
計數值滿了以后就開始一次轉換
輸出的位數字
這個就是建立的一個數組
好,兩個位
先留啊
具體就是這樣算的,然后除了最后兩位,前面都是0
中,低
直接拼接
這是就是左移,將一個二進制數的所有位向左移動指定的位數,右邊用0填充。
之后相加是很簡單的事情了。
也可以寫成完整的位運算的樣子,一個字節一個字節的去取
我們上面拿到的數據才是一堆位數據,我們要變成人類可讀的數字
所有的數據都是補碼:
判斷一個32位無符號整數(Voltage)的最高位符號位是否為1。 & 是按位與運算符,用于將兩個數的對應位進行邏輯與操作。 0x00020000 是一個十六進制數,其二進制表示為 : 00000001 00000000 00000000 00000000。 Voltage & 0x00020000 的結果是將 Voltage 的最高位符號位與 0x00020000 進行按位與操作。 如果結果等于 0x00020000,則說明 Voltage 的最高位符號位為1,返回 True;否則返回 False。
如果是1的話,也就是算過的數字是不變的
我們知道了是負數,接著把他還原
這段代碼是用于將一個32位無符號整數(Voltage)的最高位符號位清零,并將其轉換為正數。 Voltage &= 0x0001ffff; 這行代碼將 Voltage 與十六進制數 0x0001ffff 進行按位與操作。 0x0001ffff 的二進制表示為: 00000001 11111111 11111111 11111111。 這個操作的目的是保留 Voltage 的低20位,并將最高位符號位清零。 Voltage = (~Voltage) + 1; 這行代碼首先對 Voltage 進行按位取反操作,然后加1。加1是為了將取反后的負數轉換為正數。 Voltage &= 0x0001ffff; 這行代碼再次將 Voltage 與十六進制數 0x0001ffff 進行按位與操作。 這個操作的目的是保留 Voltage 的低20位,將其轉換為正數。 最終,這段代碼的作用是將一個32位無符號整數的最高位符號位清零,并將其轉換為正數。
這個就是負數的
正數的
如果是CubeMX的工程,記得把自己的頭文件放這里
C文件是在這里添加
這樣就添加好了
編譯通過
審核編輯:湯梓紅
-
芯片
+關注
關注
450文章
49317瀏覽量
415586 -
microchip
+關注
關注
52文章
1487瀏覽量
117232 -
adc
+關注
關注
97文章
6229瀏覽量
541847 -
STM32
+關注
關注
2253文章
10779瀏覽量
351661 -
IIC協議
+關注
關注
0文章
16瀏覽量
3902
原文標題:MCP3421-18bit ADC 調試
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論