您的位置 首页 设计

十一 ARM9(2440)的网卡接口扩展

这几天一直在调试DM9000,所以关于ARM9的PWM定时器,以及看门狗定时器的操作的笔记一直也没有整理,等抽出时间来再整理吧,DM9000的调试还

这几天一向在调试DM9000,所以关于ARM9的PWM定时器,以及看门狗定时器的操作的笔记一向也没有收拾,等抽出时刻来再收拾吧,DM9000的调试仍是费了一些精力,不过总算能够正常的收发数据了。

关于这一块的具体操作,我就不细写了,给咱们引荐两篇文章,写的十分的具体,我在这给出链接:

单片机驱动DM9000网卡芯片(具体调试进程):http://hi.baidu.com/mikenoodle/blog/item/dda3a4cc034e871800e9287a.html

s3c2440的网卡接口扩展:

http://blog.csdn.net/zhaocj/article/details/5672588

这两篇文章对我的协助很大,我想对刚刚开端调DM9000的朋友来说会有点协助,下面我就说一下我在这个进程中觉得应该留意的问题。

一 DM9000的的基地址设置,由于扩展网卡接口要将2440的nGCSn衔接到DM9000的片选引脚,所以要想选中DM9000就有必要要拜访nGCSn指定的内存区域以激活nGCSn信号,我的板子衔接的是nGCS4,所以拜访0x20000000开端的区域能够激活nGCS4。由于DM9000由CMD引脚区别输入的是数据仍是地址,一般将CMD引脚衔接在2440的addr2引脚,所以能够经过拜访addr2分别为0和1指定的内存区域操控addr2为0仍是1,这样就能区别输入的是数据仍是指令了,所以能够将DM9000的数据口地址和地址口地址都能够确认了。

假如PC机网络衔接不正常的话应该是咱们的初始化有问题,咱们能够将DM9000初始化后的寄存器的值经过串口打印出来,看看是不是正确。

假如进入不了中止,阐明是MMU的设置问题,由于咱们用到了nGCS4,所以要设置MMU。假如咱们没有考虑MMU而经过仿真运转时必定进入不了中止的,这时咱们能够将程序烧写到flash中,看看程序的运转状况(在这种状况下或许有时分收到的数据是正常的,而有时分收到的数据却不正确)。

能够收到数据,也便是能够激起2440的外部中止进入中止的话,但收到的数据却不正确,这是能够试一下在MMU的设置中:

解决办法是:
在MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for dm9000
把RW_CNB 改为RW_NCNB//cache_off,WR_BUF 以封闭cache
五 关于数据的传输,我信任看了上面的这两篇文章咱们都应该对ARP数据有了必定的了解,当咱们的DM9000初始化成功后,PC机就会开发板发送ARP恳求信号(我的是发送了3次),这个数据是一个播送数据,里边有PC机的MAC和IP地址,所以假如咱们数据接纳正常的话咱们能够获得这些信息,由于我的程序中将收到的数据进行区别,假如是ARP数据的话经过串口进行打印。当咱们向PC机发送ARP恳求的话(发送的数据中有必要是有PC机的IP),PC时机发送一个ARP应对信号,里边包含PC机的MAC和IP,也包含开发板的MAC和IP。

关于数据的读取,由于收到的数据刚开端会有一个无效数据,ARP数据的这个数据一般为0,咱们有必要将其读出,然后接下来的数据会是1,表明有能够接纳的数据,在接下来是ARP数据的状况为,再接下来两个字节是是数据的长度,然后后边才是真实的数据,包含地址信息等。

上面这些便是我在这个进程中遇到的一些问题,下面我给出试验的截图:

这便是我收到的数据的效果图,里边有我电脑的MAC和我设置的IP。

下面是程序代码及剖析:

#include”2440addr.h”
#include”dm9000.h”
#include”def.h”
#define DM_ADDR_PORT(*((volatile unsigned short *) 0x20000300))//地址口3为0也行

#define DM_DATA_PORT(*((volatile unsigned short *) 0x20000304))//数据口3为0也行
extern void Uart_Printf(char *fmt,…);
int tran;
unsigned char arpsendbuf1[42]={//恳求信号

0xff,0xff,0xff,0xff,0xff,0xff,//以太网方针地址,全1表明为播送地址

0x00,0x01,0x02,0x03,0x04,0x05,//以太网源地址

0x08,0x06,//帧类型:ARP帧

0x00,0x01,//硬件类型:以太网

0x08,0x00,//协议类型:IP协议

0x06,//硬件地址长度:6字节

0x04,//协议地址长度:4字节

0x00,0x01,//操作码:ARP恳求

0x00,0x01,0x02,0x03,0x04,0x05,//发送端以太网硬件地址

192, 168, 1, 50,//发送端IP协议地址

0x00,0x00,0x00,0x00,0x00,0x00,//接纳端以太网硬件地址,发送恳求时不必设置,为0即可,可根据IP地址转换为相应的硬件地址,即MAC

192, 168, 1, 120//接纳端IP协议地址

};

int packet_len;
U8*buffer;

extern void ChangeRomCacheStatus(int attr);

//写DM9000寄存器

void __inline dm_reg_write(unsigned char reg, unsigned char data)

{

DM_ADDR_PORT = reg;//将寄存器地址写到地址端口

DM_DATA_PORT = data;//将数据写到数据端口

}

//读DM9000寄存器

unsigned char __inline dm_reg_read(unsigned char reg)

{

DM_ADDR_PORT = reg;

return DM_DATA_PORT;//将数据从数据端口读出

}
void delay(U32 t)
{
U32 i;
for(;t>0;t–)
{
for(i=0;i<100;i++){}
}
}

void dm_init(void)

{
//int i;
dm_reg_write(DM9000_NCR,3);//1//软件复位DM9000

delay(30);//延时至少20μs

dm_reg_write(DM9000_NCR,0);//铲除复位位

dm_reg_write(DM9000_NCR,3);//1//为了保证复位正确,再次复位

delay(30);

dm_reg_write(DM9000_NCR,0);

dm_reg_write(DM9000_GPCR,1);//设置GPIO0为输出
delay(50);
dm_reg_write(DM9000_GPR,0);//激活内部PHY
delay(50);/////////////////////////////////////

dm_reg_write(DM9000_NSR,0x2c);//清TX状况

dm_reg_write(DM9000_ISR,0x3f); //0xf//清中止状况

dm_reg_write(DM9000_RCR,0x39);//设置RX操控

dm_reg_write(DM9000_TCR,0);//设置TX操控

dm_reg_write(DM9000_BPTR,0x3f);

dm_reg_write(DM9000_FCTR,0x3a);

dm_reg_write(DM9000_FCR,0xff);

dm_reg_write(DM9000_SMCR,0x00);

dm_reg_write(DM9000_PAR0,0x00);//设置MAC地址:00-01-02-03-04-05

dm_reg_write(DM9000_PAR1,0x01);

dm_reg_write(DM9000_PAR2,0x02);

dm_reg_write(DM9000_PAR3,0x03);

dm_reg_write(DM9000_PAR4,0x04);

dm_reg_write(DM9000_PAR5,0x05);

dm_reg_write(DM9000_NSR,0x2c);//再次清TX状况

dm_reg_write(DM9000_ISR,0x3f); //0xf//再次清中止状况

dm_reg_write(DM9000_IMR,0x81);//翻开承受数据中止

}

void dm_tran_packet(unsigned char *datas, int length)

{

int i;

dm_reg_write(DM9000_IMR, 0x80);//在发送数据进程中制止网卡中止

dm_reg_write(DM9000_TXPLH, (length>>8) & 0x0ff);//设置发送数据长度

dm_reg_write(DM9000_TXPLL, length & 0x0ff);

DM_ADDR_PORT = DM9000_MWCMD;//发送数据缓存赋予数据端口

//发送数据

for(i=0;i

{

delay(50);

DM_DATA_PORT = datas[i]|(datas[i+1]<<8);//8位数据转换为16位数据输出

}

dm_reg_write(DM9000_TCR, 0x01);//把数据发送到以太网上

while((dm_reg_read(DM9000_NSR) & 0x0c) == 0)

;//等候数据发送完结

delay(50);

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/256936.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部