|
连通8019过程详述
希望本文对正在调试或曾经遇到过问题的兄弟有所帮助.可能不少高手已经调通了。
五月中我买了块44B0的开发板,熟悉了软硬件及跑跑UCOS后我开始想操作板上的8019AS了,因为以前看老古的网页对此比较感兴趣,在电脑上对8029也搞通过,觉得应该不会有太多问题.可在应用时出现很多意料不到的问题,在此列出并说说我的解决办法.
首先确定好你的8019连接方式,看原理图找到片选,这样在软件里好设置BANK的参数.我的是GCS3,访问地址是0X6000000.刚开始我对这些地址访问总是失败,好郁闷,后来仔细看了电路图,找到一个错误:
8019的IOS线与ADDR配置线不一致.我的板上IOS2接高其余接低,对应地址译码是200H,可SA4-7,10-19都是接低,SA8,SA9接高,实际地址是300H,方便修改我把IOS2也接低了. 之后可以从0X6000000访问访问8019了.注意对这类外部IO访问不要用CACHE,而且访问它们时加上volatile,如我读ISR的内容是 inportb(ISR), inportb的宏定义为
#define inportb(port) *((volatile U8 *)(port))
这之后我用16位操作摸式读写控制寄存器的内容,发现读到高半字节总为FF,估计是8019访问控制寄存器只能8位的操作,可是在ARM里配置BANK3为16位了,若以8位方式读写奇数地址数据会引起异常,我的解决办法是把网卡的IOCS16B也接地了,按8位操作,并且配置BANK3的数据位宽为8位.另外一个办法是把44B0的A1-A5接8019的SA0-SA4,还是可以按16位操作.我的板也不能这样改了.
再之后我可以都访问期间到控制寄存器了,可是我试着读写网卡RAM又不对了,反复调试N久,REMOTE DMA读出来的内容和写的内容根本不一样,反复写啊读啊打印出来啊就是不对,这里还要告诉大家做这种调试时不要开MEMEORY窗口观察那些寄存器的内容,原因想想吧!后来我发现8019上电后是处于POWER DOWN状态的,因为我的8019旁边有个93C46,8019会从它里面读数据来初始化,因为93C46是空的即0XFF,这样就使8019POWER DOWN了.这个原因是我想设置LED时看8019资料才发现的.(我想那个93C46是不是多余的呢?).之后我把PWOER DOWN 及SLEEP位全清除了,呵呵,一个灯终于亮起来了!清位时有讲究的,要看看资料.
然后我再读写8019的RAM时总算是对了,这时我开始进一步控制,把我们宿舍的网线接到板上的网口中,把网卡初试化好后不停检查BNRY和CURR的值来看收到数据没有,具体操作可以看看老古的网页.我终于收到数据了,打印出来就是一些最基本网络协议啦.本来在这个时候已经出现过问题了,当什么包都没进来时,我的检测程序还是会不停的打出数据表示收到包,当时觉得奇怪,不过没进一步处理,觉得这个东西真的很麻烦啊.后来想干脆用USB算了,我板上有个D12的位置空在那里,我又对它比较熟,所以准备转搞USB,不幸的是我粗手大脚把买的芯片连板上的焊盘都焊坏了,要不然我就在这跟大家讨论USB了.
中间又停顿了一段时间,因为我又买了代博的4510板,搞了一阵4510觉得他的网络挺好用,我也专门改编了个BIOS在上面用网卡下载数据用以引导和烧FLASH,感觉真爽!后来想把那个BIOS移植到44B0来,其实还是比较方便的,改改启动和网络接口就行.
又开始控制8019了,此时又暴露许多问题.按以前的办法老是没数据时读出数据来,真是奇怪,我后来改用读ISR的接收成功标志来判断是否有新数据来了,结果发现初始化后只有第一个包可以报告介绍到,(我的BIOS是命令驱动的,每进去一次都初始化一次)比如我在主机上PING开发板的时候,只接到ARP REQUEST包,建议大家调试时装个SNIFFER,我装的SPY SNIFFER,不过用了十天就过期了,这样在主机端可以看到网卡收发的数据.然后又反复调试并在论坛发了求助贴,再后来发现下一次进网卡接收数据程序读CR后会读到0X23,因为我切换页的操作是先读CR,只改变页位再写进CR,如果是0X23的话就把网卡停止工作了!!!为什么会变成0X23的?我还是不明白,后来想的解决办法是设一个静态变量,初始化前为0,完成后为1,换页操作时,为1的话就直接把CR的0位清掉而不是只改页位.还好这样也搞掂了!
然后我再作读操作时,每个包都能正确显示接收到了,此时出现的问题是我接收完数据包再处理时,即根据不同的协议做出反应时,发现发出去的包除长度不同外,前面都是一样的.如我PING开发板的时候,第一个是ARP REQUEST,网卡返回ARP REPLY,这一步正确,主机第二个包是ICMP ECHO REQUEST,而我本应返回ICMP ECHO REPLY, 可到了主机后还是第一个ARP REPLY,只是长度与我要发的ICMP ECHO REPLY一样!我把发包前数据打印出来,是和我要发的一样啊,我发的过程是先写到网卡RAM,设置发送长度和发送起始页后再向CR写发送命令,过程都对,于是又反复调试,终于发现要在写网卡RAM前先向CR写个停止REMOTE DMA的命令0X22,这样才发送出我要的数据了.于是,PING通开发板的过程结束了!按理说在写网卡RAM前REMOTE DMA应该是结束的了,可还是要这一步,真不明白.
PING成功后,信心倍增,只差一步了,我的TFTP接收程序是现成的,改都不用改了,直接往上一用,即在主机端执行情况TFTP -I XXX.XXX.XXX.XXX PUT FILENAME,让开发板接收就行,出现的结果又不对, 顺利发了几个包后,就停顿了,后来出现超时而结束.只好又打印数据检查结果,
发现读网卡RAM也有问题,每次读出BNRY的值不一定就是我上次读完最后写入的值,这样与CURR比较和定位开始读的页自然会出错!我要疯了,居然还有这种怪问题来骚扰我!开时PING的时候都不会有这种现象,这里居然出现!过阵又想了个办法,设置一个静态变量而不用BNRY判断最后读完包所在的页面,但是每次读完最后还是要写BNRY.这回又被我蒙好了!再试TFTP传送,又有问题,虽然可以传完,可每次都不顺利,发几个包又停了等半天又可以继续,比串口还慢,真气人,后来看看SNIFFER里的状态,每次停顿后又将上次的包发一次,估计是主机没收到应答包,那就是板端没接收到或没正确处理了,又打印调试,果然是有的包没应答,不知为何,搞了好一会又用和处理发送一样的方法,在读网卡RAM前写个停止DMA的命令到CR,呵呵,这会很快就顺利接收完了!
我再用接收到的数据写FLASH,再启动写入的程序,结果运行不了,于是又用JTAG读出FLASH与写入文件比较,发现有些地方不对啊,协议通讯都正常,数据却会有出入,难道接受超过一个PAGE的包会出错?再次改写读包程序,以前我是先读完一页,再有就读剩下的,改成了先读四个字节,判断接收长度,再一次读完剩下所有的.改完再调试,OK!OK!下载程序到RAM再运行,或烧入FLASH都好了,兴奋啊!
至此对8019的操作我觉得算是正常了,虽然有很多问题我还不明白,但也能运行良好了.把我的调试经历详细写给大家看,希望不要嫌我啰嗦.其中有什么不当之处请指正! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|