精简ISA总线信号

英创公司的嵌入式主板产品,如ESM7000、ESM335x等,均配置有精简ISA总线接口,基本的精简ISA总线由8位地址数据总线(分时复用)+ 4条控制信号组成,通过异步操作的读写总线周期,来实现对外部逻辑单元的控制。精简ISA总线的最大优点是硬件接口简单、应用程序接口简单,读写速度可达4MB/s,特别适合在嵌入式系统中使用。实现主板与用户专用接口电路的控制与数据传输。

精简ISA总线核心的12条信号线定义如下:

信号名称

信号功能简要说明

ISA_AD0

地址数据总线,LSB

ISA_AD1

地址数据总线

ISA_AD2

地址数据总线

ISA_AD3

地址数据总线

ISA_AD4

地址数据总线

ISA_AD5

地址数据总线

ISA_AD6

地址数据总线

ISA_AD7

地址数据总线,MSB

ISA_RDn

总线数据读控制信号,低电平有效

ISA_WEn

总线数据写控制信号,低电平有效

ISA_ADVn

总线地址锁存控制信号,低电平有效

ISA_CSn

总线周期片选控制信号,低电平有效

上表的12条信号直接从ESMARC主板引出,再配置上总线复位信号和中断信号(通常由主板的GPIO信号来实现),就可驱动各种接口单元了。

精简ISA总线时序

基本的总线时序包括读总线周期和写总线周期。以下时序来自ESM7000嵌入式主板的精简ISA总线,ESM335x的精简ISA总线时序也完全同样的,其扩展外设逻辑电路可直接互换。

异步读总线周期时序

异步写总线周期时序

对异步读写操作,一个完整的读写操作时间包括上述的总线操作周期和总线周期间隔,大约在240ns – 250ns,对应着4MB/s – 4.2MB/s的数据读写速度。锁存的地址也是8-bit,对应精简ISA总线的寻址能力是256个8-bit寄存器,这对绝大多数嵌入式应用已足够使用。

WinCE平台编程方法

ESM7000和ESM335x均支持Windows CE平台(WEC7),对精简ISA总线配置了相应的驱动程序。用户的应用程序只需通过对其驱动程序进行操作,即可实现对ISA总线的读写操作。为方便应用调用,封装了几个基本操作函数:

HANDLE  ISA_Open( LPCWSTR lpDevName )
{return CreateFile(lpDevName,            // name of deviceGENERIC_READ|GENERIC_WRITE,         // desired accessFILE_SHARE_READ|FILE_SHARE_WRITE,   // sharing modeNULL,                               // security attributes (ignored)OPEN_EXISTING,                      // creation dispositionFILE_FLAG_RANDOM_ACCESS,            // flags/attributesNULL);
}BOOL    ISA_Close( HANDLE hISA)
{return CloseHandle( hISA );
}BOOL    ISA_ReadUchar(HANDLE hISA, DWORD dwPortOffset, PBYTE pBuf)
{DWORD dwBufSize = sizeof(BYTE);DWORD dwNbBytesRead = 0;*pBuf = (BYTE)(dwPortOffset & 0xFF);return ReadFile(hISA, pBuf, dwBufSize, &dwNbBytesRead, NULL);
}BOOL    ISA_WriteUchar(HANDLE hISA, DWORD dwPortOffset, BYTE ucValue)
{WORD  wValue;DWORD dwBufSize = sizeof(WORD);DWORD dwNbBytesWritten = 0;wValue = (WORD)(dwPortOffset & 0xFF);wValue = (wValue << 8) | ucValue;return WriteFile(hISA, &wValue, dwBufSize, &dwNbBytesWritten, NULL);
}BOOL    ISA_ReadWord(HANDLE hISA, DWORD dwPortOffset, WORD* pBuf)
{DWORD dwBufSize = sizeof(WORD);DWORD dwNbBytesRead = 0;*pBuf = (WORD)(dwPortOffset & 0xFE);return ReadFile(hISA, pBuf, dwBufSize, &dwNbBytesRead, NULL);
}BOOL    ISA_WriteWord(HANDLE hISA, DWORD dwPortOffset, WORD wValue)
{DWORD dwValue;DWORD dwBufSize = sizeof(DWORD);DWORD dwNbBytesWritten = 0;dwValue = (dwPortOffset << 16) | wValue;return WriteFile(hISA, &dwValue, dwBufSize, &dwNbBytesWritten, NULL);
}

打开设备文件Handle

HANDEL hISA = ISA_Open( _T("ISA1:"));
if( hISA == INVALID_HANDLE_VALUE) {// error processing
}

读操作

    DWORD   dwPortOffSet = 0;  // 0x00 .. 0xFFBYTE    ucValue;WORD    wValue;BOOL    bRet;// read a bytebRet = ISA_ReadUchar(hISA, dwPortOffSet, &ucValue);// read a wordbRet = ISA_ReadWord(hISA, dwPortOffSet, &wValue);

写操作

    DWORD   dwPortOffSet = 0;  // 0x00 .. 0xFFBYTE    ucValue = 0x55;WORD    wValue = 0x55aa;BOOL    bRet;// write a bytebRet = ISA_WriteUchar(hISA, dwPortOffSet, ucValue);// write a wordbRet = ISA_WriteWord(hISA, dwPortOffSet, wValue);

关闭设备文件Handle

ISA_Close(hISA);

Linux平台编程方法

ESM7000和ESM335x均支持Linux平台(Linux-4.x.x),对精简ISA总线配置了相应的驱动程序。在为用户的应用程序封装的函数中,除支持常规的端口读写外,同时支持了Linux特有的mmap操作,以提高读写速度。封装函数如下:

unsigned char *isa_base = NULL;
unsigned int  map_size = 4096;// return >= 0: return file handle
// return < 0: return failed code
int isa_open()
{int fd;fd = open("/dev/em_isa", O_RDWR);if(fd < 0) {return fd;}isa_base = (unsigned char*)mmap(0,map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);if (isa_base == MAP_FAILED) {printf("%s mmap failed\n", __func__);isa_base = NULL;close(fd);return -1;}return fd;
}int isa_close(int fd)
{if(isa_base != NULL) {munmap(isa_base, map_size);isa_base = NULL;}return close(fd);
}// offset: port address in isa bus
unsigned char isa_read(int fd, unsigned int offset)
{unsigned char val_b;int           rc;offset &= 0xff;if(isa_base != NULL) {unsigned short int val_w;val_w = *((unsigned short int*)(isa_base + (offset << 1)));val_b = (unsigned char)(val_w & 0xff);return val_b;}val_b = offset;rc = read(fd, &val_b, sizeof(unsigned char));if(rc < 0) {// read errorprintf("%s failed %d\n", __func__, rc);}return val_b;
}// offset: port address in isa bus
void isa_write(int fd, unsigned int offset, unsigned char val_b)
{unsigned short int val_w;int                rc;offset &= 0xff;if(isa_base != NULL) {val_w = val_b;*((unsigned short int*)(isa_base + (offset << 1))) = val_w;return;}val_w = ((offset & 0xff) << 8) | val_b;rc = write(fd, &val_w, sizeof(unsigned short int));if(rc < 0) {// write errorprintf("%s failed %d\n", __func__, rc);}
}// offset: port address in isa bus
unsigned short int isa_read16(int fd, unsigned int offset)
{unsigned short int val_w;int                rc;// 2-byte alignment is required for offsetoffset &= 0xfe;if(isa_base != NULL) {unsigned int val;val = *((unsigned int*)(isa_base + (offset << 1)));val_w = (unsigned short int)((val >> 8) | (val & 0x00ff));return val_w;}val_w = (unsigned short int)offset;rc = read(fd, &val_w, sizeof(unsigned short int));if(rc < 0) {// read errorprintf("%s failed %d\n", __func__, rc);}return val_w;
}// offset: port address in isa bus
void isa_write16(int fd, unsigned int offset, unsigned short int val_w)
{unsigned int val;int          rc;// 2-byte alignment is required for offsetoffset &= 0xfe;if(isa_base != NULL) {val = val_w;val = ((val << 8) & 0x00ff0000) | (val & 0x000000ff);*((unsigned int*)(isa_base + (offset << 1))) = val;return;}val = (offset << 16) | val_w;rc = write(fd, &val, sizeof(unsigned int));if(rc < 0) {// write errorprintf("%s failed %d\n", __func__, rc);}
}

打开设备文件Handle

//open file
int fd = isa_open();
if(fd < 0) {//open file failedprintf("open file = %d\n", fd);return fd;
}

读操作

    unsigned int offset = 0x00;unsigned int value;// read a bytevalue = isa_read(fd, offset);// read a wordvalue = isa_read16(fd, offset);

写操作

    unsigned int offset = 0x00;unsigned int value = 0x55aa;// write a byte, lower bytevalue = isa_write(fd, offset, value);// write a wordvalue = isa_write16(fd, offset, value);

关闭设备文件Handle

    isa_close(fd);

英创嵌入式主板精简ISA总线时序及基本编程方法相关推荐

  1. 英创嵌入式主板精简ISA总线典型应用案例

    本文主要介绍精简ISA总线的2种典型应用案例.可点击英创嵌入式主板的精简ISA总线,了解其基本产品信息及技术特性. 直接使用成熟的扩展模块 精简ISA总线大量用于多路工业通讯接口的扩展,如多路串口.以 ...

  2. Emtronix英创嵌入式主板简介

    概要 成都英创信息技术有限公司(www.emtronix.com)是一家从事嵌入式工业主板研发.销售.技术服务的高科技企业,专注于嵌入式行业已有20多年.ESMARC嵌入式工控主板是其主要的产品. 以 ...

  3. linux 查看触摸屏信息,英创信息技术eGalax触摸屏在Linux/X11下的标定方法

    eGalax是目前工控显示器的主流触摸屏控制器之一,对外多为USB接口.本文主要介绍在英创嵌入式主板ESM6802的X11桌面文件系统中加载eGalax触摸屏功能的方法. eGlax触摸屏的USB接口 ...

  4. Linux下DMA添加两个channel,基于Linux嵌入式系统的ISA总线DMA的实现

    1.DMA概述本文引用地址:http://www.eepw.com.cn/article/151577.htm DMA是外设与主存之间的一种数据传输机制.一般来说,外设与主存之间存在两种数据传输方法: ...

  5. linux添加扩展gpio,嵌入式Linux工控板的ISA总线GPIO扩展

    1.精简ISA总线GPIO扩展原理 在工业领域,GPIO的应用非常广泛,英利嵌入式Linux工控板上自带有16路GPIO.然而在实际应用中,经常需要多于16路的GPIO作为控制或者数据信号使用,这时候 ...

  6. 计算机基础知识--标准16位I/O设备的ISA总线周期

    计算机基础知识--标准16位I/O设备的ISA总线周期 写在前面的话:英语水平也有限,错误在所难免,请各位大牛不吝赐教,完善翻译.便于大家受益,在此谢过!(翻译选自<ISA System Arc ...

  7. 一文看懂嵌入式总线技术,ISA总线最流行?

    http://www.21ic.com/app/rf/201702/702829.htm [导读] 总线基础总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照 ...

  8. 什么是主板ISA总线

    ISA总线:(Industry Standard Architecture:工业标准体系结构)是IBM公司为PC/AT电脑而制定的总线标准,为16位体系结构,只能支持16位的I/O设备,数据传输率大约 ...

  9. 嵌入式主板有哪些特点?

    嵌入式主板一般指嵌入在设备里面做控制.数据处理使用的CPU板,简而言之是设备的"大脑".嵌入式到设备里面的话,就会对主板的体积以及功耗包括嵌入式主板的散热问题等有比较严格的要求.所 ...

最新文章

  1. 图解算法 广度优先算法
  2. vue——组件之elementTable组件再封装
  3. FATAL: NO bootable medium found! System halted
  4. mysql-on duplicate key update实现insertOrUpdate官方文档
  5. java笔记之线程方式1启动线程
  6. leetcode —— 866. 回文素数
  7. JVM虚拟机-Class文件之常量池
  8. Turbo码相关学习
  9. 永洪bi_永洪BI_咨询服务_数据服务_云市场-华为云
  10. 电视机顶盒搜台原理和方法简析
  11. 谷歌抢注18个“.中国”域名:扫清障碍
  12. iOS开发有关导航条坐标问题
  13. IOS中使用getUserMedia获取视频流展示到video中,进行人脸识别
  14. 基于51单片机的RFID一卡通刷卡扣费充值系统设计原理图程序设计
  15. c语言项目研发实训设计,关于软件设计实训心得体会(通用5篇)
  16. 天辰的救赎(JS)第三章(胖虎的指引)
  17. Python+班级管理系统 毕业设计-附源码171809
  18. 配置线在计算机端 使用什么端口,交换机怎么配置?这几种方式供你使用!
  19. Win7 UltraIso刻录时报错解决办法
  20. 20 多个国外优秀Android开源 App

热门文章

  1. MATLAB教程_11方程式求根_台大郭彦甫课程笔记
  2. 通过服务重启oracle数据库,oracle数据库怎么重启_网站服务器运行维护
  3. VFS基础学习笔记 - 5.读文件过程
  4. 如何写一个video播放器的demo?
  5. C#中 没有 windows media player
  6. 飞鸽传书linux进程退出不彻底
  7. 360N5全网通QPST备份NV和恢复教程
  8. 阴险的影音传送带和无能的趋势个人防火墙
  9. 测试部门软件测试规范
  10. 格灵深瞳:人脸识别工业级大规模人脸识别实践探讨 | 百万人学AI