?? spi接口擴展大容量數據存儲器.txt
字號:
利用C8051F020的SPI接口擴展大容量數據存儲器
發布日期:2006-07-28 作者:王颯 來源:微計算機信息
摘要:本文介紹了一種利用串行外設接口(SPI)為SOC單片機C8051F020擴展大容量數據存儲器的設計方案,并給出來軟件流程圖和示例。該方案充分利用了SPI的功能,在極少地占用單片機引腳的情況下,實現了數據存儲器的擴展。
關鍵詞:串行外設接口;SOC單片機;數據存儲器
引言
在以網絡通訊、軟件和微電子為主要標志的信息產業飛速發展的今天,以為微處理器為核心的嵌入式系統隨處可見,這些系統應用的典型例子包括移動電話系統、汽車的應用、家用電器、航天應用、醫療設備和國防系統等[1]。作為嵌入式系統核心部分的微處理器分為8位,16位,32位和64位四大類。對于很大一部分應用領域,性能要求相對較低,而產品成本是最重要的考慮因素,這種情況下8位微處理器將是最佳選擇。在8位微處理器中8051芯片家族具有低成本、大范圍、易獲得和應用廣泛的特點,是開發嵌入式優秀平臺。另外需要指出的是為了適應目前IC產業中流行的SOC(system on a chip)設計潮流,許多著名半導體公司紛紛推出了基于8051架構的8051 SOC芯片,其中美國SILICON LAB公司的C8051Fxxx系列單片機就是一例。
在8051芯片家族的實際應用中經常遇到的問題是沒有足夠的數據存儲器用于支持較大的嵌入式系統。但是采用常規的擴展外部數據存儲器的方法存在一個較大的引腳資源問題(其通常占用了18條引腳)。這對于以外部引腳數本就不多的微處理器為核心的嵌入式系統來說是致命的。
為了解決這一矛盾,本文C8051F 單片機和AT45DB081芯片為例,以介紹了一種利用串行外設接口(SPI)擴展大容量數據存儲器的方法。
硬件簡介
C8051F 系列單片機[2]是完全集成的混合信號SOC芯片,具有與8051指令集完全兼容的CIP-51內核。它在一個芯片集成了構成一個數據采集或控制系統所需的幾乎所有模擬和數字外設以及其他功能部件。這些部件包括:ADC,可編程增益放大器、DAC、電壓比較器、電壓基準、溫度傳感器、SMBus/I2C、UART、SPI、定時器、PCA、內部振蕩器、WDT和電源監視器等。各個有輸入/輸出的內部部件可以通過交叉開關配置到I/O端口(P0、P1和P2)的外部引腳上。它內置了FLASH程序存儲器、內部RAM,部分器件內部還有一定數量的位于外部數據存儲器空間的XRAM。C8051F單片機具有片內調試電路,通過JTAG接口可以進行非侵入式、全速的在系統調試。這種真正能獨立工作的SOC單片機使得設計體積小、功耗低、可靠性高的單片機系統變得方便。
AT45DB081[3]是ATMEL公司推出的工作電壓為2.7~3.6V、可在系統重寫的SPI兼容的FLASH數據存儲器。它具有4096頁、每頁264字節(共計8M字節)的主存儲器容量以及2個264字節的SRAM數據緩存器。這種串聯接口FLASH存儲器十分適用于要求存儲密度高、引腳資源占用少、電源電壓低和功耗小的商業和工業應用領域。
硬件原理圖
C8051F單片機(以C8051F020為例)與AT45DB081的硬件原理圖見圖1所示。
圖1 C8051F020和AT45DB081的硬件連接原理圖
圖中將C8051F020的P0.2、P0.3和P0.4引腳通過交叉開關配置為SPI的CLK(串行時鐘)、MISO(主出從入)和MOSI(主出從入)信號線,分別與AT45DB081的時鐘、串行輸出和串行輸入引腳相連。將P3.0、P3.1和P3.2與AT45DB081的芯片復位、片選和忙閑狀態引腳相連。
單片機通過SPI與存儲器間啟動一次數據傳輸的過程為先將SPI標志為SPIF清零,然后向數據寄存器SPI0DAT寫入一個字節,當SPIF由硬件置1表示一次傳輸結束。
軟件編程
AT45DB081的操作方式及操作碼
對于AT45DB081,共有十種操作方式,見表1所示。
表1 AT45DB081的操作方式及操作碼
序號
操作方式
操作碼
1
讀主存儲器頁面內某個字節
52H
2
讀緩存器內某個字節
54H(Buffer1)、56H(Buffer2)
3
將主存儲器頁面數據傳送給緩存器
53H(Buffer1)、55H(Buffer2)
4
主存儲器頁面與緩存器進行數據比較
60H(Buffer1)、61H(Buffer2)
5
向緩存器中寫入數據
84H(Buffer1)、87H(Buffer2)
6
擦寫主存儲器頁面后并從緩存器寫入
83H(Buffer1)、86H(Buffer2)
7
不擦寫主存儲器頁面直接從緩存器寫入
88H(Buffer1)、89H(Buffer2)
8
直接對主存儲器頁面寫入(5、6或5、7的組合)
82H(Buffer1)、85H(Buffer2)
9
自動重寫主存儲器頁面(3、6的組合)
58H(Buffer1)、59H(Buffer2)
10
讀狀態寄存器
57H
軟件流程圖及示例
C8051F單片機對AT45DB081進行數據讀寫操作的軟件流程圖如圖2所示。
圖2中系統初始化包括系統時鐘初始化、設置交叉開關表將P0.2、P0.3和P0.4引腳配置為SPI接口,設置SPI特殊狀態寄存器和復位數據存儲器。
單片機通過P3.1讀取AT45DB081的忙閑狀態引腳來判斷存儲器是否空閑,若P3.2為“1”表示存儲器空閑,否則表示存儲器忙。當存儲器空閑時通過P3.1引腳輸出“0”選中存儲器。
選中存儲器后可以通過SPI發送命令字,表1所示的10種操作對應的命令字見文獻[3]。下面以表1中的第二種操作為例給出命令字示例:操作碼(54H)、15位無效位、9位緩存器內某字節的地址、8位無效數。當發送完命令字后可以讀取數據。
圖2 對AT45DB081進行數據讀寫操作的軟件流程圖
表1中的第二種操作為例的軟件示例(部分)如下。
void SendSPIByte(unsigned char ch) // 通過SPI發送一個字節數據
{
SPIF = 0; // SPIF位清零
SPI0DAT = ch; // 啟動一次數據發送
while (SPIF == 0); // 等待數據發送完畢
}
unsigned char GetSPIByte(void) //通過SPI接收一個字節數據
{
SPIF = 0; // SPIF位清零
SPI0DAT = 0; //啟動一次數據接收
while (SPIF == 0); // 等待數據接收完畢
return SPI0DAT; // 讀取SPI接收到的數據
}
SendSPIByte(54H); //發送操作碼52H
SendSPIByte(0x00); //發送8位無效位
SendSPIByte((unsigned char)(star_addr>>8)); //發送7位無效位和第一位地址位
SendSPIByte((unsigned char)star_addr); //發送后8位地址位
SendSPIByte(0x00); //發送8位無效位
Data=GetSPIByte(); //讀取緩存器中數據
示例中star_addr為unsigned int型數據,其低9位用于存放地址位。
結論
本文介紹的方法在占用C8051F單片機引腳數極少的情況下實現了大容量外部存儲器的擴展,并給出了軟件流程圖及示例。這種方法同樣可應用于其它帶有SPI接口電路的微處理器。現在我們正將這種方法應用到以C8051F020為核心的嵌入式數據采集系統中。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -