外设驱动库开发笔记40:AT25xxx外部存储器驱动
??我們?cè)谇懊骈_發(fā)過AT24CXX系列EEPROM存儲(chǔ)器,它使用的是I2C接口。不過有時(shí)候我們也會(huì)使用SPI接口的EEPROM存儲(chǔ)器。在這一篇我們將來討論AT25XXX系列EEPROM存儲(chǔ)器的驅(qū)動(dòng)設(shè)計(jì)、實(shí)現(xiàn)及使用。
1、功能概述
??AT25XXX系列EEPROM存儲(chǔ)器采用SPI接口,因其操作簡單且性價(jià)比高,常用于數(shù)據(jù)保存。出于開發(fā)面向AT25XXX系列EEPROM存儲(chǔ)器操作的驅(qū)動(dòng)目標(biāo),我們先來了解一下AT25XXX系列EEPROM存儲(chǔ)器的基本情況。
1.1、硬件描述
??AT25XXX系列EEPROM存儲(chǔ)器擁有從1K到2M的多種容量。AT25XXX系列EEPROM存儲(chǔ)器采用SPI通訊接口。盡管容量跨度很大,但都采用相同的封裝形式。具體的引腳排布及定義如下:
??為了更好地理解AT25XXX系列EEPROM存儲(chǔ)器的操作過程,我們對(duì)CS、WP以及HOLD引腳做一個(gè)簡單說明。
??首先來看一看CS引腳,CS為芯片選擇引腳,低電平有效,AT25XXX系列EEPROM存儲(chǔ)器被選中。當(dāng)設(shè)備未被選中時(shí),串行數(shù)據(jù)輸入(SI)引腳將不接受數(shù)據(jù),串行輸出(SO)引腳將保持高阻抗?fàn)顟B(tài)。為了確保穩(wěn)定的操作,CS引腳應(yīng)在電源啟動(dòng)時(shí)跟隨VCC。因此建議使用小于或等于10 kΩ的上拉電阻器連接到VCC。在電源啟動(dòng)后,要實(shí)現(xiàn)對(duì)AT25XXX系列EEPROM存儲(chǔ)器的任何操作,都需要先將CS下拉到低電平。
??接下來我們看一看WP引腳,WP引腳為AT25XXX系列EEPROM存儲(chǔ)器的寫保護(hù)引腳。當(dāng)寫保護(hù)(WP)引腳保持高電位時(shí),AT25XXX系列EEPROM存儲(chǔ)器允許正常的讀/寫操作。當(dāng)寫保護(hù)(WP)引腳為低電平時(shí),WPEN位設(shè)置為邏輯“1”時(shí),所有對(duì)狀態(tài)寄存器的寫操作都被禁止。但如果內(nèi)部寫周期已經(jīng)啟動(dòng),那么寫保護(hù)(WP)引腳變?yōu)榈碗娖綄?duì)狀態(tài)寄存器的任何寫操作都沒有影響。當(dāng)狀態(tài)寄存器中的WPEN位設(shè)置為邏輯“0”時(shí),寫保護(hù)(WP)引腳的功能被屏蔽。
??最后我們來看一看HOLD引腳,暫停串行輸入(HOLD)引腳低電平有效。暫停串行輸入(HOLD)引腳與芯片選擇(CS)引腳一起使用來暫停AT25XXX系列EEPROM存儲(chǔ)器。當(dāng)設(shè)備被選中,一個(gè)串行序列正在進(jìn)行中,HOLD可以用來暫停與主設(shè)備的串行通信,而不需要重新設(shè)置串行序列。此時(shí),串行數(shù)據(jù)輸入(SI)引腳的輸入將被忽略,而串行數(shù)據(jù)輸出(SO)引腳將處于高阻抗?fàn)顟B(tài)。
1.2、通訊接口
??AT25XXX系列EEPROM存儲(chǔ)器采用SPI通訊接口。AT25XXX系列EEPROM存儲(chǔ)器由主機(jī)控制器(通常稱為SPI主機(jī))發(fā)送的一組指令控制。與AT25XXX系列EEPROM存儲(chǔ)器的通信必須由SPI主設(shè)備(如微控制器)發(fā)起。SPI主設(shè)備必須在串行數(shù)據(jù)時(shí)鐘(SCK)引腳上為AT25XXX系列EEPROM存儲(chǔ)器生成串行時(shí)鐘。AT25XXX系列EEPROM存儲(chǔ)器總是作為一個(gè)從屬操作,因?yàn)镾CK總是一個(gè)輸入。主機(jī)與AT25XXX系列EEPROM存儲(chǔ)器通訊的拓?fù)鋱D如下所示:
??SPI主機(jī)通過SPI總線與AT25XXX系列EEPROM存儲(chǔ)器通信,SPI總線由四條信號(hào)線組成:芯片選擇(CS)、串行數(shù)據(jù)時(shí)鐘(SCK)、串行數(shù)據(jù)輸入(SI)和串行數(shù)據(jù)輸出(SO)。SPI協(xié)議定義了總共四種操作模式(模式0、模式1、模式2或模式3),每種模式在SCK極性和相位以及極性和相位如何控制SPI總線上的數(shù)據(jù)流方面有所不同。AT25XXX系列EEPROM存儲(chǔ)器支持兩種最常見的模式,SPI模式0和3。
1.3、命令操作
??AT25XXX系列EEPROM存儲(chǔ)器被設(shè)計(jì)成直接與同步串行外圍接口(SPI)接口。AT25XXX系列EEPROM存儲(chǔ)器使用一個(gè)8位指令寄存器。所有的指令、地址和數(shù)據(jù)首先由高位開始傳送,然后由高到低依次進(jìn)行。指令列表及其操作代碼如下:
??從上表我們知道,除了操作存儲(chǔ)區(qū)域外,還可以操作狀態(tài)寄存器。AT25XXX系列EEPROM存儲(chǔ)器包括一個(gè)8位狀態(tài)寄存器。狀態(tài)寄存器位調(diào)節(jié)設(shè)備的各種特性。這些位可以通過指令進(jìn)行更改。具體的結(jié)構(gòu)如下:
??狀態(tài)寄存器除了反應(yīng)當(dāng)前的狀態(tài)外,實(shí)際上有些位還有配置功能。關(guān)于致謝為的屬性及具體含義如下:
??通過寫狀態(tài)寄存器(WRSR)指令可以配置寫保護(hù)使能和寫保護(hù)的區(qū)域。塊寫保護(hù)位(BP1、BP0)決定了存儲(chǔ)陣列的寫保護(hù)區(qū)域。兩位決定了陣列保護(hù)的四個(gè)級(jí)別,分別是:沒有一個(gè)內(nèi)存陣列被保護(hù);上四分之一地址范圍內(nèi)存陣列被保護(hù);上半部分地址范圍內(nèi)存陣列被保護(hù);所有的內(nèi)存陣列都是寫保護(hù)的,這意味著所有的地址位都是只讀的。塊寫保護(hù)級(jí)別和相應(yīng)的狀態(tài)寄存器控制位關(guān)系如下:
??而寫保護(hù)使能 (WPEN)位用于啟用或禁用寫保護(hù) (WP) 引腳。當(dāng)WPEN位設(shè)置為邏輯“0”時(shí),寫入EEPROM數(shù)組的能力取決于塊寫保護(hù)(BP1、BP0)位的值。寫入狀態(tài)寄存器的權(quán)限是由WEL位控制的。當(dāng)WPEN位設(shè)置為邏輯“1”時(shí),狀態(tài)寄存器是只讀的。當(dāng)WP引腳低且WPEN位設(shè)置為邏輯“1”時(shí),硬件寫保護(hù)就啟用了。當(dāng)設(shè)備被硬件寫保護(hù)時(shí),對(duì)狀態(tài)寄存器的寫操作,包括塊寫保護(hù)、WEL和WPEN位,以及對(duì)塊寫保護(hù)位所選擇的內(nèi)存陣列中的段的寫操作被禁用。當(dāng)啟用硬件寫保護(hù)時(shí),只允許對(duì)未受塊保護(hù)的內(nèi)存段進(jìn)行寫。當(dāng)WP引腳為高電平或WPEN位邏輯為“0”時(shí),硬件寫保護(hù)被禁用。當(dāng)硬件寫保護(hù)被禁用時(shí),只允許對(duì)未被塊保護(hù)的內(nèi)存段進(jìn)行寫。當(dāng)WPEN位被硬件寫保護(hù)時(shí),只要WP引腳保持低,它就不能被設(shè)置回邏輯“0”。寫保護(hù)的關(guān)系如下所示:
??AT25XXX系列EEPROM存儲(chǔ)器擁有從1K到2M的不同容量,尋址范圍的不同所需的地址位數(shù)也不相同。地址位數(shù)根據(jù)容量從7位到18位不等,分別對(duì)應(yīng)1到3個(gè)字節(jié)。具體的容量與地址位關(guān)系如下:
??需要注意的是,4K(512x8)容量的AT25XXX系列EEPROM存儲(chǔ)器需要9為地址,但在實(shí)際操作時(shí)只用了1個(gè)字節(jié)來裝載地址,最高位(第9位)地址借用了操作碼的第4位來傳送。
2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
??我們已經(jīng)了解了AT25XXX存儲(chǔ)器的基本功能及讀寫方式,接下來我們將開發(fā)操作AT25XXX系列EEPROM存儲(chǔ)器的驅(qū)動(dòng)程序。
2.1、對(duì)象定義
??在使用一個(gè)對(duì)象之前我們需要獲得一個(gè)對(duì)象。同樣的我們想要AT25XXX系列EEPROM存儲(chǔ)器就需要先定義AT25XXX系列EEPROM存儲(chǔ)器的對(duì)象。
2.1.1、對(duì)象的抽象
??我們要得到AT25XXX系列EEPROM存儲(chǔ)器對(duì)象,需要先分析其基本特性。一般來說,一個(gè)對(duì)象至少包含兩方面的特性:屬性與操作。接下來我們就來從這兩個(gè)方面思考一下AT25XXX系列EEPROM存儲(chǔ)器的對(duì)象。
??先來考慮屬性,作為屬性肯定是用于標(biāo)識(shí)或記錄對(duì)象特征的東西。我們來考慮AT25XXX系列EEPROM存儲(chǔ)器對(duì)象屬性。首先AT25XXX系列EEPROM存儲(chǔ)器有多種型號(hào),不同型號(hào)在容量、地址位數(shù)等方面都有較大差異。為了區(qū)別不同類型的AT25XXX系列EEPROM存儲(chǔ)器,我們將類型作為對(duì)象的屬性。另外每一個(gè)AT25XXX對(duì)象都有一個(gè)狀態(tài)寄存器,它標(biāo)識(shí)了AT25XXX對(duì)象的當(dāng)前狀態(tài),所以我們也將它作為對(duì)象的屬性。
??接著我們還需要考慮AT25XXX系列EEPROM存儲(chǔ)器對(duì)象的操作問題。我們總是要對(duì)AT25XXX對(duì)象進(jìn)行數(shù)據(jù)讀寫,但讀寫操作使用SPI接口依賴于具體的硬件平臺(tái),所以我們將數(shù)據(jù)讀寫作為對(duì)象的操作。片選信號(hào)、寫保護(hù)以及hold信號(hào)均依賴于具體的硬件定義來實(shí)現(xiàn),所以我們將其作為對(duì)象的操作。還有用于時(shí)序控制的延時(shí),其也要根據(jù)具體的軟硬件平臺(tái)來實(shí)現(xiàn),所以我們也將其定義為對(duì)象的操作。
??根據(jù)上述我們對(duì)AT25XXX系列EEPROM存儲(chǔ)器的分析,我們可以定義AT25XXX系列EEPROM存儲(chǔ)器的對(duì)象類型如下:
2.1.2、對(duì)象初始化
??我們知道,一個(gè)對(duì)象僅作聲明是不能使用的,我們需要先對(duì)其進(jìn)行初始化,所以這里我們來考慮AT25XXX系列EEPROM存儲(chǔ)器對(duì)象的初始化函數(shù)。一般來說,初始化函數(shù)需要處理幾個(gè)方面的問題。一是檢查輸入?yún)?shù)是否合理;二是為對(duì)象的屬性賦初值;三是對(duì)對(duì)象作必要的初始化配置。據(jù)此我們?cè)O(shè)計(jì)AT25XXX系列EEPROM存儲(chǔ)器對(duì)象的初始化函數(shù)如下:
/* 初始化AT25XXX對(duì)象 */ void At25xxxInitialization(At25ObjectType *at, //AT25XXX對(duì)象實(shí)體At25ModeType mode, //AT25XXX對(duì)象類型AT25Read read, //讀AT25XXX對(duì)象操作指針AT25Write write, //寫AT25XXX對(duì)象操作指針AT25Delayms delayms, //延時(shí)操作指針AT25ChipSelect cs //片選操作函數(shù)指針) {if((at==NULL)||(read==NULL)||(write==NULL)||(delayms==NULL)){return;}at->Read=read;at->Write=write;at->Delayms=delayms;if(cs!=NULL){at->ChipSelect=cs;}else{at->ChipSelect=AT25ChipSelectDefault;}if(mode>=AT25Number){return;}at->mode=mode;if(mode<AT25080B){at->memAddLength=AT258BitMemAdd;}else if(mode<AT25M01){at->memAddLength=AT2516BitMemAdd;}else{at->memAddLength=AT2524BitMemAdd;}ReadStatusForAT25xxx(at);//寫允許SetWriteEnableLatchForAT25xxx(at);uint8_t cmd;//使能寫保護(hù),保護(hù)全部區(qū)域cmd=at->status|AT25_WPEN|AT25_BPALL;WriteStatusForAT25xx(at,cmd);ReadStatusForAT25xxx(at); }2.2、對(duì)象操作
??我們已經(jīng)完成了AT25XXX系列EEPROM存儲(chǔ)器對(duì)象類型的定義和對(duì)象初始化函數(shù)的設(shè)計(jì)。但我們的主要目標(biāo)是獲取對(duì)象的信息,接下來我們還要實(shí)現(xiàn)面向AT25XXX系列EEPROM存儲(chǔ)器的各類操作。
2.2.1、讀數(shù)據(jù)操作
??讀取AT25XXX系列EEPROM存儲(chǔ)器需要先將CS線拉低以選擇設(shè)備,爾后發(fā)送READ(0x03)指令,在后發(fā)送要讀的寄存器地址。一旦接收完寄存器地址,后續(xù)的信號(hào)將被忽略。然后返回指定地址的數(shù)據(jù)。讀AT25XXX系列EEPROM存儲(chǔ)器數(shù)據(jù)的操作時(shí)序如下:
??根據(jù)上述時(shí)序圖,我們可以編寫讀AT25XXX系列EEPROM存儲(chǔ)器數(shù)據(jù)的程序如下:
??如果只需要讀取一個(gè)字節(jié),那么在讀取一個(gè)字節(jié)后CS信號(hào)需在讀取后恢復(fù)高電平。如果想讀取多個(gè)字節(jié),那么CS信號(hào)必須持續(xù)低電平,在存儲(chǔ)器內(nèi)部字節(jié)地址將自動(dòng)遞增,數(shù)據(jù)將繼續(xù)移位。當(dāng)?shù)竭_(dá)最高地址時(shí),地址計(jì)數(shù)器將滾動(dòng)到最低階地址,從而允許在一個(gè)連續(xù)的讀取循環(huán)中讀取整個(gè)內(nèi)存,而不管起始地址是什么。
2.2.2、寫數(shù)據(jù)操作
??寫AT25XXX系列EEPROM存儲(chǔ)器,必須執(zhí)行兩條單獨(dú)的指令。首先,必須通過寫使能(WREN)指令使設(shè)備能夠?qū)憽H缓?#xff0c;可以執(zhí)行寫序列。如果設(shè)備沒有啟用寫(WREN),設(shè)備將忽略寫指令。在內(nèi)部寫周期中,除了RDSR指令外,所有命令都將被忽略。寫AT25XXX系列EEPROM存儲(chǔ)器的時(shí)序如下:
??根據(jù)上述時(shí)序圖,我們可以編寫寫AT25XXX系列EEPROM存儲(chǔ)器數(shù)據(jù)的程序如下:
2.2.3、狀態(tài)寄存器操作
??前面我們已經(jīng)詳細(xì)描述過狀態(tài)寄存器的格式以及每一位的定義。有一些位是只讀的,有一些位是可讀寫的,記下來我們實(shí)現(xiàn)針對(duì)狀態(tài)寄存器中的操作。
(1)、讀狀態(tài)寄存器
??讀狀態(tài)寄存器(RDSR)指令提供對(duì)狀態(tài)寄存器的訪問。RDSR指令可以確定設(shè)備的狀態(tài)以及塊寫保護(hù)(BP1, BP0)位表示所使用的內(nèi)存陣列保護(hù)的范圍。讀取狀態(tài)寄存器的方法是拉低CS信號(hào),然后發(fā)送0x05操作碼。操作碼完成后,設(shè)備將返回8位狀態(tài)寄存器值。具體時(shí)序如下:
??根據(jù)上述時(shí)序圖,我們可以編寫讀AT25XXX系列EEPROM存儲(chǔ)器狀態(tài)寄存器的程序如下:
(2)、寫狀態(tài)寄存器
??寫狀態(tài)寄存器(WRSR)指令使SPI主機(jī)能夠更改狀態(tài)寄存器的選定位。在WRSR指令開始之前,必須執(zhí)行一條WREN指令,將WEL位設(shè)置為邏輯“1”。WREN指令完成后,可以執(zhí)行WRSR指令。在WRSR指令之后,AT25XXX系列EEPROM存儲(chǔ)器將不會(huì)響應(yīng)除RDSR以外的命令,直到自動(dòng)計(jì)時(shí)的內(nèi)部寫周期完成。寫周期結(jié)束后,狀態(tài)寄存器中的WEL位復(fù)位為邏輯“0”。具體的時(shí)序圖如下:
??根據(jù)上述時(shí)序圖,我們可以編寫寫AT25XXX系列EEPROM存儲(chǔ)器狀態(tài)寄存器的程序如下:
??WRSR指令對(duì)狀態(tài)寄存器的第6位、第5位、第4位、第1位和第0位沒有影響。只有第7位、第3位和第2位可以通過WRSR指令進(jìn)行更改。這些可修改的位是寫保護(hù)使能(WPEN)和塊保護(hù)(BP1, BP0)位。這三個(gè)位元是非易失性位元,具有與常規(guī)EEPROM單元相同的特性和功能。當(dāng)電源從設(shè)備中移除時(shí),它們的值被保留。
2.2.4、寫操作使能與失能操作
??通過寫使能(WREN)指令和寫失能(WRDI)指令實(shí)現(xiàn)對(duì)狀態(tài)寄存器和EEPROM陣列的寫操作的啟用和禁用。這些功能改變了狀態(tài)寄存器中WEL位的狀態(tài)。
(1)寫操作啟用
??狀態(tài)寄存器的寫能門閂(WEL)位必須在每個(gè)寫狀態(tài)寄存器(WRSR)和寫入內(nèi)存陣列(Write)指令之前設(shè)置為邏輯“1”。這是通過向AT25XXX系列EEPROM存儲(chǔ)器發(fā)送一條WREN(0x06)指令來完成的。首先,CS引腳被拉低以選擇設(shè)備,然后發(fā)送WREN指令。然后CS信號(hào)被拉高,并將狀態(tài)寄存器中的WEL位更新為邏輯“1”。具體的操作時(shí)序如下:
??根據(jù)上述時(shí)序圖,我們可以編寫AT25XXX系列EEPROM存儲(chǔ)器操作啟用的程序如下:
(2)、寫操作禁用
??為了防止誤寫,寫禁用(WRDI)指令(0x04)通過將WEL位設(shè)置為邏輯“0”來禁用所有編程模式。WRDI指令與WP引腳的狀態(tài)無關(guān)。具體的操作時(shí)序如下圖所示:
??根據(jù)上述時(shí)序圖,我們可以編寫AT25XXX系列EEPROM存儲(chǔ)器操作禁用的程序如下:
3、驅(qū)動(dòng)的使用
??在上一節(jié)我們?cè)O(shè)計(jì)并實(shí)現(xiàn)了AT25XXX系列EEPROM存儲(chǔ)器的驅(qū)動(dòng)程序,而這一節(jié)我們將設(shè)計(jì)一個(gè)簡單的應(yīng)用來驗(yàn)證這一驅(qū)動(dòng)程序。
3.1、聲明并初始化對(duì)象
??使用基于對(duì)象的操作我們需要先得到這個(gè)對(duì)象,所以我們先要使用前面定義的AT25XXX系列EEPROM存儲(chǔ)器對(duì)象類型聲明一個(gè)AT25XXX系列EEPROM存儲(chǔ)器對(duì)象變量,具體操作格式如下:
??At25ObjectType at25;
??聲明了這個(gè)對(duì)象變量并不能立即使用,我們還需要使用驅(qū)動(dòng)中定義的初始化函數(shù)對(duì)這個(gè)變量進(jìn)行初始化。這個(gè)初始化函數(shù)所需要的輸入?yún)?shù)如下:
??對(duì)于這些參數(shù),對(duì)象變量我們已經(jīng)定義了。而對(duì)象類型為枚舉,根據(jù)實(shí)際使用的AT25XXX系列EEPROM存儲(chǔ)器來選擇就好了。主要的是我們需要定義幾個(gè)函數(shù),并將函數(shù)指針作為參數(shù)。這幾個(gè)函數(shù)的類型如下:
/* 定義讀數(shù)據(jù)操作函數(shù)指針類型 */ typedef void (*AT25Read)(uint8_t *rData,uint16_t rSize); /* 定義寫數(shù)據(jù)操作函數(shù)指針類型 */ typedef void (*AT25Write)(uint8_t *wData,uint16_t wSize); /* 定義延時(shí)操作函數(shù)指針類型 */ typedef void (*AT25Delayms)(volatile uint32_t nTime); /* 定義使用SPI接口時(shí),片選操作函數(shù)指針類型 */ typedef void (*AT25ChipSelect)(AT25xxxCSType cs);??對(duì)于這幾個(gè)函數(shù)我們根據(jù)樣式定義就可以了,具體的操作可能與使用的硬件平臺(tái)有關(guān)系。片選操作函數(shù)用于多設(shè)備需要軟件操作時(shí),如采用硬件片選可以傳入NULL即可。具體函數(shù)定義如下:
/*讀AT25寄存器值*/ static void ReadDataFromAT25(uint8_t *rData,uint16_t rSize) {HAL_SPI_Receive (&at25hspi,rData,rSize,1000); }/*寫AT25寄存器值*/ static void WriteDataToAT25(uint8_t *wData,uint16_t wSize) {HAL_SPI_Transmit (&at25hspi,wData,wSize,1000); }/*片選操作*/ void ChipSelectForAT25(AT25xxxCSType cs) {if(cs==AT25CS_Enable){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);} }??對(duì)于延時(shí)函數(shù)我們可以采用各種方法實(shí)現(xiàn)。我們采用的STM32平臺(tái)和HAL庫則可以直接使用HAL_Delay()函數(shù)。于是我們可以調(diào)用初始化函數(shù)如下:
At25xxxInitialization(&at25, //AT25XXX對(duì)象實(shí)體AT25M01, //AT25XXX對(duì)象類型ReadDataFromAT25, //讀AT25XXX對(duì)象操作指針WriteDataToAT25, //寫AT25XXX對(duì)象操作指針HAL_Delay, //延時(shí)操作指針ChipSelectForAT25 //片選操作函數(shù));3.2、基于對(duì)象進(jìn)行操作
??我們定義了對(duì)象變量并使用初始化函數(shù)給其作了初始化。接著我們就來考慮操作這一對(duì)象獲取我們想要的數(shù)據(jù)。我們?cè)隍?qū)動(dòng)中已經(jīng)將獲取數(shù)據(jù)并轉(zhuǎn)換為轉(zhuǎn)換值的比例值,接下來我們使用這一驅(qū)動(dòng)開發(fā)我們的應(yīng)用實(shí)例。
/*AT25XXX數(shù)據(jù)讀寫操作*/ void AT25ReadWriteData(void) {uint16_t regAddress=0x02;uint8_t readByte;uint8_t writeByte=0x0A;uint8_t rData[2];uint16_t rSize=2;uint8_t wData[]={0x5A,0xA5};uint16_t wSize=2;/*從AT25XXX讀取單個(gè)字節(jié),從隨機(jī)地址讀取*/readByte=ReadByteFromAT25xxx(&at25,regAddress);/*向AT25XXX寫入單個(gè)字節(jié)*/WriteByteToAT25xxx(&at25,regAddress,writeByte);/*從AT25XXX讀取多個(gè)字節(jié),從指定地址最多到所在頁的結(jié)尾*/ReadBytesFromAT25xxx(&at25,regAddress,rData,rSize);/*向AT25XXX寫入多個(gè)字節(jié),從指定地址最多到所在頁的結(jié)尾*/WriteBytesToAT25xxx(&at25,regAddress,wData,wSize); }4、應(yīng)用總結(jié)
??在本片中我們討論并設(shè)計(jì)了AT25XXX系列EEPROM存儲(chǔ)器的驅(qū)動(dòng)程序,并據(jù)此設(shè)計(jì)了一個(gè)簡單的驗(yàn)證應(yīng)用。無論是寫數(shù)據(jù)還是讀數(shù)據(jù)均可順利執(zhí)行,說明我們的驅(qū)動(dòng)設(shè)計(jì)是正確的。
??需要注意的是,4K(512x8)容量的AT25XXX系列EEPROM存儲(chǔ)器需要9為地址,但在實(shí)際操作時(shí)只用了1個(gè)字節(jié)來裝載地址,最高位(第9位)地址借用了操作碼的第4位來傳送。
??在使用驅(qū)動(dòng)時(shí)需注意,采用SPI接口的器件需要考慮片選操作的問題。如果片選信號(hào)是通過硬件電路來實(shí)現(xiàn)的,我們?cè)诔跏蓟瘯r(shí)給其傳遞NULL值。如果是軟件操作片選則傳遞我們編寫的片選操作函數(shù)。
??在這一驅(qū)動(dòng)設(shè)計(jì)的過程中我們并未驗(yàn)證讀寫數(shù)據(jù)的正確性,事實(shí)上如果是比較重要的數(shù)據(jù)我們可以為其添加驗(yàn)證,如CRC驗(yàn)證等。
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的外设驱动库开发笔记40:AT25xxx外部存储器驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一年中最后一个月的最后一天说说_2020
- 下一篇: 春泥计算机科技怎么样,2021人工智能就