EM9287的扩展总线及应用

 2013-9-11          [nemail]    
[lablebox]

        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,如下图所示:

 

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

12

  ISA_CS#,ISA总线片选信号

  ISA_RD#,ISA总线读信号

34

  ISA_WE#,ISA总线写信号

  ISA_A0,ISA地址总线

56

  ISA_A1,ISA地址总线

  ISA_A2,ISA地址总线

78

  ISA_A3,ISA地址总线

  ISA_A4,ISA地址总线

910

  ISA_A5,ISA地址总线

  ISA_A6,ISA地址总线

1112

  ISA_A7,ISA地址总线

  ISA_D0,ISA数据总线(LSB)

1314

  ISA_D1,ISA数据总线

  ISA_D2,ISA数据总线

1516

  ISA_D3,ISA数据总线

  ISA_D4,ISA数据总线

1718

  ISA_D5,ISA数据总线

  ISA_D6,ISA数据总线

1920

  ISA_D7,ISA数据总线

  ISA_D8,ISA数据总线

2122

  ISA_D9,ISA数据总线

  ISA_D10,ISA数据总线

2324

  ISA_D11,ISA数据总线

  ISA_D12,ISA数据总线

2526

  ISA_D13,ISA数据总线

  ISA_D14,ISA数据总线

2728

  ISA_D15,ISA数据总线(MSB)

  GND

2930

  GND

  3.3V 电源输出

3132

  3.3V 电源输出


 

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

 

单数据写时序

 

单数据读时序

 

数据块写时序

 

数据块读时序

 

        精简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。一般情况下,为了保证系统的及时响应,每个线程运行的时间都不宜过长。

[lablebox]