精简ISA扩展总线接口读写操作

英创公司的嵌入式主板系列产品为了支持客户的各种应用扩展,所有的arm9系列和x86系列的嵌入式主板均带有精简isa扩展总线。isa总线是pc机最经典的扩展总线(在嵌入式领域,通常以pc104总线的形式出现),在工业控制领域有着广泛的应用,以及深厚的应用基础。所谓精简isa总线就是在保持通用isa总线时序不变的前提下,仅保留常用的总线信号,以最大限度的减少总线总的信号数量,以适应模块的小型化。英创公司的精简isa总线包括8位数据总线、5位地址总线(可扩展到13位)、片选控制线、读写控制线以及中断请求线。英创公司所提供的评估开发底板将这些信号线制定了一个接口标准,采用双排20芯 idc插针,用户可利用精简isa总线进行系统功能的扩展。
在英创的精简isa总线中,设置了2条独特的片选控制信号cs0#和cs1#,这样就省去了大量的高位地址总线。cs0#和cs1#为低电平有效的脉冲信号。在x86 系列的嵌入式产品中,cs0#片选信号的地址区域为0x200–0x21f,cs1#片选信号的地址区域为0x300 – 0x31f。在arm9系列的嵌入式产品中,客户就不用关心精简isa总线的绝对地址,只要选定一个片选信号及基于这个片选的地址偏移量即可。如在x86系统下选用了cs1作片选信号,对0x301进行操作,则相对于arm系统,可使用cs1#、地址偏移量为1的端口。arm9系列板卡的cs0#、cs1#所对应的地址区域范围有所不同。em9000有13条地址线,每位片选可访问8k的地址空间。em9160、em9161的每位片选可访问32 个地址空间。em9260、em9360的cs0#可访问到8k的地址空间,cs1#可访问到1k的地址空间。
以下是英创公司所提供的精简isa扩展总线接口的信号定义:
信号名称及简要描述 精简isa 信号名称及简要描述
pin# pin#
reset#,复位输出,低有效 1 2 sa0,地址总线
sd0,数据总线,lsb 3 4 sa1,地址总线
sd1,数据总线 5 6 sa2,地址总线
sd2,数据总线 7 8 sa3,地址总线
sd3,数据总线 9 10 sa4,地址总线
sd4,数据总线 11 12 we#,写信号控制线,低有效
sd5,数据总线 13 14 rd#,读信号控制线,低有效
sd6,数据总线 15 16 cs1#,i/o片选线,低有效
sd7,数据总线,msb 17 18 vcc,电源输出
irq,中断请求,上升沿有效 19 20 gnd,公共地
为了便于用户理解精简isa总线接口如何进行编程,本节以x86指令和arm系统为例,简单介绍基于英创嵌入式主板的精简isa的应用。由于x86、em9000、em9x6x三种系统的isa总线读写操作函数不一样,所以在具体使用时,应当参考相应的'*.h'文件。以下是基于英创的嵌入式主板的精简isa总线操作指令表,以便查询:
系统 isa读 isa写
x86系列 inport( ) 或 inportb( ) outport( ) 或 outportb( )
em9000 em9000_read( ) em9000_write( )
em9x6x系列 isa_readuchar( ) isa_writeuchar( )
x86系统使用dos操作系统,其指令也是标准的c函数,所以操作isa时使用的时绝对地址。arm嵌入式主板使用的wince操作系统,存在地址映射问题,同时使用户更加方便对isa的使用,所以对isa操作的过程被封装成一个操作函数后再提供给用户,在对isa操作时不需要给出绝对地址,但是需要指明所使用的片选信号及基于当前片选信号的偏移地址。下面的读操作也是相同的。
isa总线的写操作:
c语言isa总线写操作函数:
outportb ( 0x301, ub1 ); // 将ub1的数据写入0x301地址或寄存器
em9000 isa总线写操作函数:
#define cs1# 1 // arm系统的cs1片选信号的定义,以下不再说明
em9000_write ( cs1# , 0x1 , ub1 ); // 将ub1的数据写入cs1片选信号使能的1偏移地址
em9x6x isa总线写操作函数:
isa_writeuchar ( cs1#, 0x1 , ub1); // 将ub1的数据写入cs1片选信号使能的1偏移地址
对应的总线写时序图为(本文中的总线周期示意图以arm系列模块为例):
isa总线的读操作:
c语言isa总线读操作函数:
uchar ub1 = inportb ( 0x301 ); // 将0x301地址或寄存器的数据读入ub1
em9000 isa总线读操作函数:
uchar ub1 = em9000_read ( cs1# , 0x1 ); // 将cs1片选信号使能的1偏移地址的数据读入ub1
em9x6x isa总线读操作函数:
isa_readuchar ( cs1#, 0x1 , &ub1);// 将cs1片选信号使能的1偏移地址的数据读入ub1
对应的总线时序关系为:
如果应用程序要读写一个16-bit的数据,即一个字时,在x86系统中,可以使用:
unsigned int ui1 = inport(0x301);// 读16位数据
outport(0x301, ui1);// 写16位数据
利用c函数一次性完成操作,在isa总线上会自动生成两个8位数据的读写周期,分别访问低位字节和高位字节。在ad、da的访问中经常会碰到这样的情形。
对arm9系统,应用只能通过两次调用总线读写函数分别处理16位数据的低位字节和高位字节,如用em9000 isa读写操作为例:
uchar ub1 = em9000_read ( cs1# , 0x1 );// 获得低位字节。
uchar ub2 = em9000_read ( cs1# , 0x2 );// 获得高位字节。
ui1 =( ub2 <>8) );// 写高字节数据
在使用精简isa总线进行扩展时,为了使总线的信号传输更加可靠,应在总线上的所有信号线加上rc网络以达到最佳的信号传输,同时,在高速的数据总线上,可以使用hct245作一次驱动。如下图所示:
扩展应用
1、用精简isa进行数据i/o扩展
用户如果使用的i/o较多,英创提供的嵌入式主板上的数据i/o又不够使用要求,则用户可以使用精简isa总线来进行扩展。仅使用3片简单的74逻辑器件,就可方便扩展出8路输入8路输出。英创公司的eta716扩展模块就是按照这种方式来实现的。
接口译码电路用一片74hct139做完成。
在x86系统下,应用程序执行读操作时:
unsigned char ub1 = inportb ( 0x300 ); // 把外部状态读取并存放到ub1中
在em9000系统下,应用程序执行读操作:
uchar ub1 = em9000_read (cs1# , 0x0);
74hct245被译码信号rd300h#选通,外部的输入状态input0 – input7将呈现在数据总线sd0 – sd7上,cpu将在rd300h#的上升沿时刻把总线上的数据锁存到ub1。
类似的,当应用程序执行写操作时:
x86系统下写:
outportb ( 0x300 , ub1 );// 把ub1数据输出送到0x300端口
在em9000系统下:
em9000_write (cs1# , 0x0 , ub1);
把ub1的数据送到isa数据总线上,译码信号we300h#变低有效,并在其上升沿时刻把总线上的数据锁存到74hct273的8个寄存器中,74hct273的8个寄存器的输出output0 – output7将保持不变,直至有新数据写入。当系统复位或上电启动时,低有效的复位信号reset#将保证把74hct273的输出清零。
2、用精简isa总线进行a/d采集扩展(应用模块:eta197)
用户还可以通过精简isa总线来扩展具有通用并行接口的a/d转换器,以实现简单的数据采集。以下是通过isa总线连接max197的信号接法,由于max197只有12位数据宽度,这里使用sa0地址线来作为高、低字节数据的选择,正好形成了两个连续的地址,方便函数的操作。
对max197进行ad转换的基本步骤为:
x86系统下:
1、写控制字节,启动ad转换:outportb(0x300, ctrlbyte);
2、延时15us
读取转换数据:unsigned int ub1 = inport(0x300);
// ub1为读入的16位数据
或em9000系统下:
1、写控制字节,启动ad转换:
em9000_write(cs1# , 0x0 , ctrlbyte );
2、延时15us
3、读取转换数据:
ub1 = em9000_read(cs1# , 0x0 );
ub1 = ub1 << 8 ;
ub1 = ub1 | (em9000_read(cs1# , 0x0 ) & 0xff );
对于不同的系统,请参见相应的eta197测试程序。
3、用精简isa总线进行串口扩展(应用模块:eta502)
同样的,用户也可以使用精简isa总线来扩展串口,如使用16c550芯片等。一片16c550需要占用8个i/o端口地址,所以,要使用到三条地址线,且这三条地址线最好是连续的地址线,以方便应用程序的开发与控制。 要注意的是,16c550的复位是高电平复位,而精简isa总线上的复位信号是低信号复位有效,所以在使用时,要将isa总线上的复位信号进行反向,再连接到16c550的复位上。如果要控制modem,则需要将16c550输出的信号经过rs232电平信号转换芯片的转换,再接一个db9的接头,则构成了一个标准的rs232通讯接口。
除了以上的应用以外,用户还可以利用英创的精简isa总线,方便地完成其它多种功能模块的扩展,如10m/100m以太网口、can总线接口、usb主控模块、24位通用数字io等等,英创公司也相应地提供了应用模块eta719、eta718、eta701、eta608、 eta724等供客户参考。

市面上桌面级产品为什么大多使用Intel和AMD的CPU
基于射频识别的RFID地下标识器系统的优势是什么
在应用编程MAXQ微控制器中可分区擦除的程序和数据闪存
FPGA上的HBM性能实测结果分析
米尔参加openEuler大会,助力国产工业控制器软硬件升级
精简ISA扩展总线接口读写操作
传言2021年微软会对Surface Pro的工业设计进行大手术?
Silicon Labs推出Bluetooth网状网络解决方案
苏泊尔物联网净水机DR3H6成为家庭净水优选
人工智能在未来不会取代人类只会让人更智能
北京首条大规模量产8英寸线项目封顶,预计年销售收入25.17亿元
中国集成电路设计创新大会暨IC应用博览会(ICDIA 2022)在无锡成功召开!
滤波电容的使用心得
乐视汽车资金缺口依然在 松下步东芝后尘?
小心你的数据线,黑客将通过它远程控制你的手机和电脑
Redmi Note10又有新爆料,线性马达、NFC 3.0让旗舰配置大众化
慧拓部署生产调度指挥系统 以科技创新助力智慧矿山建设
全自主IP芯片产品,重要行业深度解决方案提供商御芯微将亮相IOTE深圳物联网展
未来制造业重要技术,三D打印和声波打印
联想ThinkVision的P系列显示器专为职场达人设计