SPI匯流排
SPI匯流排(Serial Peripheral Interface串列外圍裝置介面匯流排)是三線式的串列匯流排,是由摩托羅拉公司所研發,使用三線進行資料轉送,分別是SCK時鐘引腳,SI資料輸入引腳和SO資料輸出引腳,另外還有CS片選引腳可以對同一匯流排上的晶片進行選通使用,SPI匯流排已被廣泛使用在EEPROM、單片機和各種裝置中。常用串列EEPROM中的25XX系列晶片就是使用相容SPI匯流排結構,採用先進COMS技術,體積小,是一種理想的低功耗非易失性儲存空間,廣泛使用在各種家電、通訊、交通或工業裝置中,通常是用於儲存裝置或個人的相關設定資料。ATMEL公司生產的25系列的EEPROM儲存容量從1K位到256K位。其它一些晶片也會用到SPI匯流排,如常用的CPU監控晶片X5043、X5045就帶有512位元組的SPI介面EEPROM,常用於單片機系統的看門狗電路,同時也可以提供小資料量的儲存,給電路設計帶來很多的方便。此文將用X5045為例講述SPI的編程應用和X5045的一些其它功能。X5045由Xicor公司出品,電壓範圍有2.7V到5.5V和4.5V到5.5V二個版本,擦寫次數可達一百萬次,最高時鐘頻率可達3.3MHz。圖一是X5045的PID封裝實物圖。
圖二是X5045的引腳定義圖。CS/WDI是片選和看門狗複位輸入,當CS為高時SO引腳變為高阻態,這時可以允許其它器件共用SPI匯流排,同時晶片也處於休眠狀態,當CS為低時晶片被選中,並從休眠狀態中喚醒,可以進行讀寫操作。SO是串列資料輸出,在讀晶片時資料從此腳輸出。WP是防寫保護引腳,當WP為低時晶片防寫保護,不能對晶片寫操作,但其它功能不受影響。Vss是電源地。SI是串列資料輸入,接收來自控制器的資料和地址。SCK是串列時鐘輸入,RESET是複位輸出,Vcc是電源。在25晶片中還有一個HOLD引腳,此引腳的功能是保持輸入腳,ATMEL公司生產25晶片的HOLD引腳是低電平有效。不用此功能時,HOLD引腳要保持高電平。在晶片正在串列傳輸時,將HOLD拉為低電平,可以暫停進一步的傳送,具體方法是SCK變低後,將HOLD也拉低,不然在下一個SCK變低前不能暫停傳送,要恢複串列傳送,必須在SCK為低電平時將HOLD拉高。晶片處於暫停時,SI,SO,SCK腳為高阻狀態,任何時刻只要HOLD被拉低時,SO都會處於高阻狀態。
限於文章的篇幅,下面內容只著重介紹X5045晶片的SPI匯流排對EEPROM單元的編程應用。在X5040晶片中有6個指令,它和25系列晶片的指令是相容的,也就是說在25系列晶片中使用時基本上是不需要改變的,具體見表一。
| 指 令 |
指令格式 |
說 明 |
| WREN |
0000 0110 |
寫入允許 |
| WRDI |
0000 0100 |
寫入禁止 |
| RSDR |
0000 0101 |
讀狀態寄存器 |
| WRSR |
0000 0001 |
寫狀態寄存器,用於操作區塊防寫保護標識和看門狗標識 |
| READ |
0000 A8011 |
讀資料 |
| WRITE |
0000 A8010 |
寫資料 |
注:A8用於資料地址的第9位。
表一 指令集
寫入允許和禁止
X5045晶片內部有一個寫入使能寄存器,在需要向晶片寫入資料時,需要先用WREN指令使片內寫入使能寄存器先置位,寫入資料後可以用WRDI指令使寄存器複位到禁止狀態。當上電、WRSR指令執行、WRITE指令執行、WP拉低也會使寫入使能寄存器複位到禁止狀態。圖三是WREN/WRDI指令的操作時序圖。首先要把CS拉低,輸入資料,向SCK輸入時鐘訊號,資料在時鐘的上升沿有效,時鐘上升後至少資料至少保持30ns。資料是串列的,所以在每個刻度的上升沿發送一個位。在操作這兩個指令時,SO是處於高阻狀態的。
讀寫狀態寄存器
X5045片內有一個狀態寄存器,用於指於晶片的狀態和設定,可以讀寫,晶片出廠時狀態寄存器值為30H。具體每位的功能請看錶2。WIP寫入保護位,是唯讀位,指示晶片是否正忙於寫入操作。當WIP為"1"時,說明寫入進行中,為"0"時表示沒有進行寫入。在編程時,寫入資料操作後,可以查詢WIP位,當WIP為0後才進行下一次的寫入操作,這樣可以避免寫入出錯。WEL寫入使能狀態位,是唯讀位。WEL位的狀態由WREN和WRDI指令確定,WREN成功執行後WEL為"1"指示允許寫入資料,WRDI指令成功執行後WEL為"0"指示禁止寫入資料。在編程時可以先查詢WEL位的狀態,如為0時則要執行WREN後才可以進行寫入操作。BL0、BL1設定當前保護的區塊地址,是可讀寫位,這兩個位的設定和區塊地址的關係如表3,區塊的內容被保護後,就只能讀出而不能寫入了。25系列晶片中不同型號的晶片容量不一樣,BL設定所保護的範圍也不一樣。WD1、WD0看門狗設定位是X5045/43特有的設定位,是可以讀寫位,在25系列晶片中這兩個位是保留位,在X5045中有看門狗功能,這兩個位就用於設定MCU喂狗的時間,表4是看門狗位的設定時間。狀態寄存器的第6和第7位是保留位。讀狀態寄存器時,發送完RSDR指令後,SO由高阻態轉為輸出資料,從資料位元的高位開始。寫狀態寄存器,發送完WSDR指令後,再發一個位元組的狀態資料就可以了,其中唯讀位可以是"1"也可以是"0",它們不會被WSDR指令所更改。圖5、圖6是讀寫狀態寄存器的時序圖。
| 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
| 0 |
0 |
WD1 |
WD0 |
BL1 |
BL0 |
WEL |
WIP |
| 0 |
0 |
看門狗位1 |
看門狗位0 |
區塊保護1 |
區塊保護0 |
寫入使能狀態位 |
寫入保護位 |
表2 狀態寄存器定義
| BL1 |
BL0 |
保護位址範圍 |
| 0 |
0 |
無保護 |
| 0 |
1 |
180H-1FFH |
| 1 |
0 |
100H-1FFH |
| 1 |
1 |
000H-1FFH |
表3 BL設定位
| WD1 |
WD0 |
喂狗時間 |
| 0 |
0 |
1.4秒 |
| 0 |
1 |
600毫秒 |
| 1 |
0 |
200毫秒 |
| 1 |
1 |
功能禁用(出廠設定) |
表4 看門狗設定位
讀資料
圖6是讀資料時的時序,先拉低CS選中晶片,先要把需讀取的地址的第9位加到指令位元組的第4個位元組中,發送完指令位元組就發送地址位元組的前8位,這時SO就會由高阻態轉為輸出資料。每當一個位元組的資料傳送完畢後,晶片內部的地址指標自動加1,指向下一個資料地址,這時如仍有時鐘脈衝時,資料會被繼續輸出,CS腳拉高後輸出才會終止。當最高位地址的資料被讀出後,地址指標指向00H。
寫資料
在向晶片寫入資料之前,寫使能寄存器必須處於置位狀態,一般可以不必查詢寫使能寄存器的狀態,而直接用WREN置位寫使能寄存器。在發送完WREN指令後,必須把CS拉高,在CS拉高之前寫使能寄存器並沒有置位,這時向晶片傳送資料是不會被寫入的。寫使能寄存器置位後,再將CS拉低,把需讀取的地址的第9位加到指令位元組的第4個位元組中,發送完指令位元組就發送地址位元組的前8位,然後發送需寫入的資料。WRITE指令可以連續寫入16個位元組,但這16個位元組的地址必須在同一頁中。每一頁的地址由[xxxxx0000]開始,到[xxxxx1111]結束。操作方法就是在發送完每一個地址和資料後,繼續發後面的資料,晶片內部的地址指標會自動累加,當達到頁中最後一個位元組時,時鐘仍在繼續,則內部地址指標回到頁中第一個地址重新開始累加,並覆蓋以前寫入的資料。要注意的是,在操作過程中CS不能拉高,只有在資料位元組的最後一個位傳送完成後才可以拉高CS,不然寫入操作將不完全。在寫入資料或寫狀態寄存器指令寫送後,晶片會進入一次非易失性寫操作,這會花費一定的時間,最大約為10ms,在這個時間內可以用讀狀態寄存器,並檢查WIP位,當WIP為1時則說明寫入還在進行中,只有當WIP位為0時才可以進行下一次的讀寫資料操作,否則將會使寫入不完全。
下面我們用AT89C2051和X5045為主做一個密碼控制器實驗。使用X5045的看門狗功能可以使電路在受到幹擾或特殊情況死機後,可以自動複位重啟電路,使電路保持正常工作。使用X5045的資料讀寫功能,可以儲存密碼,也可以修改密碼。本文附帶的執行個體程式示範X5045的狀態寄存器的讀寫、儲存位的讀寫,裡面的功能函數可以直接移植到別的程式中。電路上電後,紅色LED亮,當按下按鍵時綠色LED閃亮一下,當按下"3,1,5,8,1,8",密碼正確,紅色LED滅,綠色LED亮,繼電器開啟,10秒後回到上電時的狀態。當按下第一次按鍵後20秒內沒有按下正確的索引值,則會進行下一次索引值輸入。程式可以方便修改成可以方便更改密碼的程式,也可以加入記錄工作次數的程式等等,升級成更實用的程式。圖9是筆者用萬用板搭建成的實驗電路。在上一篇提供的EEPROM讀寫器電路及程式也支援25系列晶片和X5043/45晶片,可以直接使用它來讀寫。