阅读:1197回复:6
读16位ISA端口的问题,好奇怪!
我的的ISA板,在2000系统下,我用DS写的驱动,进行单纯的16位端口的读操作。却发生了奇怪的现象:
插上板子,在驱动的分发例程里,我从5个端口读数据,每个端口读一个字,程序如下: miorange0.inw(1,pbuffer,1); miorange0.inw(2,pbuffer+1,1); miorange0.inw(3,pbuffer+2,1); miorange0.inw(4,pbuffer+3,1); miorange0.inw(5,pbuffer+4,1); miorange0是的端口对象,1,2,3,4,5是硬件的偏移地址,pbuffer是存放数据的缓冲区。上面程序应当是没有错误的吧! 用逻辑分析仪测量总线的读信号IOR,确发现了8个IOR信号,我明明是读了5个字,怎么会发现8个IOR?总线上的IOCS16是被置低的。 我把板子拔掉,只对板子上的ISA插槽操作,运行应用和驱动,发现了10个IOR信号,我把总线上的IOCS16接地,IOR变成了8个。和插板子的时候一样,怎么回事??? 很着急! |
|
|
沙发#
发布于:2003-08-28 20:52
怎么没人来回答??
|
|
|
板凳#
发布于:2003-08-29 09:40
1 2 3 4 对应什么东西?
应该是0x300, 0x302, 0x304这种吧? 不要是0x300, 0x301, 0x302... |
|
|
地板#
发布于:2003-08-29 09:41
我等下发个传真给你。
|
|
|
地下室#
发布于:2003-08-29 11:23
1 2 3 4 对应什么东西? 今天上午又做了实验: miorange0.inw(1,pbuffer,1); miorange0.inw(2,pbuffer+1,1); miorange0.inw(3,pbuffer+2,1); miorange0.inw(4,pbuffer+3,1); miorange0.inw(5,pbuffer+4,1); miorange0.inw(6,pbuffer+4,1); miorange0.inw(7,pbuffer+4,1); miorange0.inw(8,pbuffer+4,1); miorange0.inw(9,pbuffer+4,1); miorange0.inw(10,pbuffer+4,1); 我的基地址是0x300,我的IOCS16没接地。 发现 1 对应:0x301, 0x302 2 对应:0x302, 0x303 3 对应:0x304, 0x303 4 对应:0x304, 0x305 5 对应:0x305, 0x306 6 对应:0x306, 0x307 7 对应:0x308, 0x307 8 对应:0x308, 0x309 9 对应:0x309, 0x310 10 对应:0x310, 0x311 |
|
|
5楼#
发布于:2003-08-29 17:12
你发现的8个io操作不一定是你的板子的,有可能是其他的设备的
iocs16为低表示当前数据周期是16位的 如果你是8位数据总线宽度,iocs16不要为低 如果你是16位的,iocs16在你的数据操作期间才能为低,不要一直拉低 ,这样系统会认为对其他的设备操作也是16位的 最好不要在2000下面调试,因为2000禁止直接对io端口的访问 最好在win98或者dos下面调试,直接用bc调试,用inpw,outpw是16位的 写出,读入操作,你先在98或者dos下调试好了,再编2000的驱动程序, 很多开发都是这样 建议你先把单个io操作调试好了,再调试批处理 |
|
6楼#
发布于:2003-08-29 20:15
特别感谢grant的提醒和热心帮助和斑竹的回复!
问题就是出再了地址方面,我的程序执行的时候,应用读偶数地址的,不应当操作奇数地址。也就是说16位的传输是占用两个地址的。 放分! |
|
|