在上一篇文章中《「STM32 」IIC通訊原理及其實驗》,我們主要介紹了I2C底層的協定,現在我們來使用stm32的I2C接口來操控一個I2C器件。
我們使用I2C來操控一個EEPROM(AT24C02)實作資料的讀寫。
AT24C02的datasheet可直接在網上下載下傳下來,此刻我們隻關注一些重要的晶片資訊了:
管腳如下:
SDA和SCL為I2C總線,vcc和vss分别為電源和地,wc為寫保護,mode為模式選擇,E0~E2為設定該裝置位址的,它是主裝置識别的唯一辨別。AT24C02可認為是一個從裝置,主裝置為我的STM32。
怎麼設定AT24C02的位址:
一個8bit的資料:
bit4~bit7:預設為0101
bit1~bit3:是需要我們自己設定的,它對應于E0~E2管腳,假如你的硬體上都接的是地,那麼即為000。
bit0:控制讀寫的。1位讀操作,0位寫操作。
假如E0~E2在硬體上都接的是地線,那麼:操作該AT24C02我們要讀的話為:1010 0001即0xA1,要是要寫的話為1010 0000 即0xA0。就是這個道理了。
下面再來看看讀寫一個byte的時序:
- 寫:
先來一個啟示信号,然後是寫入裝置位址,即0xA0,然後給一個應答信号,然後寫入我們要寫的位址,這個位址大小為256byte,等待應答,然後寫入資料,這個資料存放在你前面設定的那個位址裡面,然後等待應答,最後發停止信号。
- 讀:
我們看比較簡單的一中:即從某個位址去讀資料
先發起始信号,然後發送位址,即:0xA1。确定我們要操作的是哪個AT24C02,等待應答信号,接下來我們要确定操作的是AT24C02裡面的那個位址空間,然後等待應答,然後在發送一個起始信号,然後發送裝置位址,等待應答,然後才是讀出資料,等待應答,發送結束信号。
簡單的來說:
對于寫,由于I2C總線是可以1主多從的,我們就需要确定我們給哪個從機裝置寫,我們确定了裝置,那麼我們就需要在确定把我的資料到底寫到裝置的那個位址空間裡面去,即0~255byte,隻要當兩個都确定了,我們才能才是寫資料了。
對于讀,同樣的道理,先找到你要讀的裝置到底是哪一個,找到了裝置,還不行啊,你需要找到你原來把資料從到那個地方了,那你就要找到資料的存放位置,隻是讀的時候我們發送了兩次起始信号,兩次裝置位址,然後我們就讀資料了。
下面我們再來看看主要源碼:
- 在AT24C02指定位址寫入一個資料
對照和協定和源碼我們來看一下:
函數的參數為:你要寫入資料的存放位址和你要寫入的資料
首先發送一個I2C協定的起始信号,然後确定裝置發送寫信号,這個寫是與裝置的記憶體容量有關系的,我們這裡跑的是else裡面的内容,即:
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //發送器件位址0XA0,寫資料
這個寫入的為0xA0了。然後等待應答,然後寫入記憶體位址,即我們要把我們的資料放在晶片的記憶體的哪裡?
IIC_Send_Byte(WriteAddr%256); //發送低位址
,等待應答,然後發送資料,然後等待應答,發送停止信号結束。
- 在AT24C02指定位址讀出一個資料
函數的參數為:讀資料的位址,
函數的傳回值為:讀到的資料
對比協定,代碼是完全按照協定走的,肯定是沒有問題的。就不多說了。
基于這兩個基本函數,在附加一個擴充函數:
- 在AT24CXX裡面的指定位址開始寫入長度為Len的資料
該函數用于寫入16bit或者32bit的資料.
WriteAddr :開始寫入的位址
DataToWrite:資料數組首位址
Len :要寫入資料的長度2,4
- 在AT24CXX裡面的指定位址開始讀出長度為Len的資料
該函數用于讀出16bit或者32bit的資料.
ReadAddr :開始讀出的位址
傳回值 :資料
Len :要讀出資料的長度2,4
- 檢查AT24CXX是否正常
這裡用了24XX的最後一個位址(255)來存儲标志字.
如果用其他24C系列,這個位址要修改
傳回1:檢測失敗
傳回0:檢測成功
- 在AT24CXX裡面的指定位址開始讀出指定個數的資料
ReadAddr :開始讀出的位址 對24c02為0~255
pBuffer :資料數組首位址
NumToRead:要讀出資料的個數
- 在AT24CXX裡面的指定位址開始寫入指定個數的資料
WriteAddr :開始寫入的位址 對24c02為0~255
pBuffer :資料數組首位址
NumToWrite:要寫入資料的個數
主函數就不說了,直接初始化,然後調函數做操作就好了。
喜歡我文章的朋友,歡迎關注、點贊、評論、交流。版權個人所有,轉載請注明出處