各記憶體大小的EEPROM的IIC通訊原理

2021-09-25 16:15:40 字數 2814 閱讀 3513

1、引腳圖

知識點二:wp讀寫保護位,scl時鐘訊號(可模擬),sda資料訊號(可模擬)

2、eeprom時序圖

知識點一:時序就是一種mcu與硬體之間的通訊協議決定的擁有變化占空比的模擬訊號(簡單的說就是用高低電平變化來表達他們之間的通訊方式或者通俗的說就是他們自己的「方言」交流)。時序的讀寫步驟看下面兩個圖,看得懂英文就懂了。(ack是應答,就是接收完傳送回應訊號,傳送完要等待回應訊號才繼續,msb與lsm看下面的裝置位址)

知識點二:傳送/讀取「1」或「0」的規則如下圖。scl時鐘訊號高電平期間sda有穩定的高電平代表資料1,有穩定的低電平代表資料0。可以模擬我們日常交流時所謂的暗號(用什麼方式表示什麼資訊一樣)

知識點三:在讀寫時序中,無論是寫裝置位址還是寫位元組位址又或者是應答訊號起始訊號他們都是硬體自身規定的一串資料,你只要對應的傳送好這個資料,那麼就相當於寫了這段時序的這一部分。傳送資料方法就是知識點二。其次傳送什麼資料這裡不贅述,不同記憶體的eeprom的通訊規則都是iic查資料手冊就知道對應發什麼資料了。

3、基於不同記憶體的24c01/02/04/08/16的裝置位址區別

知識點二:型號資訊(如24c02型號說明它記憶體為2kb,256位元組)

知識點三:不同記憶體大小的eeprom裝置位址設定不一樣,如上圖即是各記憶體大小的裝置位址,其中a0a1a2可硬體連線對應引腳置高低電平設定。p0p1p2不能設定只能由軟體賦值讓eeprom自主查詢,它們相當於組成的一組位址線,每個位址線有256位元組資料(24c01本人估計它是一條位址線共128位元組),當沒有p0p1p2說明位址線就只有一條不需要排線,即24c02只有256位元組記憶體同時擁有a2a1a0三位,說明他的裝置位址(裝置名稱)可以有八種設定,也就是說如果併聯多個eeprom最多八個,因為名字就最多八個而且不能重複名字不然不能識別具體哪個eeprom收發資料,如果只能設定a1a2以此類推即可知道最多併聯4個eeprom。又例如24c16,它記憶體2048位元組,因為它有p2p1p0三個位供軟體設定,軟體設定的p0/p1/p2不同共有2^3種情況,也就是可設定(或者說它內部存在)8個位址線,然後乙個位址線256位元組,那麼24c16就一共8*256=2048位元組*8=16kb的記憶體。

知識點四:傳輸資料的位址設定(位址是位元組位址不是位位址)。對於16k記憶體以內的eeprom,告訴eeprom資料的位址要傳送兩次資料,首先要傳送所謂的高位址(反正我理解的高位址就是告訴eeprom資料寫在哪個位址線),就是把上面的裝置位址發一次,如16k記憶體的,發的資料位址是第266位元組,那麼根據一條位址線256個位元組,266/256取整=1就知道這個位址在那個位址線,這裡算到位址線1,那麼p2p1p0三個位分別就是001以此類推。接下來傳送資料所在的低位位址就是另外的八位資料,這八位資料就是說在這個位址線256位元組位中的哪個位元組位,那就是266%256=10,也就是說266位址在24c16裡是在位址線1的第10個位元組,低位址就是10(十進位制)。那最終傳送的高低位址是什麼呢?如果是讀,高位址就是10100011(二進位制,寫的話最後一位是0根據上圖的裝置位址規範就知道);低位址就是00001010(二進位制,轉為十進位制就是10),然後在讀寫時序中寫資料所儲存位址的時候就依次傳送這兩個資料即可(每次傳送完後要應答,根據時序圖)。

4、總結——程式設計思路通俗講解為

舉例寫資料到eeprom :

1)大喊一聲「喂」(傳送起始訊號,程式設計上要傳送起始訊號對應的時序),叫起若干個eeprom儲存片

2)看看有沒有人回頭回應(程式設計上等待eeprom 的應答訊號,應答訊號的時序看手冊,應答訊號建議封裝乙個函式)

3)確定好你要叫的那個eeprom的名字(確定好a2a1a0沒有則忽略,程式設計上什麼都不用做)

4)走到那個eeprom的具體位置(確定資料位址,確定p0p1p2,沒有則忽略。算高位址,程式設計上傳送高位址)

5)看看那個人願不願意和你交流(同上,程式設計上等待應答訊號)

6)他願意交流,湊到他耳朵旁邊準備悄悄話發暗號(算低位址,程式設計上傳送低位址)

7)看他願不願意悄悄話(同上,程式設計上等待應答訊號)

8)想說什麼大膽地說吧(程式設計上傳送資料內容,建議按位元組傳送,最好封裝乙個傳送乙個位元組資料的函式)

9)看他聽懂沒有(同上,程式設計上等待應答訊號)

10)聽懂了就停止(程式設計上傳送停止訊號,建議封裝乙個停止訊號函式,表示乙個位元組資料完畢)

11)悄悄話上癮了?重複上面步驟(多位元組儲存建議把以上所有過程統一封裝進乙個函式,每次傳送乙個位元組時呼叫即可)

此外對於記憶體大於16k的eeprom鄙人暫時學藝不精,不好介紹,如果需要我覺得可以用多個iic通訊同時用多個eeprom就能擴大記憶體。

經過查詢資料我發現他們與16k以內的區別是在於資料位址確定,因為16k以上用普通的控制方法最多8線位址每個線256位元組滿足不了他們的記憶體大小,因此不能用以上寫位址的方法。此外24c32與24c64我看資料顯示他們貌似要設定a0a1a2,這樣一來位址就不能通過這p1p2p0三位設定。我猜測他們的原理是用新的八位做高位址就像16k以內的低位址一樣。這樣他們的程式設計寫位址過程就是直接算位元組位址高位地位的二進位制值直接依次傳送就不需要區分在哪個位址線了。而我看別人正確的**來順藤摸瓜的。希望有大佬發言接近鄙人疑惑。

enum的記憶體大小

enum在記憶體中占用多少儲存空間,為什麼在使用enum型別的時候不用寫上enum的名字呢,想struct一樣呼叫?在網上搜尋了一下,找到了想要的結論!enum定義類似與下面這樣 enum color 用起來可能像這樣 color color red switch color 先說為什麼red,不能...

free記憶體大小的問題

我們知道malloc的呼叫形式如 type p type malloc n sizeof type free的呼叫形式如 free p 好了,問題來了,free函式,我們只給傳入乙個指標,沒有傳入記憶體塊的大小n,那麼編譯器怎麼知道要釋放多少位元組的記憶體,如果讓你來實 現怎麼實現?當時,蒙了,鬱悶...

類的占用記憶體大小

1.類的大小為類的非靜態成員資料的型別大小之和,也 就是說靜態成員資料不作考慮。2.普通成員函式與sizeof無關。3.靜態成員並不屬於某個物件,sizeof取的是物件大小。4.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。5.空類的sizeof為1。因為乙個空類也要例項化,所...