江漢大學(xué)文理學(xué)院信息技術(shù)學(xué)部 鄧乃君 吳 文
?
SPI和單片機技術(shù)在嵌入式系統(tǒng)擴展中的應(yīng)用
江漢大學(xué)文理學(xué)院信息技術(shù)學(xué)部鄧乃君吳文
【摘要】隨著計算機技術(shù)、電子技術(shù)的快速發(fā)展,芯片制造成本明顯降低,嵌入式系統(tǒng)在移動設(shè)備、數(shù)碼產(chǎn)品等各個領(lǐng)域廣泛應(yīng)用。文中基于SPI接口集成外圍單片機的方法對嵌入式系統(tǒng)功能進行擴展,詳細(xì)闡述整個擴展方案的結(jié)構(gòu)及工作原理,重點介紹Linux環(huán)境下外圍設(shè)備驅(qū)動程序的運行方法,以期為類似開發(fā)程序提供重要參考。
【關(guān)鍵詞】SPI;單片機技術(shù);嵌入式系統(tǒng);擴展
近些年,對各類嵌入式系統(tǒng)進行設(shè)計中,對系統(tǒng)的存儲、通信需求提出更高的要求。嵌入式產(chǎn)品具有個性化、人性化的特征,從而受到更多商家和消費者的歡迎,促使嵌入式設(shè)備的市場競爭更加激烈。傳統(tǒng)的嵌入式系統(tǒng)外部接口比較滯后,導(dǎo)致嵌入式系統(tǒng)中擴展外部設(shè)備有一定的困難。雖然芯片技術(shù)的發(fā)展提供具有強大功能的SOC層,其集成的功能、接口更加豐富,但其開發(fā)費用、生產(chǎn)成本極高,在市場競爭中逐漸喪失價格優(yōu)勢。與片上系統(tǒng)比較,單片機的運算能力不理想,但其價格低、開發(fā)周期短,能夠基于用戶需求對其功能進行靈活調(diào)整,單片機的優(yōu)勢更加明顯。文中根據(jù)SPI接口、外圍單片機提出嵌入式系統(tǒng)功能擴展方法,通過 SPI在主CPU外圍集成單片機,借助單片機完成嵌入式系統(tǒng)的功能擴展。
嵌入式系統(tǒng)的擴展方案的設(shè)備主要包括主CPU、單片機、外圍設(shè)備三個部分,主CPU借助SPI接口實現(xiàn)與單片機交互數(shù)據(jù),通過單片機已有的IO口、UART等接口擴展一系列串口、紅外接口各項外圍設(shè)備。外圍數(shù)據(jù)經(jīng)單片機處理后借助SPI總線發(fā)送至主CPU。反之,主CPU想要訪問外圍設(shè)備也要借助SPI總線發(fā)送給單片機,通過單片機程序完成對外圍設(shè)備的訪問操作。系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)功能結(jié)構(gòu)簡圖
SPI接口也稱為外圍接口,數(shù)據(jù)傳遞速度相比I2C總線更快,能夠?qū)崿F(xiàn)主CPU與多個外圍器件傳輸數(shù)據(jù)信息的目的。SPI接口工作方式為主從模式,需要設(shè)計一個主機和一個多個從器件傳送數(shù)據(jù)。本次設(shè)計中,主CPU是以單主單從的模式與外圍單面機完成點對點通信。具體應(yīng)用過中,可以依據(jù)實際需求通過SPI總線在外圍集成相對應(yīng)的單片機控制單元,從而集成大量的外圍設(shè)備。因其實際應(yīng)用領(lǐng)域的差異,根據(jù)開發(fā)的SPI協(xié)議與單片機固件程序合理調(diào)整外圍設(shè)備,在并未增加大量制造成本和開發(fā)工作量的基礎(chǔ)上,完成對嵌入式系統(tǒng)功能的擴展操作。同時,外圍控制單片機能夠?qū)λ屑稍O(shè)備采集的信息進行相應(yīng)的前置處理,能夠分擔(dān)主CPU運算壓力,提升整個嵌入系統(tǒng)的響應(yīng)效率。
本系統(tǒng)所用的設(shè)備驅(qū)動程序基于Linux系統(tǒng)下進行設(shè)計,在Linux系統(tǒng)中,外部設(shè)備被抽象稱作文件,對文件開展的各項操作也是對外部設(shè)備的操作,上述機制被稱作虛擬文件系統(tǒng)。設(shè)備驅(qū)動程序是連接上層用戶程序與機器硬件的重要接口,能夠屏蔽硬件設(shè)備各項具體操作,把具體的硬件設(shè)備抽象為設(shè)備文件提供給用戶程序,促使應(yīng)用程序能夠像普通文件一樣對硬件設(shè)備實施讀寫操作。設(shè)備驅(qū)動程序主要任務(wù)在于對設(shè)備及資源進行釋放,讀取并會送程序發(fā)出的信息,實現(xiàn)用戶空間、內(nèi)核空間與物理層之間的數(shù)據(jù)傳遞。Linux環(huán)境下LED驅(qū)動程序代碼如下:
#define DEVICE_NAME "leds" //加載模式后,執(zhí)行”cat /proc/devices”命令看到的設(shè)備名稱 //
#define LED_MAJOR 231 /* 主設(shè)備號 //
應(yīng)用程序執(zhí)行ioctl(fd, cmd, arg)時的第2個參數(shù) */
#define IOCTL_LED_OFF 1
/* 用于指定LED所用的GPIO引腳 //
static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB7,
······
}。
本次設(shè)計的擴展方法,主CPU借助SPI接口與外圍單片機完成通信。對外圍設(shè)備驅(qū)動程序進行設(shè)計時,設(shè)置SPI通信、單片機控制兩個細(xì)節(jié),把單片機所集成的外圍設(shè)備與主CPU集成本地設(shè)備中,便于用戶程序進行讀寫操作。2.1本地系統(tǒng)設(shè)備驅(qū)動程序?qū)崿F(xiàn)過程
主CPU能夠直接集成本地串口設(shè)備及外圍單片機擴展的串口、IO設(shè)備等驅(qū)動實現(xiàn)過程。從本地設(shè)備驅(qū)動來說,驅(qū)動程序?qū)τ布O(shè)備展開的操作直接定義至接口函數(shù)內(nèi),如果用戶程序訪問設(shè)備文件,接口函數(shù)執(zhí)行對硬件設(shè)備的讀寫等操作。如果用戶程序借助串口驅(qū)動定義的接口函數(shù)對本次串口文件展開訪問操作,驅(qū)動核心會把用戶發(fā)出的請求傳遞至本地串口,通過該串口驅(qū)動底層定義硬件函數(shù)把串口數(shù)據(jù)發(fā)送至硬件設(shè)備,達(dá)到最佳的通信目的。
2.2SPI協(xié)議及外圍擴展設(shè)備實現(xiàn)過程
SPI協(xié)議就是串行外圍設(shè)備結(jié)構(gòu),主要應(yīng)用在AD轉(zhuǎn)換器、數(shù)字信號處理器、解碼器、實時時鐘之間,是需在芯片關(guān)節(jié)占用四根線,是一種高速的,全雙工的通信總線。SPI通信原理比較簡單,主要包括ss(cs)、sck、sdi、sdo構(gòu)成,基于SCK控制下,兩個雙向移位寄存器展開數(shù)據(jù)交換操作。因SPI總線接口主要占用微處理器4個I/O口線,使用SPI總線接口能有限監(jiān)護電力設(shè)計,節(jié)省大量常規(guī)電路接口器件及I/O口線,提升整個設(shè)計的可靠性。下文介紹SPI子程序設(shè)計代碼:
//首先定義好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;/*發(fā)送1為起始位*/
SCK=0;
for(i=0;<8;i++)/*發(fā)送操作碼和地址*/
{
if(add&0x80==1)
SDO=1;
SCK=0;/*從設(shè)備上升沿接收數(shù)據(jù)*/
add<<= 1;
}
SCK=1;/*從設(shè)備時鐘線下降沿后發(fā)送數(shù)據(jù),空讀1位數(shù)據(jù)*/
datal6<<= 1;/*讀16位數(shù)據(jù)*/
{
SCK= 1;
datal6|=0x01;
SCK =0;
datal6< < =1;
return datal6;
}
在單片機內(nèi)集成的外圍設(shè)備,因主CPU無法對其展開直接的硬件操作,其訪問過程比較復(fù)雜。SPI通信協(xié)議棧主要包括SPI基本驅(qū)動和虛通道協(xié)議棧兩部分,SPI基本驅(qū)動協(xié)議中設(shè)定SPI數(shù)據(jù)包純屬速度、糾錯方法等協(xié)議,確保SPI數(shù)據(jù)包能夠在主CPU與單片機進行順利傳輸。SPI虛通道協(xié)議棧設(shè)定每一個外擴展設(shè)備的數(shù)據(jù)格式、功能碼等協(xié)議,便于對SPI數(shù)據(jù)包展開解析、封裝操作.
驅(qū)動程序虛通道協(xié)議棧作為外圍設(shè)備的硬件驅(qū)動在,主要由外擴展設(shè)備數(shù)據(jù)處理、重點響應(yīng)等內(nèi)容。上述虛擬硬件驅(qū)動通過調(diào)用協(xié)議棧虛擬的通道實現(xiàn)在用戶與SPI硬件接口對數(shù)據(jù)進行傳遞。從單片機集成的外圍串口來說,這種外圍串口能與本地串口使用同一個串口驅(qū)動核心實施封裝,虛擬成為與本次串口相同的串口設(shè)備為用戶程序提供服務(wù)。本地串口驅(qū)動層能直接執(zhí)行串口硬件范圍操作,該虛擬硬件驅(qū)動并不執(zhí)行各項硬件操作,僅調(diào)用協(xié)議棧虛擬的數(shù)據(jù)通道向SPI硬件傳遞數(shù)據(jù),通過外圍單片機完成接收或發(fā)送串口數(shù)據(jù)的目的。
總之,對嵌入式系統(tǒng)功能進行擴展設(shè)計中,本次設(shè)計通過SPI接口集成外圍單片機的方法設(shè)計嵌入式系統(tǒng)擴展方案,詳細(xì)介紹整個擴展方案的工作原理,重點闡述在Linux環(huán)境下外圍驅(qū)動體系的接口及實現(xiàn)過程,這種擴展方案成為實現(xiàn)串口、通信接口等擴展功能,對改善外圍接口資源不足的問題做出重要貢獻(xiàn)。
參考文獻(xiàn)
[1]米書田,王濤,張然等.基于單片機及嵌入式系統(tǒng)管理煤炭存儲的探究[J].煤炭技術(shù),2013,32(2):240-242.
[2]秦磊,孫曼,王小亮等.CH395與 SPI 接口的以太網(wǎng)模塊設(shè)計[J].單片機與嵌入式系統(tǒng)應(yīng)用,2015,15(7): 61-64.
[3]陳宇珂,鄭理華,張興安,等.ATMEL AVR單片機SPI大容量Flash Rom擴展的實現(xiàn)[J].醫(yī)療衛(wèi)生裝備,2015,36(4):19-21,68.
[4]朱德良,吳國強,陳新春等.一種單片機多任務(wù)操作系統(tǒng)的設(shè)計與應(yīng)用[J].自動化與儀表,2014,29(1):50-52.
[5]湯沁,徐學(xué)軍,彭地卓等.基于Linux嵌入式系統(tǒng)的S3C6410和ADS1298R的SPI接口驅(qū)動的實現(xiàn)[J].中國新通信,2014,9(1):79-80,81.
[6]蔡紅專,劉強,陳琎等.嵌入式系統(tǒng)中基于SPI協(xié)議的SD卡擴展實現(xiàn)[J].微型機與應(yīng)用,2014,33(19):23-26.
鄧乃君(1993—),男,湖北武漢人,現(xiàn)就讀江漢大學(xué)文理學(xué)院信息技術(shù)學(xué)部,從事嵌入式系統(tǒng)的開發(fā)與研究。
作者簡介: