楼 主
如何在TC++3.0中对IO端口进行一次16位读写操作
发表于 2010-02-08 23:33 · 中国 重庆 联通
新手上路
★
积分 4
发帖 1
注册 2010-02-06 01:33
UID 160193
性别 男
状态 离线
各位好。
最近设计了一个基于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 ]
第 2 楼
发表于 2010-02-09 09:15 · 中国 广东 深圳 电信
高级用户
★★
积分 668
发帖 295
注册 2005-07-26 00:00
UID 41110
性别 男
来自 广东深圳
状态 离线
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线的应用。
第 3 楼
发表于 2010-03-27 18:42 · 中国 广东 深圳 福田区 天威有线宽带(关内)
初级用户
★
积分 24
发帖 11
注册 2008-08-21 15:25
UID 123780
性别 男
状态 离线
Originally posted by ymzheng at 2010-2-8 11:33 PM:
。。。解释,说,这两个函数都是分两次将16位数据写入和读出,第一次是对给定地址的端口进行8位读写(作为低8位),第二次是对给定地址+1的端口进行读写(作为高8位)
要证实这点,示波器或逻辑分析仪测量此板卡,重点就是楼上所指信号,证实了后,与板卡设计者讨论解决问题的方法,应不难了。
第 4 楼
发表于 2010-04-02 10:57 · 中国 北京 昌平区 联通
初级用户
★
积分 52
发帖 23
注册 2009-12-25 15:51
UID 157317
性别 男
状态 离线
google一下inp(),outp()函数,这两个是一次写8bit的
第 5 楼
发表于 2010-04-02 11:02 · 中国 北京 昌平区 联通
初级用户
★
积分 52
发帖 23
注册 2009-12-25 15:51
UID 157317
性别 男
状态 离线
是不是你的单个寄存器是16bit的?
比如想写的数是int a;
int a_h=(a>>8)&0xff;
int a_l=a&0xff;
论坛跳转: