EM9170工控主板的精簡ISA總線包括8位數據總線、5位地址總線、片選控制線、讀寫控制線以及中斷請求線。所提供的評估開發底板將這些信號線制定了一個接口標準,采用雙排20芯 IDC插針,用戶可利用精簡ISA總線進行系統功能的擴展。本文著重從軟件開發使用的角度來介紹ISA總線讀寫操作的使用方法。
EM9170預裝WinCE 6.0,WinCE 6.0和WinCE 5.0一個比較大的區別就是用戶數據區和內核數據區完全分開,應用程序無法進行指定地址的讀寫操作,因此在EM9170上ISA總線的是以流式驅動程序的方式來實現對其讀寫的操作,ISA總線設備的名稱為: _T(“ISA1:”),通過標準的CreateFile()函數打開該設備,對ISA總線數據的讀寫,EM9170的ISA驅動程序提供了兩種方式。一種是單個字節的數據讀寫,一種是基于同一ISA地址的連續讀寫操作。針對這兩種方式分別定義以下兩種數據結構:
typedef struct
{
DWORD dwCmd; // = 0: ISA讀操作, = 1: ISA寫操作
DWORD dwSeg; // = 0: ISA_CS0#, = 1: ISA_CS1#
DWORD dwOffset; // ISA地址偏移量:0 – 31
DWORD dwValue; // 數據值,只有低8位有效
} ISA_BUS_ACCESS, *PISA_BUS_ACCESS;
typedef struct
{
DWORD dwCmd; // 保留,恒為0
DWORD dwSeg; // = 0: ISA_CS0#, = 1: ISA_CS1#
DWORD dwOffset; // ISA地址偏移量:0 – 31
PBYTE pBuf; // 數據
DWORD dwLength; // 數據長度,以字節為單位
} ISA_BUS_BLOCK_ACCESS, *PISA_BUS_BLOCK_ACCESS;
第一種是單個字節的數據讀寫操作。應用程序通過調用相應的DeviceIoControl( )函數進行ISA數據讀寫操作,所帶參類型為ISA_BUS_ACCESS。如:
BOOL ISA_Read( HANDLE hISA_DIO, int nSeg, unsigned int nOffset, unsigned char *pRdValue )
{
ISA_BUS_ACCESS isabus;
isabus.dwCmd = 0;
isabus.dwSeg = nSeg;
isabus.dwOffset = nOffset;
isabus.dwValue = 0;
if (!DeviceIoControl(hISA_DIO, // file handle to the driver
ISA_IOCTL_READ_WRITE, // I/O control code
&isabus, // in buffer
sizeof(ISA_BUS_ACCESS), // in buffer size
pRdValue, // out buffer
sizeof(UCHAR), // out buffer size
NULL, // pointer to number of bytes returned
NULL)) // ignored (=NULL)
{
return FALSE;
}
return TRUE;
}
第二種是基于相同ISA地址的連續讀寫操作。應用程序通過調用標準的函數ReadFile() 、WriteFile( ),所帶參類型為ISA_BUS_BLOCK_ACCESS,如:
ISA_BUS_BLOCK_ACCESS isa_block;
isa_block.dwCmd = 0; // 恒為0
isa_block.dwLength = 16; // 讀寫數據塊長度,以字節為單位
isa_block.dwSeg = 1; // 使用ISA_CS1#
isa_block.pBuf = Buf; // 讀寫數據buffer指針
bRet = ReadFile( hISA, (LPVOID)&isa_block, sizeof(ISA_BUS_BLOCK_ACCESS), &dwLen, NULL );
bRet = WriteFile( hISA, (LPVOID)&isa_block, sizeof(ISA_BUS_BLOCK_ACCESS), &dwLen, NULL );
經過測試在EM9170板卡上,第一種單個字節ISA數據讀寫周期為12us;第二種連續讀寫方式其周期為380ns。用戶可根據實際情況進行選擇,相關的測試參考代碼可參考英創提供開發光盤中的相關資料。
-
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35296
發布評論請先 登錄
相關推薦
評論