Board logo

标题: 如何在TC++3.0中对IO端口进行一次16位读写操作 [打印本页]

作者: ymzheng     时间: 2010-2-8 23:33    标题: 如何在TC++3.0中对IO端口进行一次16位读写操作

各位好。
最近设计了一个基于ISA总线的板卡。在DOS7.1下用TC++3.0作为开发工具,编写了一段程序,对板卡上的端口地址进行读写操作。基地址为0x280,各个寄存器的地址都是偶数。但对端口进行读写时须一次读写16位数据,现在读正常,但写不正常,不能将16位数据写入板卡上的寄存器中。我用的是TC++3.0中的inpw和outpw这两个函数来对板卡上的寄存器进行读写。但我看了TC++3.0关于这两个函数的解释,说,这两个函数都是分两次将16位数据写入和读出,第一次是对给定地址的端口进行8位读写(作为低8位),第二次是对给定地址+1的端口进行读写(作为高8位)。
请教各位,在DOS下,用TC++3.0,怎样才能做到一次读写16位数据?

[ Last edited by ymzheng on 2010-2-8 at 23:37 ]
作者: firstsail     时间: 2010-2-9 09:15


  Quote:
Originally posted by ymzheng at 2010-2-8 23:33:
各位好。
最近设计了一个基于ISA总线的板卡。在DOS7.1下用TC++3.0作为开发工具,编写了一段程序,对板卡上的端口地址进行读写操作。基地址为0x280, ...

可能是硬件问题。

      1:由于现在计算机的速度比较快,许许多多个人开发的ISA卡往往不能正常工作,主要是由于时序不对。很多硬件工程师认为“ISA写端口”与“ISA读端口”的时序是相同的,又恰恰好IBM只公布了“ISA读端口”时序,而“ISA读端口”是在“IOR低电平”时读入,所以工程师们想当然认为“ISA写端口”是在“IOW低电平时”写入。这种错误在速度比较低的386/486计算机可以正常工作,计算机速度快了就不行了。正确的“IOW”是在“IOW上升沿”时写入才对。

    2:“16位ISA端口读写”与“8位ISA端口读写”是不同的,主要是IOCS16线的应用。
作者: Johnham     时间: 2010-3-27 18:42


  Quote:
Originally posted by ymzheng at 2010-2-8 11:33 PM:
。。。解释,说,这两个函数都是分两次将16位数据写入和读出,第一次是对给定地址的端口进行8位读写(作为低8位),第二次是对给定地址+1的端口进行读写(作为高8位)

要证实这点,示波器或逻辑分析仪测量此板卡,重点就是楼上所指信号,证实了后,与板卡设计者讨论解决问题的方法,应不难了。
作者: cir2633     时间: 2010-4-2 10:57
google一下inp(),outp()函数,这两个是一次写8bit的
作者: cir2633     时间: 2010-4-2 11:02
是不是你的单个寄存器是16bit的?
比如想写的数是int a;
int a_h=(a>>8)&0xff;
int  a_l=a&0xff;