EM9170工控主板ISA总线数据的读写

 2011-9-20          [nemail]    
[lablebox]

        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。用户可根据实际情况进行选择,相关的测试参考代码可参考英创提供开发光盘中的相关资料。

[lablebox]