英创信息技术EM9170工控主板ISA总线数据介绍,ISA总线 2024-04-12 00:48:07 0 0 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)