我学习PCI设计的历程--献给对PCI感兴趣的朋友(转)_vxworks驱动学习 ...
{dy}次对PCI感兴趣大概是一年半之前,也是纯属偶然。当时用51做了一个CAN总线的设
备,另外借了朋友的一个CAN设备相互通讯,调试了两周也没调通,程序检查了N遍也没找到
错误。好在朋友还装了一个新买的研华的PCI CAN通讯卡,把我的CAN设备一接上去,哈哈,
立即OK;从此也想摆弄摆弄PCI卡。
     作为锻炼,我也想做一个PCI CAN通讯卡,在网上狂搜索了一把,发现PCI卡有两种做
法:一是利用现成的PCI控制器,如PCI905X、AMCC5933等,硬件设计很简单;二是用
CPLD/FPGA自己设计PCI控制器,当然难度非常大。当时我对PCI认识还很肤浅,虽然对
CPLD/FPGA熟悉,但是PCI2.2的规范看得却是一头雾水,不得其门而入,所以还是用{dy}种
方式吧,简单快捷。虽然我们每天都能看到很多的PCI设备,但是大多都是专用的,如PCI接
口的网卡、声卡等芯片,功能固定;市面上的通用PCI控制器并不多,以PLX9052、AMCC5933
为主。下了这两个片子的资料,由于对PCI规范不熟悉,看得很是吃力,这样断断续续看了
一个月,大致知道怎么用了。可是新问题又来了,160脚的贴片,按照PCI规范的信号要求,
双面板很难做,况且我只是做一个用SJA1000的CAN通讯卡,根本用不着什么32的本地总线,
也不需要其他乱七八糟的信号,用9052、5933这样的大片子会使设计显得太蠢重。然后我又
到处搜索其他可用的PCI控制器,终于发现oxford有一款OX9162还不错,有PCI转PC打印口的
功能,128脚细密贴片,体积很小,只要把EPP并行口模式简单变换一下就可以和SJA1000接
口(其实OXFORD还有一款ox840?更合适可惜有价无货)。
     决定了怎么做,做起来就快了。画了原理图、PCB,买了OX9162,三下两下搞好了,往
PC上一插,立即发现新硬件,顺利安装了oxford的驱动程序,一切都很简单啊。这个PCI卡
我曾经在坛子里发过图片。
     通过这一次做PCI卡,我觉得用现成的PCI控制器是很简单,但是通用的PCI控制器为了
做到通用,芯片规模过大,软件操作复杂,针对用户的特定应用并不能xx适用,往往需要
附加外部解码逻辑,给硬件和软件设计上带来很多麻烦,并且保密性很差,几乎是只要把硬
件抄出来就能够仿制。因此我萌生了用CPLD/FPGA实现PCI控制器的想法。
     通过大量的资料调查我发现,用CPLD/FPGA设计PCI控制器是属于高难度的设计,而且由
于具有很大的商业价值,设计源码都是保密的。我苦苦搜索了很久,才终于在Lattice公司
网站发现了一个PCI设计源码,verilog语言的,并且没有明确声明该设计是正确无误的,虽
然如此,这大概也是网上能够找到的{wy}一个免费的PCI控制器设计源码了,真的是非常非
常珍贵。要做PCI控制器,首先就得把PCI规范看得很熟。PCI2.2规范我看了几遍,感觉还是
很模糊,这个规范描述性的语言文字太多,逻辑时序画的太少,总之,很难理解规范到底在
说些什么,必须拿许多其他厂商的PCI控制器资料和规范一起核对揣摩才能慢慢琢磨出点味
道来,同时仔细研究Lattice的源代码,{zh1}大概理解了PCI控制器的设计方法。这时我想动
手用CPLD去做了,就用EPM7128SLC84吧,假想的PCI设备功能就是把PCI转8051接口。
Lattice的源码太大,必须用很大的CPLD才能实现该设计,因此我根据PCI->8051的时序特
点,在Lattice源码的基础上做了很大改动,一旦对PCI规范有了较深的理解,设计PCI控制
器似乎并不是很困难的事情。我很快就改好了,手上有一块废弃的PCI接口卡,上面正好就
是EPM7128的插座,我兴奋的把设计下载到EPM7128,然后关机、插卡、开机。。。。Oh,
my GOD!计算机竟然开机没反应。我一下泄了气,拔卡重启,仔细检查设计,修改,再重新
烧片插卡,天,还是不行。这样反反复复修改了两三天,还是不行,这时手上还有其他的事
情要做,只好把PCI设计先放弃了。
     大概半年以后,有了几天空闲,忽然又想起了以前的PCI设计,又来了兴致。把那个设
计找出来,看了两天,才又记起来了PCI规范相关内容。然后就又改。不知道大家有没有同
感,当一个设计碰到困难做不下去的时候,把它放在一边冷落一阵,然后再捡起来,这是往
往会有意外的收获。我的PCI设计就是这样,当我修改的时候,有时很惊讶当时为什么有这
个错误那个错误。改完了,怀着难以名状的心情重新烧片插卡,咦,PC自检的时候发现我的
PCI卡的VID、PID和CLASS CODE了,咳,然后就死机了。不过心里还是高兴的,这说明对PCI
基本时序的理解时正确的了。然后又经过几次修改,终于可以进入Win2000的启动画面了,
可惜到一半的时候就又死机了。然后再去改,这下作难了,所有的时序都已经按照自己的理
解正确实现了,到底那个地方出了问题了呢?看了两天真的看不出哪里错了,咬咬牙重新做
仿真,并故意设置了许多特殊情况,终于发现再某个条件下时序出错了,马上改正,立即烧
片插卡,开机。。。紧张的期盼中。。。。自检、按Pause,发现了设备,F8继续,启动画
面出现,焦急等待中启动画面顺利通过,登录,出现桌面----哈哈,发现新硬件,系统
提示安装驱动程序!!!取消驱动安装,查看系统硬件配置,哈哈,那个大黄感叹号设备就
是我的呀(嘿嘿,没装驱动当然是一个大感叹号了),再用PCIVIEW工具查看,一切正常,
再用Windriver读写我的PCI卡,没出现异常情况。
     哈哈,我终于成功了!!

这就是我学习PCI设计的历程,看来没有学习USB那么痛苦。一点感想就是:
1。PCI规范很难看懂,必须和其他PCI控制器厂商的芯片资料对照着看,一点点的提高自己
的理解,{zh0}是有一个PCI设计的源码例子仔细揣摩,当然如果你只是想用现成的PCI控制器
就不需要看这么多了。
2。PCI硬件设备调试非常困难,这是因为如果系统无法正常启动,软件工具是派不上用场
的,而且也没有合适的调试仪器去帮助我们查看信号到底出了什么问题(即使有了逻辑分析
仪,PCI总线端有四十多个信号,测量起来也麻烦的要死),一切只能建立在自己对PCI时序
正确可靠的理解上。
3。解决了1、2,PCI设计其实很简单。

(文章推荐人:午夜听风)


郑重声明:资讯 【我学习PCI设计的历程--献给对PCI感兴趣的朋友(转)_vxworks驱动学习 ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——