上一篇文章中已经对芯片的针脚进行了初始化配置,编译后在烧写到板子上出现了错误
出现了错误1
cannot find chip error -5 (记得不太清楚了,貌似是这几个单词) 说明是i/o 有问题
这个错误出现在enc28j60_chipset_init 函数中,在继续就是enc28j60_hw_init 这个函数有问题。通过打印的方法找到在该函数中
reg = locked_regb_read(priv, EREVID); reg 的值为 0。值为255 ,原因是由于中断脚接错了,tcc8900 可以接的外部中断的引脚是固定的,具体的参照tcc8900 datasheet 中121 -122 页,我选用的可用作外部中断的引脚是goipf[13] 在前面已将讲过配置了
按道理讲EREVID 是一个只读寄存器,里面的值是固定的,当然复位后可能要视情况而定。这个值是硬件的一个标示,里面的低5位的值是以太网的版本号,那么是什么使其为0呢
刚开始忽略了spi 总线的cs 片选信号了,在初始化配置时只是把它低电平输出,使其一直有效,这样做可能会造成spi 数据传输的同步有问题。所以我呢,加了一个函数
enc28j60_cs (flag)
{
if(flag)
BITCLR(gpio_regs->GPFDAT,Hw17); flag = 0 ,片选信号无效 ,
else
BITSET(gpio_regs->GPFDAT,Hw17); flag= 1 ,片选为低电平有效
}
把上面的函数加在了5个位置分别是 :
spi_read_buf spi_write_buf ,spi_read_op ,spi_write_op ,enc28j60_hw_rx, 五个函数的开头是开启片选enc28j60_cs (1)
,return 之前添加enc28j60_cs (0),关闭片选
这样就没有问题了,reg 返回的值始终是0x 05 如果不是这个值,可能也要出什么问题吧
那么继续编译,烧写后又出现另一个错误,大概是中断错误 问题出现在 probe 函数中ret = request_irq(spi->irq, enc28j60_irq, 0, DRV_NAME, priv);
这个ret 返回的值是个负值 。我打印出spi->irq 的值后才恍然大悟,spi->irq 什么时候为0 了,所以呢,在这个函数调用之前加一句
spi->irq = INT_EI10, 在上一篇文章中已经讲了,我用的是外部中断10,这样改了之后,reg 返回值为0 。ok
下面就是probe 函数跑完了,enc28j60 驱动注册成功。
接下来 烧写到板子上
可以在系统目录/sys/.../下面的我忘记了,可以找到eth0 这个名字,这个就是网卡的硬件名字。
测试你的网卡可不可用
先连接网线
静态ip配置如下
接下来 启动网卡 :ifconfig eth0 up
会打印 enc28j60 eth0 : link up (half 双工)默认是半双工通信
设置ip : ifconfig eth0 192.168.1.116
配置网关 : route add default gw 192.168.1.1
ping 192.168.1.113
可以ping 的通 ,别太高兴,在ping 一下网关试试
ping 192.168.1.1
完蛋出现问题,ping 不通 ,这个别着急,查查路由器那边的ip 是不是设置为静态绑定了
程序中网卡的mac 地址是动态生成的,(说白了,就是一个随机函数),如果路由器那边ip 地址都设置为静态,你的网卡可以ping 的通局域网内其他机器,但是ping 不通网关和外网。如果这样,可以在程序中生成固定的和pc 机相同的mac地址,或者修改路由器那边的设置。
如果一切问题都没了,那就ok 。
ping www.baidu.com 试试,如果不行的话,就设置一下dns
在/etc/rev.conf (单词忘了有没有写对,文件没错的)
前面加上
nameserve 8.8.8.8
nameserve 8.8.4.4
具体怎么添加呢,把你烧写到板子上的ramdisk.rom挂载到新建的一个文件夹下,找到/etc/rev.cof 做如上修改
要确认加进去了。有时候可能会由于权限问题,或是忘了 umount 文件夹 而没有加成功。
ping www.baidu.com
通了
动态配置ip :
还有个自动获取的ip的命令,这个就更简单了。
奖linux.com烧写到板子上后,
先 ifconfig eth0 up
在 udhcpc eth0
ping www.baidu.com
有包获取到了。ok