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。用户可根据实际情况进行选择,相关的测试参考代码可参考英创提供开发光盘中的相关资料。
全部0条评论
快来发表一下你的评论吧 !