英创信息技术EM9287的扩展总线及应用介绍

描述

EM9287是英创公司新近推出的,专门针对网络通讯应用的工控主板产品,通讯接口方面以独立双以太网口、双CAN接口以及7路标准串口为特色。若客户应用有HMI的需求,通常可选择预装Windows CE6.0操作系统的主板产品,另一方面,若不需要图形显示功能的,选择预装Linux-3.9.7操作系统的EM9287,则更能发挥其网络通讯的能力。进一步的,EM9287可把未使用的LCD显示接口转换成16-bit的精简ISA扩展总线,作为主板与客户专用电路单元的数据传输通道。EM9287的精简ISA总线的数据传输速度最高可达8MB/s,可满足绝大多数用户扩展电路的数据传输需求。本文以下部分,主要介绍EM9287的精简ISA总线的技术特性,以及在Linux环境下,应用程序实现ISA总线数据读写的方法。

EM9287主板上共有4组接口排针,分别命名为CN1 – CN4,如下图所示:

WINDOWS

EM9287的CN1 – CN4所在位置示意图

其中的CN4即为精简ISA总线的接口排针。由于LCD显示被作为了EM9287的标准配置,因此一般情况下,EM9287只焊了CN3插座,没有焊CN4的插针。若客户要求所购的EM9287支持精简ISA总线,则需要在购买时特别申明此需求。注意,支持精简ISA总线的EM9287主板,不再焊接CN3插座,而是带有CN4双排插针。与CN1和CN2不一样,CN4为2mm间距的双排插针。

CN4上个插针的信号定义如下表:

信号名称及简要描述 CN4 信号名称及简要描述
PIN# PIN#
  NC 1 2   ISA_CS#,ISA总线片选信号
  ISA_RD#,ISA总线读信号 3 4   ISA_WE#,ISA总线写信号
  ISA_A0,ISA地址总线 5 6   ISA_A1,ISA地址总线
  ISA_A2,ISA地址总线 7 8   ISA_A3,ISA地址总线
  ISA_A4,ISA地址总线 9 10   ISA_A5,ISA地址总线
  ISA_A6,ISA地址总线 11 12   ISA_A7,ISA地址总线
  ISA_D0,ISA数据总线(LSB) 13 14   ISA_D1,ISA数据总线
  ISA_D2,ISA数据总线 15 16   ISA_D3,ISA数据总线
  ISA_D4,ISA数据总线 17 18   ISA_D5,ISA数据总线
  ISA_D6,ISA数据总线 19 20   ISA_D7,ISA数据总线
  ISA_D8,ISA数据总线 21 22   ISA_D9,ISA数据总线
  ISA_D10,ISA数据总线 23 24   ISA_D11,ISA数据总线
  ISA_D12,ISA数据总线 25 26   ISA_D13,ISA数据总线
  ISA_D14,ISA数据总线 27 28   ISA_D15,ISA数据总线(MSB)
  GND 29 30   GND
  3.3V 电源输出 31 32   3.3V 电源输出

所有接口信号的电平均为3.3V TTL。EM9287的精简ISA总线支持双向16-bit数据总线,8位地址总线,以及3条控制总线。3条总线控制信号(片选、读脉冲、写脉冲)均为低电平有效。单数据读写的总线周期为360ns,而多数据读写的总线则只有240ns,可保证每秒8M字节的数据吞吐能力。精简ISA总线的典型总线时序如下:

WINDOWS

单数据写时序

WINDOWS

单数据读时序

WINDOWS

数据块写时序

WINDOWS

数据块读时序

精简ISA总线驱动的设备节点为“/dev/em9287_isa”,通过标准的文件open函数打开:

int fd; 
        fd = open('/dev/em9287_isa', O_RDWR);

EM9287精简ISA总线的地址范围为0 – 255。为了简化应用程序,避免使用ioctl专用定义,总线地址通过标准函数lseek来设置:

unsigned int offset;
        //设置地址到offset
        lseek(fd, offset, SEEK_SET);

总线读写的数据尽管只有16位,但驱动程序要求的数据类型为32位格式,具体可选unsigned int或u32。32位变量中的低16位为真正的总线数据,高16位无意义。调用函数write将启动总线写,调用函数read将启动总线读。

写操作的基本调用形式为:
        int rc; 
        unsigned int buf[]; //数据buffer
        unsigned int len; //实际写的数据长度

        //准备需要写出的数据....
        rc = write(fd, buf, len * sizeof(unsigned int));

相应地,读操作的基本调用形式为:
        rc = read(fd, buf, len * sizeof(unsigned int));
        //处理在buf的读取数据....

读写数据的长度至少为1,最长不能超过16K(16384)。在进行数据块读写时,需要注意,16K数据的读或写将耗时4ms,而Linux分给每个线程的时间片最长只有10ms。一般情况下,为了保证系统的及时响应,每个线程运行的时间都不宜过长。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分