江漢大學文理學院信息技術學部 鄧乃君 吳 文
?
SPI和單片機技術在嵌入式系統擴展中的應用
江漢大學文理學院信息技術學部鄧乃君吳文
【摘要】隨著計算機技術、電子技術的快速發展,芯片制造成本明顯降低,嵌入式系統在移動設備、數碼產品等各個領域廣泛應用。文中基于SPI接口集成外圍單片機的方法對嵌入式系統功能進行擴展,詳細闡述整個擴展方案的結構及工作原理,重點介紹Linux環境下外圍設備驅動程序的運行方法,以期為類似開發程序提供重要參考。
【關鍵詞】SPI;單片機技術;嵌入式系統;擴展
近些年,對各類嵌入式系統進行設計中,對系統的存儲、通信需求提出更高的要求。嵌入式產品具有個性化、人性化的特征,從而受到更多商家和消費者的歡迎,促使嵌入式設備的市場競爭更加激烈。傳統的嵌入式系統外部接口比較滯后,導致嵌入式系統中擴展外部設備有一定的困難。雖然芯片技術的發展提供具有強大功能的SOC層,其集成的功能、接口更加豐富,但其開發費用、生產成本極高,在市場競爭中逐漸喪失價格優勢。與片上系統比較,單片機的運算能力不理想,但其價格低、開發周期短,能夠基于用戶需求對其功能進行靈活調整,單片機的優勢更加明顯。文中根據SPI接口、外圍單片機提出嵌入式系統功能擴展方法,通過 SPI在主CPU外圍集成單片機,借助單片機完成嵌入式系統的功能擴展。
嵌入式系統的擴展方案的設備主要包括主CPU、單片機、外圍設備三個部分,主CPU借助SPI接口實現與單片機交互數據,通過單片機已有的IO口、UART等接口擴展一系列串口、紅外接口各項外圍設備。外圍數據經單片機處理后借助SPI總線發送至主CPU。反之,主CPU想要訪問外圍設備也要借助SPI總線發送給單片機,通過單片機程序完成對外圍設備的訪問操作。系統結構如圖1所示。

圖1 系統功能結構簡圖
SPI接口也稱為外圍接口,數據傳遞速度相比I2C總線更快,能夠實現主CPU與多個外圍器件傳輸數據信息的目的。SPI接口工作方式為主從模式,需要設計一個主機和一個多個從器件傳送數據。本次設計中,主CPU是以單主單從的模式與外圍單面機完成點對點通信。具體應用過中,可以依據實際需求通過SPI總線在外圍集成相對應的單片機控制單元,從而集成大量的外圍設備。因其實際應用領域的差異,根據開發的SPI協議與單片機固件程序合理調整外圍設備,在并未增加大量制造成本和開發工作量的基礎上,完成對嵌入式系統功能的擴展操作。同時,外圍控制單片機能夠對所有集成設備采集的信息進行相應的前置處理,能夠分擔主CPU運算壓力,提升整個嵌入系統的響應效率。
本系統所用的設備驅動程序基于Linux系統下進行設計,在Linux系統中,外部設備被抽象稱作文件,對文件開展的各項操作也是對外部設備的操作,上述機制被稱作虛擬文件系統。設備驅動程序是連接上層用戶程序與機器硬件的重要接口,能夠屏蔽硬件設備各項具體操作,把具體的硬件設備抽象為設備文件提供給用戶程序,促使應用程序能夠像普通文件一樣對硬件設備實施讀寫操作。設備驅動程序主要任務在于對設備及資源進行釋放,讀取并會送程序發出的信息,實現用戶空間、內核空間與物理層之間的數據傳遞。Linux環境下LED驅動程序代碼如下:
#define DEVICE_NAME "leds" //加載模式后,執行”cat /proc/devices”命令看到的設備名稱 //
#define LED_MAJOR 231 /* 主設備號 //
應用程序執行ioctl(fd, cmd, arg)時的第2個參數 */
#define IOCTL_LED_OFF 1
/* 用于指定LED所用的GPIO引腳 //
static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB7,
······
}。
本次設計的擴展方法,主CPU借助SPI接口與外圍單片機完成通信。對外圍設備驅動程序進行設計時,設置SPI通信、單片機控制兩個細節,把單片機所集成的外圍設備與主CPU集成本地設備中,便于用戶程序進行讀寫操作。2.1本地系統設備驅動程序實現過程
主CPU能夠直接集成本地串口設備及外圍單片機擴展的串口、IO設備等驅動實現過程。從本地設備驅動來說,驅動程序對硬件設備展開的操作直接定義至接口函數內,如果用戶程序訪問設備文件,接口函數執行對硬件設備的讀寫等操作。如果用戶程序借助串口驅動定義的接口函數對本次串口文件展開訪問操作,驅動核心會把用戶發出的請求傳遞至本地串口,通過該串口驅動底層定義硬件函數把串口數據發送至硬件設備,達到最佳的通信目的。
2.2SPI協議及外圍擴展設備實現過程
SPI協議就是串行外圍設備結構,主要應用在AD轉換器、數字信號處理器、解碼器、實時時鐘之間,是需在芯片關節占用四根線,是一種高速的,全雙工的通信總線。SPI通信原理比較簡單,主要包括ss(cs)、sck、sdi、sdo構成,基于SCK控制下,兩個雙向移位寄存器展開數據交換操作。因SPI總線接口主要占用微處理器4個I/O口線,使用SPI總線接口能有限監護電力設計,節省大量常規電路接口器件及I/O口線,提升整個設計的可靠性。下文介紹SPI子程序設計代碼:
//首先定義好I/O口
sbit SDO=P1^0;
sbit SDI=P1^1;
······
sbit ACC_7= ACC^7;
unsigned int SpiRead(unsigned char add)
{
unsigned int datal6;
add&=0x3f;/*6位地址*/
add |=0x80;/*讀取操作碼l0*/
SDO=1;/*發送1為起始位*/
SCK=0;
for(i=0;<8;i++)/*發送操作碼和地址*/
{
if(add&0x80==1)
SDO=1;
SCK=0;/*從設備上升沿接收數據*/
add<<= 1;
}
SCK=1;/*從設備時鐘線下降沿后發送數據,空讀1位數據*/
datal6<<= 1;/*讀16位數據*/
{
SCK= 1;
datal6|=0x01;
SCK =0;
datal6< < =1;
return datal6;
}
在單片機內集成的外圍設備,因主CPU無法對其展開直接的硬件操作,其訪問過程比較復雜。SPI通信協議棧主要包括SPI基本驅動和虛通道協議棧兩部分,SPI基本驅動協議中設定SPI數據包純屬速度、糾錯方法等協議,確保SPI數據包能夠在主CPU與單片機進行順利傳輸。SPI虛通道協議棧設定每一個外擴展設備的數據格式、功能碼等協議,便于對SPI數據包展開解析、封裝操作.
驅動程序虛通道協議棧作為外圍設備的硬件驅動在,主要由外擴展設備數據處理、重點響應等內容。上述虛擬硬件驅動通過調用協議棧虛擬的通道實現在用戶與SPI硬件接口對數據進行傳遞。從單片機集成的外圍串口來說,這種外圍串口能與本地串口使用同一個串口驅動核心實施封裝,虛擬成為與本次串口相同的串口設備為用戶程序提供服務。本地串口驅動層能直接執行串口硬件范圍操作,該虛擬硬件驅動并不執行各項硬件操作,僅調用協議棧虛擬的數據通道向SPI硬件傳遞數據,通過外圍單片機完成接收或發送串口數據的目的。
總之,對嵌入式系統功能進行擴展設計中,本次設計通過SPI接口集成外圍單片機的方法設計嵌入式系統擴展方案,詳細介紹整個擴展方案的工作原理,重點闡述在Linux環境下外圍驅動體系的接口及實現過程,這種擴展方案成為實現串口、通信接口等擴展功能,對改善外圍接口資源不足的問題做出重要貢獻。
參考文獻
[1]米書田,王濤,張然等.基于單片機及嵌入式系統管理煤炭存儲的探究[J].煤炭技術,2013,32(2):240-242.
[2]秦磊,孫曼,王小亮等.CH395與 SPI 接口的以太網模塊設計[J].單片機與嵌入式系統應用,2015,15(7): 61-64.
[3]陳宇珂,鄭理華,張興安,等.ATMEL AVR單片機SPI大容量Flash Rom擴展的實現[J].醫療衛生裝備,2015,36(4):19-21,68.
[4]朱德良,吳國強,陳新春等.一種單片機多任務操作系統的設計與應用[J].自動化與儀表,2014,29(1):50-52.
[5]湯沁,徐學軍,彭地卓等.基于Linux嵌入式系統的S3C6410和ADS1298R的SPI接口驅動的實現[J].中國新通信,2014,9(1):79-80,81.
[6]蔡紅專,劉強,陳琎等.嵌入式系統中基于SPI協議的SD卡擴展實現[J].微型機與應用,2014,33(19):23-26.
鄧乃君(1993—),男,湖北武漢人,現就讀江漢大學文理學院信息技術學部,從事嵌入式系統的開發與研究。
作者簡介: