新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 十一 ARM9(2440)的網(wǎng)卡接口擴(kuò)展

十一 ARM9(2440)的網(wǎng)卡接口擴(kuò)展

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò) 收藏
這幾天一直在調(diào)試DM9000,所以關(guān)于ARM9的PWM定時(shí)器,以及看門(mén)狗定時(shí)器的操作的筆記一直也沒(méi)有整理,等抽出時(shí)間來(lái)再整理吧,DM9000的調(diào)試還是費(fèi)了一些精力,不過(guò)總算能夠正常的收發(fā)數(shù)據(jù)了。

對(duì)于這一塊的具體操作,我就不細(xì)寫(xiě)了,給大家推薦兩篇文章,寫(xiě)的非常的詳細(xì),我在這給出鏈接:

本文引用地址:http://2s4d.com/article/201611/322174.htm

單片機(jī)驅(qū)動(dòng)DM9000網(wǎng)卡芯片(詳細(xì)調(diào)試過(guò)程):http://hi.baidu.com/mikenoodle/blog/item/dda3a4cc034e871800e9287a.html

s3c2440的網(wǎng)卡接口擴(kuò)展:

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

這兩篇文章對(duì)我的幫助很大,我想對(duì)剛剛開(kāi)始調(diào)DM9000的朋友來(lái)說(shuō)會(huì)有點(diǎn)幫助,下面我就說(shuō)一下我在這個(gè)過(guò)程中覺(jué)得應(yīng)該注意的問(wèn)題。

一 DM9000的的基地址設(shè)置,因?yàn)閿U(kuò)展網(wǎng)卡接口要將2440的nGCSn連接到DM9000的片選引腳,所以要想選中DM9000就必須要訪問(wèn)nGCSn指定的內(nèi)存區(qū)域以激活nGCSn信號(hào),我的板子連接的是nGCS4,所以訪問(wèn)0x20000000開(kāi)始的區(qū)域可以激活nGCS4。因?yàn)镈M9000由CMD引腳區(qū)分輸入的是數(shù)據(jù)還是地址,一般將CMD引腳連接在2440的addr2引腳,所以可以通過(guò)訪問(wèn)addr2分別為0和1指定的內(nèi)存區(qū)域控制addr2為0還是1,這樣就能區(qū)分輸入的是數(shù)據(jù)還是命令了,所以可以將DM9000的數(shù)據(jù)口地址和地址口地址都可以確定了。

如果PC機(jī)網(wǎng)絡(luò)連接不正常的話應(yīng)該是我們的初始化有問(wèn)題,我們可以將DM9000初始化后的寄存器的值通過(guò)串口打印出來(lái),看看是不是正確。

如果進(jìn)入不了中斷,說(shuō)明是MMU的設(shè)置問(wèn)題,因?yàn)槲覀冇玫搅薾GCS4,所以要設(shè)置MMU。如果我們沒(méi)有考慮MMU而通過(guò)仿真運(yùn)行時(shí)肯定進(jìn)入不了中斷的,這時(shí)我們可以將程序燒寫(xiě)到flash中,看看程序的運(yùn)行情況(在這種情況下可能有時(shí)候收到的數(shù)據(jù)是正常的,而有時(shí)候收到的數(shù)據(jù)卻不正確)。

能夠收到數(shù)據(jù),也就是能夠激發(fā)2440的外部中斷進(jìn)入中斷的話,但收到的數(shù)據(jù)卻不正確,這是可以試一下在MMU的設(shè)置中:

解決辦法是:
在MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for dm9000
把RW_CNB 改為RW_NCNB//cache_off,WR_BUF 以關(guān)閉cache
五 關(guān)于數(shù)據(jù)的傳輸,我相信看了上面的這兩篇文章大家都應(yīng)該對(duì)ARP數(shù)據(jù)有了一定的了解,當(dāng)我們的DM9000初始化成功后,PC機(jī)就會(huì)開(kāi)發(fā)板發(fā)送ARP請(qǐng)求信號(hào)(我的是發(fā)送了3次),這個(gè)數(shù)據(jù)是一個(gè)廣播數(shù)據(jù),里面有PC機(jī)的MAC和IP地址,所以如果我們數(shù)據(jù)接收正常的話我們可以獲得這些信息,因?yàn)槲业某绦蛑袑⑹盏降臄?shù)據(jù)進(jìn)行區(qū)分,如果是ARP數(shù)據(jù)的話通過(guò)串口進(jìn)行打印。當(dāng)我們向PC機(jī)發(fā)送ARP請(qǐng)求的話(發(fā)送的數(shù)據(jù)中必須是有PC機(jī)的IP),PC機(jī)會(huì)發(fā)送一個(gè)ARP應(yīng)答信號(hào),里面包括PC機(jī)的MAC和IP,也包括開(kāi)發(fā)板的MAC和IP。

關(guān)于數(shù)據(jù)的讀取,因?yàn)槭盏降臄?shù)據(jù)剛開(kāi)始會(huì)有一個(gè)無(wú)效數(shù)據(jù),ARP數(shù)據(jù)的這個(gè)數(shù)據(jù)一般為0,我們必須將其讀出,然后接下來(lái)的數(shù)據(jù)會(huì)是1,表示有可以接收的數(shù)據(jù),在接下來(lái)是ARP數(shù)據(jù)的狀態(tài)為,再接下來(lái)兩個(gè)字節(jié)是是數(shù)據(jù)的長(zhǎng)度,然后后面才是真正的數(shù)據(jù),包括地址信息等。

上面這些就是我在這個(gè)過(guò)程中遇到的一些問(wèn)題,下面我給出實(shí)驗(yàn)的截圖:





這就是我收到的數(shù)據(jù)的效果圖,里面有我電腦的MAC和我設(shè)置的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))//數(shù)據(jù)口3為0也行
extern void Uart_Printf(char *fmt,...);
int tran;
unsigned char arpsendbuf1[42]={//請(qǐng)求信號(hào)

0xff,0xff,0xff,0xff,0xff,0xff,//以太網(wǎng)目標(biāo)地址,全1表示為廣播地址

0x00,0x01,0x02,0x03,0x04,0x05,//以太網(wǎng)源地址

0x08,0x06,//幀類(lèi)型:ARP幀

0x00,0x01,//硬件類(lèi)型:以太網(wǎng)

0x08,0x00,//協(xié)議類(lèi)型:IP協(xié)議

0x06,//硬件地址長(zhǎng)度:6字節(jié)

0x04,//協(xié)議地址長(zhǎng)度:4字節(jié)

0x00,0x01,//操作碼:ARP請(qǐng)求

0x00,0x01,0x02,0x03,0x04,0x05,//發(fā)送端以太網(wǎng)硬件地址

192, 168, 1, 50,//發(fā)送端IP協(xié)議地址

0x00,0x00,0x00,0x00,0x00,0x00,//接收端以太網(wǎng)硬件地址,發(fā)送請(qǐng)求時(shí)不用設(shè)置,為0即可,可根據(jù)IP地址轉(zhuǎn)換為相應(yīng)的硬件地址,即MAC

192, 168, 1, 120//接收端IP協(xié)議地址

};


int packet_len;
U8*buffer;

extern void ChangeRomCacheStatus(int attr);

//寫(xiě)DM9000寄存器

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

{

DM_ADDR_PORT = reg;//將寄存器地址寫(xiě)到地址端口

DM_DATA_PORT = data;//將數(shù)據(jù)寫(xiě)到數(shù)據(jù)端口

}

//讀DM9000寄存器

unsigned char __inline dm_reg_read(unsigned char reg)

{

DM_ADDR_PORT = reg;

return DM_DATA_PORT;//將數(shù)據(jù)從數(shù)據(jù)端口讀出

}
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//軟件復(fù)位DM9000

delay(30);//延時(shí)至少20μs

dm_reg_write(DM9000_NCR,0);//清除復(fù)位位

dm_reg_write(DM9000_NCR,3);//1//為了確保復(fù)位正確,再次復(fù)位

delay(30);

dm_reg_write(DM9000_NCR,0);

dm_reg_write(DM9000_GPCR,1);//設(shè)置GPIO0為輸出
delay(50);
dm_reg_write(DM9000_GPR,0);//激活內(nèi)部PHY
delay(50);/////////////////////////////////////

dm_reg_write(DM9000_NSR,0x2c);//清TX狀態(tài)

dm_reg_write(DM9000_ISR,0x3f); //0xf//清中斷狀態(tài)

dm_reg_write(DM9000_RCR,0x39);//設(shè)置RX控制

dm_reg_write(DM9000_TCR,0);//設(shè)置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);//設(shè)置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狀態(tài)

dm_reg_write(DM9000_ISR,0x3f); //0xf//再次清中斷狀態(tài)

dm_reg_write(DM9000_IMR,0x81);//打開(kāi)接受數(shù)據(jù)中斷

}

void dm_tran_packet(unsigned char *datas, int length)

{

int i;

dm_reg_write(DM9000_IMR, 0x80);//在發(fā)送數(shù)據(jù)過(guò)程中禁止網(wǎng)卡中斷

dm_reg_write(DM9000_TXPLH, (length>>8) & 0x0ff);//設(shè)置發(fā)送數(shù)據(jù)長(zhǎng)度

dm_reg_write(DM9000_TXPLL, length & 0x0ff);

DM_ADDR_PORT = DM9000_MWCMD;//發(fā)送數(shù)據(jù)緩存賦予數(shù)據(jù)端口

//發(fā)送數(shù)據(jù)

for(i=0;i

{

delay(50);

DM_DATA_PORT = datas[i]|(datas[i+1]<<8);//8位數(shù)據(jù)轉(zhuǎn)換為16位數(shù)據(jù)輸出

}

dm_reg_write(DM9000_TCR, 0x01);//把數(shù)據(jù)發(fā)送到以太網(wǎng)上

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

;//等待數(shù)據(jù)發(fā)送完成

delay(50);


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


推薦視頻

更多>>

技術(shù)專(zhuān)區(qū)

關(guān)閉