英創(chuàng)工控主板上的精簡ISA總線的主要應(yīng)用,就是支持客戶的專用電路單元的擴(kuò)展,如數(shù)據(jù)采集等。在精簡ISA總線中還包括了對外部硬件中斷的響應(yīng)輸入,關(guān)于硬件中斷的基本應(yīng)用方法已在《嵌入式主板EM9160精簡ISA總線硬件中斷的使用方法》一文中作了介紹,其基本應(yīng)用思路是工控主板,以下以EM9160為例,的硬件中斷驅(qū)動程序“IRQ1:”在檢測到IRQ信號的上升沿后,向上層應(yīng)用程序發(fā)送事件hIRQEvent,應(yīng)用程序響應(yīng)事件,對精簡ISA總線的寄存器進(jìn)行讀寫操作。由于從驅(qū)動程序發(fā)出的事件消息hIRQEvent傳到應(yīng)用程序需要有100us水平的延時,加上驅(qū)動程序本身的50us左右的延時,使應(yīng)用程序感受的延時達(dá)到150us。因此對需要更快速度響應(yīng)的應(yīng)用,這種應(yīng)用方式就有一定局限性了。一般說來,如果要進(jìn)一步提高EM9160的中斷響應(yīng)速度,就需要把作為中斷響應(yīng)的對ISA總線寄存器的操作內(nèi)容放到中斷驅(qū)動程序“IRQ1:”中,并在驅(qū)動程序中設(shè)置數(shù)據(jù)buffer,對中斷采集的數(shù)據(jù)進(jìn)行緩沖,而應(yīng)用程序則可批量讀取驅(qū)動程序采集數(shù)據(jù)。為了實現(xiàn)上述目標(biāo),我們對了中斷驅(qū)動程序“IRQ1:”的功能進(jìn)行了擴(kuò)展。本文主要介紹如何利用驅(qū)動程序的標(biāo)準(zhǔn)讀寫功能,來實現(xiàn)客戶需要的對精簡ISA總線寄存器的讀寫操作。
對精簡ISA總線寄存器的讀或?qū)懖僮?,可以用以下?shù)據(jù)結(jié)構(gòu)描述:
typedef struct _ISA_IO_
{
UCHARuCmd; // = 0: read, = 1: write
UCHARuCSNum; // = 0: CS0#, = 1: CS1#
UCHARuOffset; // = 0, 1, ... 31
UCHARuValue; // the data read from or write to
} ISA_IO, *PISA_IO;
在上述結(jié)構(gòu)中,偏移量uOffset對應(yīng)ISA總線的地址總線SA0 – SA4,8-bit寄存器的值則對應(yīng)變量uValue。
應(yīng)用程序在打開“IRQ1:”后,可通過標(biāo)準(zhǔn)的寫函數(shù)來加載需要中斷驅(qū)動程序執(zhí)行的ISA總線讀寫操作序列,典型代碼如下:
ISA_IOwr_seq[3]; // 3個讀寫操作
// 初始化讀寫序列
wr_seq[0].uCmd = 0; // 讀數(shù)據(jù)低字節(jié)
wr_seq[0].uCSNum = 1; // 使用CS1#片選段
wr_seq[0].uOffset = 0; // SA4 – SA0 = 5’b00000
wr_seq[1].uCmd = 0; // 讀數(shù)據(jù)高字節(jié)
wr_seq[1].uCSNum = 1;// 使用CS1#片選段
wr_seq[1].uOffset = 1; // SA4 – SA0 = 5’b00001
wr_seq[2].uCmd = 1; // 寫命令碼
wr_seq[2].uCSNum = 1;// 使用CS1#片選段
wr_seq[2].uOffset = 0; // SA4 – SA0 = 5’b00000
wr_seq[2].uValue = 0x18;// 0x18是控制碼
// 加載讀寫序列
DWORDdwLen = 0; // 實際寫入的長度
DWORDdwBufLen = 3 * sizeof(ISA_IO);
WriteFile( hIRQ, wr_seq, dwBufLen, &dwLen, NULL);
一旦加載了讀寫序列,中斷驅(qū)動程序就會在中斷線程中進(jìn)行相應(yīng)的讀寫操作,并以加載的讀寫序列為單元,把操作結(jié)果存儲在驅(qū)動程序內(nèi)部緩沖區(qū)。應(yīng)用程序可通過標(biāo)準(zhǔn)的讀函數(shù)來讀取數(shù)據(jù),典型代碼如下:
ISA_IO rd_seq[3]; // 3個讀寫操作
DWORDdwLen = 0; // 實際讀出的長度
DWORDdwBufLen = 3 * sizeof(ISA_IO);
ReadFile(hIRQ, rd_seq, dwBufLen, &dwLen, NULL );
要特別注意的是應(yīng)用程序讀出的是包含有ISA寄存器數(shù)據(jù)的ISA_IO結(jié)構(gòu)數(shù)組,需要按照具體的應(yīng)用對數(shù)據(jù)中的數(shù)據(jù)進(jìn)行解析組裝,才能獲得有意義的結(jié)果。如把低位字節(jié)和高位字節(jié)拼裝在一起,作為AD轉(zhuǎn)換的數(shù)據(jù):
DWORD dwADData =((DWORD)rd_seq[1].uValue << 8)| rd_seq[0].uValue;
另一個需要注意的是,應(yīng)用程序可采用反復(fù)讀取的方法,來獲取當(dāng)前驅(qū)動程序緩沖區(qū)中的全部數(shù)據(jù),這樣可提高應(yīng)用程序?qū)Σ杉瘮?shù)據(jù)的處理效率。因此應(yīng)用程序的數(shù)據(jù)讀取線程并不一定需要等待中斷事件hIRQEvent,而簡單采用Sleep(…)來掛起數(shù)據(jù)讀取線程。
在實際的數(shù)據(jù)采集應(yīng)用為例,對一定的數(shù)據(jù)采樣率(一般低于10ksps),可采用硬件生成的穩(wěn)定的時鐘信號來觸發(fā)AD轉(zhuǎn)換,而把AD轉(zhuǎn)換完成的標(biāo)志信號作為中斷信號,接到EM9160的IRQ上,一旦硬件中斷產(chǎn)生,中斷驅(qū)動程序就通過ISA總線讀取AD數(shù)據(jù)。對這樣的應(yīng)用,把采樣率限制在每秒10k樣點,代表中斷周期為100us,能保證WinCE對每個中斷的可靠響應(yīng)。另一方面AD應(yīng)采用并行數(shù)據(jù)總線接口芯片,如AD574等,才能保證中斷線程的處理速度,通常不推薦采用SPI或I2C等串行接口的AD芯片。
具有本文擴(kuò)展功能的驅(qū)動程序,會配置在2010年8月之后的EM9160主板中。對已購買EM9160的老客戶,若需要上述功能,可與英創(chuàng)技術(shù)支持部門聯(lián)系,以獲取內(nèi)核的免費更新。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35402
發(fā)布評論請先 登錄
相關(guān)推薦
評論