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