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 | 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总线的典型总线时序如下:
单数据写时序
单数据读时序
数据块写时序
数据块读时序
精简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。一般情况下,为了保证系统的及时响应,每个线程运行的时间都不宜过长。
全部0条评论
快来发表一下你的评论吧 !