关于PCI基地址寄存器设置的问题,请大家帮忙看看

程序员小哈
嵌入式领域优质创作者
博客专家认证
2011-06-24 09:18:13
哪个朋友能帮我讲讲PCI基地址的问题哈,查了好久资料都没弄明白:
我的PCI配置空间是这样的:

00: 905210ba 0680000a 905210ba 00000100
10: ffffff00 00000000 00000000 00000000
20: 00000000 00000001 00000000 00000000
30: 00000000 00000000 00000102 00000100
40: 00000000 00000000 00000000 00000081
50: 00000000 00000000 00000000 00000011
60: 00784b46 ffffffff ffffffff ffffffff
70: ffffffff ffffffff ffffffff ffffffff
80: 905210ba 0680000a 905210ba 00000100
90: ffffff00 00000000 00000000 00000000
a0: 00000000 00000001 00000000 00000000
b0: 00000000 00000000 00000102 00000100
c0: 00000000 00000000 00000000 00000081
d0: 00000000 00000000 00000000 00000011
e0: 00784b46 ffffffff ffffffff ffffffff
f0: ffffffff ffffffff ffffffff ffffffff

PCI卡驱动加载完毕打印的信息为,DbgView查看StartDevice函数中的打印信息:
IRP_MN_START_DEVICE.
ResoureType: Memory Space:Address:0xfbcff000(Translated=0xfbcff000);Size: 0x80.
The MEM Base 0 is f7a81000; Count is 80.
ResoureType: I/O Port:Address:0xcf00(Translated=0xcf00);Size:0x80.
ResoureType: Memory Space:Address:0xfbcfe000(Translated=0xfbcfe000);Size: 0x100.
The MEM Base 2 is f7a60000;Count is 100.
ResouceType: Interrupt:Vector:0x13(Translated=0x163)

“基地址寄存器是一个32bit的寄存器,分为两个部分,后n个bit为只读(表示映射空间的大小),前32-n个为可读可写(表示该映射空间在内存空间中的基偏移地址)。PCI规范规定,主机初始化时,首先向该寄存器写全’1’,然后读该寄存器,通过该寄存器返回值来判断所映射空间的大小以及映射类型(内存或者I/O,最后一位为‘0’表示内存空间映射,否则市I/O空间映射),之后系统给该映射空间分配一个基偏移量。”
按上面的说法我的基地址 10: ffffff00,申请的内存空间应该是ffffff吗?为什么只有80h,100h呢?而且还是两个,我看后面配置空间都是00000000,为什么申请的内存空间为两块呢?谁能帮我解惑一下,谢谢啦

附StartDevice的实现:

NTSTATUS StartDevice(IN PDEVICE_OBJECT fdo,
IN PCM_PARTIAL_RESOURCE_LIST ResourceListRaw,
IN PCM_PARTIAL_RESOURCE_LIST ResourceList)
{
ULONG i;
ULONG vector;
KIRQL IrqL;
BOOLEAN GotInterrupt;
BOOLEAN GotPdcMem;
BOOLEAN GotBaseMem;
NTSTATUS status;
KAFFINITY affinity;
BOOLEAN irqshare;
KINTERRUPT_MODE mode;
PDEVICE_EXTENSION pdx;
PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceRaw;
PCM_PARTIAL_RESOURCE_DESCRIPTOR Resource;
pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
if (pdx->GotResource)
{
return STATUS_SUCCESS;
}
GotInterrupt= FALSE;
GotPdcMem = FALSE;
GotBaseMem = FALSE;
ResourceRaw = ResourceListRaw->PartialDescriptors;
Resource = ResourceList->PartialDescriptors;
for(i = 0;i<ResourceListRaw->Count;++i,++Resource,++ResourceRaw)
{
switch(ResourceRaw->Type)
{ //中断资源
case CmResourceTypeInterrupt:
GotInterrupt = TRUE;
IrqL = (KIRQL) Resource->u.Interrupt.Level;
vector = Resource->u.Interrupt.Vector;
affinity = Resource->u.Interrupt.Affinity;
if (ResourceRaw->Flags == CM_RESOURCE_INTERRUPT_LATCHED)
{
mode = Latched;
}
else
{
mode = LevelSensitive;
}
irqshare = Resource->ShareDisposition == CmResourceShareShared;
DbgPrint("ResouceType: Interrupt:Vector:0x%x(Translated=0x%x)",
ResourceRaw->u.Interrupt.Vector, vector);
DbgPrint("IRQL:0x%x(Translated=0x%x)Affinity:0x%x(Translated=0x%x).",
ResourceRaw->u.Interrupt.Level, IrqL,
ResourceRaw->u.Interrupt.Affinity, affinity);
break;
//PCI9052内部的寄存器占用一个IO资源
case CmResourceTypePort:
DbgPrint("ResoureType: I/O Port:Address:0x%x(Translated=0x%x);Size:0x%x.",
ResourceRaw->u.Port.Start.LowPart,
Resource->u.Port.Start.LowPart,
ResourceRaw->u.Port.Length);
break;
//PCI9052内部的寄存器占用一个Mem资源,进行读取时按BAR0-5进行,根据数量判断各个BAR
case CmResourceTypeMemory:
DbgPrint("ResoureType: Memory Space:Address:0x%x(Translated=0x%x);Size: 0x%x.",
ResourceRaw->u.Memory.Start.LowPart,
Resource->u.Memory.Start.LowPart,
ResourceRaw->u.Memory.Length);

if(ResourceRaw->u.Memory.Length == 0x80) //PCI Bar 0
{
pdx->PhysicalMemBase = ResourceRaw->u.Memory.Start;
pdx->MemCount = ResourceRaw->u.Memory.Length;
pdx->MemBase = (ULONG *)MmMapIoSpace(pdx->PhysicalMemBase, //MmMapIoSpace:将物理地址转换成虚拟地址的一个函数。
pdx->MemCount,
MmNonCached);
DbgPrint("The MEM Base 0 is %x; Count is %x.",pdx->MemBase,pdx->MemCount);
if(pdx->MemBase == NULL)
{
DbgPrint("PCI_DEV: ERROR - BAR 0 mapping is required\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
GotBaseMem = TRUE;
}
else //PCI Bar 2
{
pdx->PdcPhysicalMemBase = ResourceRaw->u.Memory.Start;
pdx->PdcMemCount = ResourceRaw->u.Memory.Length;
pdx->PdcMemBase = (ULONG *)MmMapIoSpace(pdx->PdcPhysicalMemBase,
pdx->PdcMemCount,
MmNonCached);
DbgPrint("The MEM Base 2 is %x;Count is %x.",pdx->PdcMemBase,pdx->PdcMemCount);

if (pdx->PdcMemBase == NULL)
{
DbgPrint("ERROR - Unable to map SJA1000.\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
GotPdcMem = TRUE;
}
break;
default:
break;
}
}
if(!GotBaseMem)
{
DbgPrint("PCI_DEV: ERROR - BAR 0 address not configured, unable to load driver.");
return STATUS_INSUFFICIENT_RESOURCES;
}
if(!GotPdcMem)
{
if(pdx->MemBase)
{
MmUnmapIoSpace(pdx->MemBase,pdx->MemCount);
DbgPrint("PCI_DEV: ERROR - CanMemBase.");
}
return STATUS_INSUFFICIENT_RESOURCES;
}
//连接中断
if (GotInterrupt)
{
DisablePciInterrupt(pdx);
//连接中断
status = IoConnectInterrupt(
&pdx->pInterruptObject,
(PKSERVICE_ROUTINE)OnInterrupt,
(PVOID)pdx,
NULL,
vector,
IrqL,
IrqL,
mode,
irqshare,
affinity,
FALSE);

if (!NT_SUCCESS(status))
{ //连接不成功处理
pdx->pInterruptObject = NULL;
return status;
}
else
{ //重新使能PCI中断
if (pdx->pInterruptObject == NULL)
{
DbgPrint("Interrupt object is NULL.");
}
KeSynchronizeExecution(pdx->pInterruptObject,(PKSYNCHRONIZE_ROUTINE)EnablePciInterrupt,pdx);
}
}
else
{
MmUnmapIoSpace(pdx->MemBase,pdx->MemCount);
MmUnmapIoSpace(pdx->PdcMemBase,pdx->PdcMemCount);
pdx->pInterruptObject = NULL;
}
pdx->GotResource=TRUE;
return STATUS_SUCCESS;
}

...全文
829 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈皮歪詩 2011-06-29
  • 打赏
  • 举报
回复
在PC上,PCI 的 base address 分配是由BIOS 或者Windows 完成的。如果你用windriver在PC 上面看,應該能看到所有PCI DEVICE的分配好的base address. 在embedded system 上,這個工作由bootloader 或者embedded OS 完成。你可以看看你買的開發版的manual, 或者看看對應你設備的device driver 說明
程序员小哈 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hahahaha_hax4 的回复:]

在PC上,PCI 的 base address 分配是由BIOS 或者Windows 完成的。如果你用windriver在PC 上面看,應該能看到所有PCI DEVICE的分配好的base address. 在embedded system 上,這個工作由bootloader 或者embedded OS 完成。你可以看看你買的開發版的manual, 或者看看對應你設備的device driver……
[/Quote]

我是PC上的,用Windriver看到的结果就是上面的结果,不是很清楚,呵呵,谢谢你的耐心解答,这个帖子已经一周了,结贴啦哈,交个朋友吧
哈皮歪詩 2011-06-28
  • 打赏
  • 举报
回复
80h 和 100h 是你register space 的大小。這個是隱藏在BAR 當中的。前面說了,系統軟件會先朝BAR裏面寫入0XFFFFFFFF,然後再讀BAR,這個時候就會讀出register space 的大小。然後系統軟件會把分配給該DEVICE/Register Space 的Base Address 再寫入BAR當中。你用windriver看的時候,系統軟件早就把base address分配好了,所以你看到的是系統分配的base address, 比如 0xf7a81000 和 0xf7a60000 。但是很奇怪的是你給的PCI空間裏面,對應的位置是0xffffff00 和 0x00000000,這不象是合法的地址。但是 DbgView看StartDevice 的打印卻顯示不同的值。
程序员小哈 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hahahaha_hax4 的回复:]

80h 和 100h 是你register space 的大小。這個是隱藏在BAR 當中的。前面說了,系統軟件會先朝BAR裏面寫入0XFFFFFFFF,然後再讀BAR,這個時候就會讀出register space 的大小。然後系統軟件會把分配給該DEVICE/Register Space 的Base Address 再寫入BAR當中。你用windriver看的時候,系統軟件早就把base add……
[/Quote]

谢谢你的回复,原来我用windriver看到的是更改过的值呀,我以为是自己赋予的初值呢,呵呵,这回明白多了,不过你说的奇怪,也是我的疑惑,“但是很奇怪的是你給的PCI空間裏面,對應的位置是0xffffff00 和 0x00000000,這不象是合法的地址。但是 DbgView看StartDevice 的打印卻顯示不同的值。”这个还是不懂呀,这个寄存器的值列表是我买开发板中读取的值,我就是想看看他怎么设置的,这个如果不明白那就先这样,明晚我结贴哈,谢谢你啦
程序员小哈 2011-06-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hahahaha_hax4 的回复:]

一個系統中,往往 PCI BUS 上有很多DEVICE, (比如你的PC 機上面就插了好多的PCI 插卡).每個PCI DEVICE 有自己的Configuration Space, 其中就包括了每個DEVICE 自己獨有的registers。這些registers可以是Memory Mapped, 也可以是IO Mappped。有的DEVICE, 系統要為這些registers分配地址空間。有……
[/Quote]

谢谢你的回复,等了四天终于有回复了,我所在的单位是研究所,一人一摊,身边很难找到交流的人,所以有不懂的一是自己悟,另一个方案就是搜索,实在没办法了只好网上求助,很感谢您的回复,你说的很详细,我很受益,我现在不明白的就是:
00: 905210ba 0680000a 905210ba 00000100
10: ffffff00 00000000 00000000 00000000
20: 00000000 00000001 00000000 00000000
30: 00000000 00000000 00000102 00000100
40: 00000000 00000000 00000000 00000081
50: 00000000 00000000 00000000 00000011
60: 00784b46 ffffffff ffffffff ffffffff
70: ffffffff ffffffff ffffffff ffffffff
80: 905210ba 0680000a 905210ba 00000100
90: ffffff00 00000000 00000000 00000000
a0: 00000000 00000001 00000000 00000000
b0: 00000000 00000000 00000102 00000100
c0: 00000000 00000000 00000000 00000081
d0: 00000000 00000000 00000000 00000011
e0: 00784b46 ffffffff ffffffff ffffffff
f0: ffffffff ffffffff ffffffff ffffffff

在我用windriver读出来的pci配置寄存器的值中,我找到对应的基寄存器,为什么没有找到对应的80h,100h的初值呢?

希望能得到您进一步的答复,谢谢
程序员小哈 2011-06-27
  • 打赏
  • 举报
回复
各位朋友帮忙看看呗,困惑我好久了,谢谢啦
哈皮歪詩 2011-06-27
  • 打赏
  • 举报
回复
一個系統中,往往 PCI BUS 上有很多DEVICE, (比如你的PC 機上面就插了好多的PCI 插卡).每個PCI DEVICE 有自己的Configuration Space, 其中就包括了每個DEVICE 自己獨有的registers。這些registers可以是Memory Mapped, 也可以是IO Mappped。有的DEVICE, 系統要為這些registers分配地址空間。有的DEVICE 還可以有一個以上不連續的registers 地址空間,所以才會有不止一個的BAR (BAR0-5).那麽系統軟件怎麽知道每個DEVICE 具體需要多少大的地址空間呢?根據PCI SPEC, 系統軟件會向BAR0-5中寫入全1,然後讀出,從而了解每個DEVICE的每個BAR具體需要多大的地址空間。在了解了系統內所有的DEVCE的所有的BAR的地址空間大小需求後,系統軟件會統籌安排,向每個DEVICE的每個BAR內寫入系統分配的Base Address, 這樣不同DEVICE 直接的地址空間在系統的地址空間裏面就不會重疊,不會有沖突。

你應該看一下你所操作的PCI DEVICE 的Hardware Manual。從你給的資訊來看,系統給你的DEVICE 分配了兩端地址,一段是from 0xf7a81000 to oxf7a81000 + 0x80, 另外一段是 from 0xf7a60000 to 0xf7a60000 + 0x100

它們分別在PCI BAR0 和 PCI BAR2 上 (你的CODE 也是這麽寫的。)
关于8335A的说明 特性 • 模入部分: 输入通道数:单端32路,双端16路 输入电压范围(跳线选择):4V,5V,10V,±3.33V,±5V,±10V 增益范围(程控):1,2,4,8(可定制其他增益范围) 输入精度:16Bit 最大采样频率:250KHz 缓冲区(FIFO):8K 启动转换方式:软件启动/定时/外触发启动 • 模出部分 输出通道数:单端4路 输出电压范围:5V,±5V(可定制其他电压范围) 输出精度:12Bit 输出电压建立时间:10uS到0.012% • 开关量部分: 电平方式:TTL 输入通道数:16路 输出通道数:16路 • 计数器部分: 使用芯片:82C54兼容器件 输入通道数:3路 • 电源功耗: +5V@500mA • 使用环境要求: 工作温度: 0℃~50℃ 相对湿度:40%~80% 存贮温度:-40℃~+120℃ 外形尺寸:长×高=175.6mm X 98.3mm 布局图(阴影部分是跳线出厂设置) 出厂设置 计数器控制(JP1) 三个计数器全部外接 DA输出范围(JP2) 单极性0~5V AD输入方式(JP3) 单端 AD输入范围(JP4,JP5,JP6,JP7) 单极性0~10V J1(模拟量输入和模拟量输出接口)D型头 插座引脚号 信号定义 插座引脚号 信号定义 1 AD0(AD0+) 20 AD16(AD0-) 2 AD1(AD1+) 21 AD17(AD1-) 3 AD2(AD2+) 22 AD18(AD2-) 4 AD3(AD3+) 23 AD19(AD3-) 5 AD4(AD4+) 24 AD20(AD4-) 6 AD5(AD5+) 25 AD21(AD5-) 7 AD6(AD6+) 26 AD22(AD6-) 8 AD7(AD7+) 27 AD23(AD7-) 9 AD8(AD8+) 28 AD24(AD8-) 10 AD9(AD9+) 29 AD25(AD9-) 11 AD10(AD10+) 30 AD26(AD10-) 12 AD11(AD11+) 31 AD27(AD11-) 13 AD12(AD12+) 32 AD28(AD12-) 14 AD13(AD13+) 33 AD29(AD13-) 15 AD14(AD14+) 34 AD30(AD14-) 16 AD15(AD15+) 35 AD31(AD15-) 17 AGND 36 DA1 18 DA2 37 DA3 19 DA4 注:ADx表示模拟量输入的第x通道,括号外的为单端定义,括号内的是双端定义 AGND指模拟地,单端使用时为信号地 为防止引入现场干扰,不应该使AD输入信号引脚悬空,可以将不使用的信号引脚与模拟地短路 DAx表示模拟量输出的第x个通道 J2(开关量输入输出和计数器输入接口40PIN) 插座引脚号 信号定义 插座引脚号 信号定义 40PIN _1 DI0 40PIN _2 DI1 40PIN _3 DI2 40PIN _4 DI3 40PIN _5 DI4 40PIN _6 DI5 40PIN _7 DI6 40PIN _8 DI7 40PIN _9 DI8 40PIN _10 DI9 40PIN _11 DI10 40PIN _12 DI11 40PIN _13 DI12 40PIN _14 DI13 40PIN _15 DI14 40PIN _16 DI15 40PIN _17 DO0 40PIN _18 DO1 40PIN _19 DO2 40PIN _20 DO3 40PIN _21 DO4 40PIN _22 DO5 40PIN _23 DO6 40PIN _24 DO7 40PIN _25 DO8 40PIN _26 DO9 40PIN _27 DO10 40PIN _28 DO11 40PIN _29 DO12 40PIN _30 DO13 40PIN _31 DO14 40PIN _32 DO15 40PIN _33 DGND 40PIN _34 DGND 40PIN _35 CLK0 40PIN _36 CLK1 40PIN _37 CLK2 40PIN _38 OUT0 40PIN _39 OUT1 40PIN _40 OUT2 注:DIx表示开关量输入的第x通道 DOx表示开关量输出的第x通道 CLKx表示计数器输入的第x通道 OUTx表示计数器输出的第x通道 DGND指开关量信号地 为了用户接线方便,我们随卡提供一根转接线,把卡上的J2(40PIN)转换为DB37(37芯D型头),引到计算机机箱外部。DB37的引脚与开关量等信号的对照关系见下表: 插座引脚号 信 号 定 义 插座引脚号 信 号 定 义 DB37_1 DI0 DB37_20 DI1 DB37_2 DI2 DB37_21 DI3 DB37_3 DI4 DB37_22 DI5 DB37_4 DI6 DB37_23 DI7 DB37_5 DI8 DB37_24 DI9 DB37_6 DI10 DB37_25 DI11 DB37_7 DI12 DB37_26 DI13 DB37_8 DI14 DB37_27 DI15 DB37_9 DO0 DB37_28 DO1 DB37_10 DO2 DB37_29 DO3 DB37_11 DO4 DB37_30 DO5 DB37_12 DO6 DB37_31 DO7 DB37_13 DO8 DB37_32 DO9 DB37_14 DO10 DB37_33 DO11 DB37_15 DO12 DB37_34 DO13 DB37_16 DO14 DB37_35 DO15 DB37_17 DGND DB37_36 DGND DB37_18 CLK0 DB37_37 CLK1 DB37_19 CLK2 注:DIx表示开关量输入的第x通道 DOx表示开关量输出的第x通道 CLKx表示计数器输入的第x通道 DGND指开关量信号地 JP4、JP5、JP6、JP7(模拟量输入范围选择跳线) 对应关系如图所示: JP3(模拟量输入单双端选择跳线) 对应关系如图所示: JP2(模拟量输出单双极性跳线) 对应关系如图所示: JP1(计数器配置跳线) 用户可以使用此跳线组合进行如下功能: 发出步进电机控制脉冲,频率测量,外触发信号输入。 此跳线管脚对应关系如下: 功能对照表如下: 管脚号 功能 管脚号 功能 1 与CLK0相连 11 与82C54的计数器2门信号相连 2 与82C54的计数器0输入相连 12 与外触发输入相连 3 内部脉冲(10M) 13 与82C54的计数器0输出相连 4 与CLK1相连 14 与82C54的计数器1输出相连 5 与82C54的计数器1输入相连 15 与82C54的计数器1门信号相连 6 与82C54的计数器0输出相连 16 与82C54的计数器0门信号相连 7 与CLK2相连 17 与82C54的计数器2输出相连 8 与82C54的计数器2输入相连 18 与开关量输入DI0相连 9 与82C54的计数器1输出相连 19 与外触发输入相连 10 与82C54的计数器2输出相连 注意:管脚1、管脚4、管脚7是通过逻辑器件7414连接到CLK0、CLK1、CLK2, 所以测量用户输入脉冲时将使用下降沿计数 82C54的输出也是通过7414连接到最终的输出,所以最终J2上的计数器输出与82C54手册中的输出有一个反相的关系 关于零点、满度调节 AD输入部分:使用程控电位器软件调节 DA输出部分:使用电位器调节 WZx:对应通道的零点调节,x为通道号 WFx:对应通道的满度调节,x为通道号 出厂时已经按照单极性调好,一般不需要调整,如果用户使用双极性信号输入,认为双极性零点、满度无法满足要求,可以调节WZx、WFx以满足使用要求。 寄存器定义 对应地 操作 意义 基地+0 写 保留 基地+0 读 FIFO有效时从FIFO中读取AD数据 基地+4 写 清FIFO,在自动切换通道方式下将当前通道号置0 基地+4 读 软件启动时读取AD转换结果 基地+8 写 设置16位开关量输出状态(Bit0~Bit15) 基地+8 读 读取16位开关量输入状态(Bit0~Bit15) 基地+12 读/写 返回/设置计数器0数值 基地+16 读/写 返回/设置计数器1数值 基地+20 读/写 返回/设置计数器2数值 基地+24 写 设置82C54控制字 基地+28 写 DA设置寄存器(具体DA操作方法参考DAC7615数据手册): BIT0:对应SDI管脚 BIT1:对应CLK管脚 BIT2:对应LOADREG管脚 基地+28 读 启动DA转换 基地+32 读/写 设置板卡寄存器 BIT0:1,自动切换AD通道,0,软件切换AD通道 BIT1~BIT2:0,软件启动AD转换 1,定时启动AD转换 2,外同步时钟方式 3,TTL信号触发启动“定时AD” 转换 BIT3:写:1,使能FIFO半满中断 0,屏蔽FIFO半满中断 读:1,FIFO半满中断产生 0,没有产生半满中断 BIT4:写:1,使能外触发中断 0,屏蔽外触发中断 读:1,外触发中断产生 0,没有产生外触发中断 BIT5:写:1,使能AD转换结束中断 0,屏蔽AD中断 读:1,AD转换结束中断产生 0,没有产生中断 BIT6: 设置外触发信号起作用方式, 0, 表示高电平定时采集,低电平停止采集 1, 表示EI上升沿开始定时采集。 BIT7~BIT11:保留 BIT12:只读,0,FIFO满信号有效 BIT13:只读,0,FIFO半满信号有效 BIT14:只读,0,FIFO空信号有效 BIT15:只读,0,AD正在转换 基地+36 写 设置AD定时启动分频系数(39~255) 基地+40 写 数字电位器设置寄存器(具体操作参考AD8402芯片手册) BIT0:SDI BIT1:CLK BIT2:CS 基地+44 写 EEPROM设置寄存器(具体操作参考24LC64芯片手册) BIT0:SDA BIT1:SCL BIT2:SDA输出始能 基地+48 读写 保留 基地+52 读 软件启动AD转换 基地+52 写 当软件切换通道时,设置AD通道号(0~31) 当自动切换通道时,设置终止AD通道号(0~31) 基地+56 写 设置AD0~AD7增益(每两位对应一个通道,顺次排列) 基地+60 写 设置AD8~AD15增益(每两位对应一个通道,顺次排列) 基地+64 写 设置AD16~AD23增益(每两位对应一个通道,顺次排列) 基地+68 写 设置AD24~AD31增益(每两位对应一个通道,顺次排列) 板卡驱动及编程说明 PCI-8335A板卡驱动及编程说明看《PCI-8335A驱动说明书.doc》,此驱动说明书以电子文档的形式与板卡驱动放在同一个压缩包内,一般可从中泰网站下载。 产品组件 1. PCI8335A采集卡一块 2. 40芯半米长扁平电缆1根 3. 37芯D型插头一套 4. PCI8335A简明手册一份

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧