娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

我自己作的試驗(yàn)有問題沒有解決:


dm9000 發(fā)完之后,不產(chǎn)生中斷,為什么?而且通過判斷nsr,也讀不到到發(fā)送完畢的標(biāo)志。


另一個(gè)問題是:一旦啟動(dòng)發(fā)送,程序就會(huì)不斷地產(chǎn)生recv的中斷。這個(gè)問題經(jīng)過寫入isr寄存器得到解決。但依然不明白。


一、dm9000和ARM的連線。


DM9000可以直接與ISA總線相連,也可以與大多數(shù)CPU相連。在這里,我們當(dāng)然是要讓DM9000與s3c2440相連接了。dm9000與arm之間的連線主要有三部分: 


1. 地址線,主要是AEN和CMD兩根線。


DM9000對(duì)外來說只有兩個(gè)端口——地址口和數(shù)據(jù)口,地址口用于輸入內(nèi)部寄存器的地址,而數(shù)據(jù)口則完成對(duì)某一寄存器的讀寫。DM9000的CMD引腳用來區(qū)分這兩個(gè)端口,當(dāng)CMD引腳為0時(shí),DM9000的數(shù)據(jù)線上傳輸?shù)氖羌拇嫫鞯刂罚?dāng)CMD引腳為1時(shí),傳輸?shù)氖亲x寫數(shù)據(jù)。我們把DM9000的A8和A9接為高電平,把A4~A7接為低電平,并且把DM9000的AEN接到s3c2440的nGCS4引腳上,則DM9000的端口基址為0x2xxxx300,如果再把DM9000的CMD引腳接到s3c2440的ADDR2引腳上,則我們就可以定義DM9000的這兩個(gè)端口地址,它們分別為:


#define DM_ADDR_PORT          (*((volatile unsigned short *) 0x20000300))        //地址口


#define DM_DATA_PORT           (*((volatile unsigned short *) 0x20000304))        //數(shù)據(jù)口


其實(shí)這個(gè)地址中2與3之間的幾個(gè)0 可以換成任意的數(shù)字(經(jīng)過了測(cè)試)。


2.  數(shù)據(jù)線:arm的數(shù)據(jù)線直接和dm9000的數(shù)據(jù)線相連,LDATA0~LDATA15。 這樣就可以很快的傳輸數(shù)據(jù)。 其實(shí)也可以認(rèn)為對(duì)于dm9000,它的數(shù)據(jù)線和地址線是復(fù)用的。因?yàn)椋琧md為0時(shí),數(shù)據(jù)線上傳輸?shù)木褪且x寫的dm9000的寄存器地址;cmd為1時(shí),數(shù)據(jù)線上傳輸?shù)木褪菙?shù)據(jù)。


如果要寫入DM9000中的某個(gè)寄存器,則先把該寄存器的地址賦予DM_ADDR_PORT,然后再把要寫入的數(shù)據(jù)賦予DM_DATA_PORT即可。讀取DM9000中的某個(gè)寄存器也類似。下面的函數(shù)的作用分別是DM9000的讀、寫寄存器操作:


//寫DM9000寄存器


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


{

DM_ADDR_PORT = reg;            //將寄存器地址寫到地址端口


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


}


//讀DM9000寄存器


unsigned char __inline dm_reg_read(unsigned char reg)


{

DM_ADDR_PORT = reg;           


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


}


3. 中斷信號(hào)。 dm9000的INT引腳與ARM的一個(gè)外部中斷相連,我們用到的中斷主要是發(fā)送完畢和接收完畢后產(chǎn)生的中斷。


二、dm9000的初始化


下面是dm9000的初始化過程。


void dm_init(void)


{

       dm_reg_write(DM9000_NCR,1);         //軟件復(fù)位DM9000


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


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


 


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


       delay(30);


       dm_reg_write(DM9000_NCR,0);


      


       dm_reg_write(DM9000_GPCR,1);       //設(shè)置GPIO0為輸出


       dm_reg_write(DM9000_GPR,0);         //激活內(nèi)部PHY


      


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


       dm_reg_write(DM9000_ISR,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_PAR1,0x00);         //設(shè)置MAC地址:00-01-02-03-04-05


       dm_reg_write(DM9000_PAR2,0x01);        


       dm_reg_write(DM9000_PAR3,0x02);


       dm_reg_write(DM9000_PAR4,0x03);


       dm_reg_write(DM9000_PAR5,0x04);


      dm_reg_write(DM9000_PAR6,0x05);


   


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


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


 


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


}

三、發(fā)包和收包的過程


DM9000內(nèi)部有16k大小的SRAM用于接受和發(fā)送數(shù)據(jù)緩存。其中3k用于發(fā)包,13k用于收包。此外,用于發(fā)包的3k中,可以緩存兩個(gè)packet。通常我們用的方法是在程序中維護(hù)一個(gè)包個(gè)數(shù)變量packet_cnt,當(dāng)發(fā)包時(shí),直接寫入sram,然后發(fā)送。產(chǎn)生發(fā)送完畢后,判斷packet_cnt。如果packet_cnt>0,就接著繼續(xù)發(fā)。 


當(dāng)需要連續(xù)發(fā)送或接收數(shù)據(jù)時(shí),我們需要分別把DM9000寄存器MWCMD或MRCMD賦予數(shù)據(jù)端口,這樣就指定了SRAM中的某個(gè)地址,并且在傳輸完一個(gè)數(shù)據(jù)后,指針會(huì)指向SRAM中的下一個(gè)地址,從而完成了連續(xù)訪問數(shù)據(jù)的目的。但當(dāng)我們?cè)诎l(fā)送或接受一個(gè)數(shù)據(jù)后,指向SRAM的數(shù)據(jù)指針不需要變化時(shí),則要把MWCMDX或MRCMDX賦予數(shù)據(jù)端口。下面的程序?yàn)镈M9000發(fā)送數(shù)據(jù)的函數(shù),它的兩個(gè)輸入?yún)?shù)分別為要發(fā)送數(shù)據(jù)數(shù)組首地址和數(shù)據(jù)數(shù)組長(zhǎng)度。在這里我們已經(jīng)知道數(shù)據(jù)的寬為16位,它是由DM9000的硬件引腳設(shè)置實(shí)現(xiàn)的。


1. 發(fā)包。下面是趙老師的程序:


void dm_tran_packet(unsigned char *datas, int length)

{

       int i;

      

       dm_reg_write(DM9000_IMR, 0x80);          //在發(fā)送數(shù)據(jù)過程中禁止網(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);

 

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

dm_reg_write(DM9000_IMR, 0x83);          //打開DM9000接收數(shù)據(jù)中斷和發(fā)送中斷

}


我在試驗(yàn)的過程中, 發(fā)現(xiàn)程序會(huì)在下面這句話死循環(huán):

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

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


后來,我改成了中斷的方式進(jìn)行發(fā)送:

void dm_tran_packet(char *datas, int length)

{

       int i;

      

       dm_reg_write(DM9000_IMR, 0x80);      //在發(fā)送數(shù)據(jù)過程中禁止網(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)上

 

         dm_reg_write(DM9000_IMR, 0x83);  

}

 

void dm_trans_done(void) 

{

   uart_printf("%s  ", __func__);

}

void __irq DM9000ISR(void)

{

       int i, packet_len;

   unsigned char status;

       char buffer[128];

       rSRCPND = rSRCPND | (0x1<<4);

       rINTPND = rINTPND | (0x1<<4);

 

//    uart_printf("dm9000isr  ");

   

       if(rEINTPEND&(1<<7)) {

              rEINTPEND = rEINTPEND | (0x1<<7);

 

  status  = dm_reg_read(DM9000_ISR); //清中斷

  dm_reg_write(DM9000_ISR, status);

  

  if(status & ISR_PRS ){

              packet_len = dm_rec_packet(buffer);                  //接收網(wǎng)卡數(shù)據(jù)

 

if((buffer[12]==0x08)&&(buffer[13]==0x06)){ //是ARP協(xié)議

  for( i = 0; i< packet_len; i++) {

uart_printf("0x%x ", buffer[i]);

  }  

}

} else if(status & ISR_PTS) {

  dm_trans_done();

}

       }

}


改成這樣之后,依然不能產(chǎn)生發(fā)送完畢的中斷。(可以成功的發(fā)包,我通過發(fā)包軟件抓到了發(fā)送的包,但就是不產(chǎn)生中斷)


2. 收包。 接收數(shù)據(jù)就略顯復(fù)雜,因?yàn)樗怯幸欢ǜ袷揭蟮摹T诮邮盏降囊话鼣?shù)據(jù)中的首字節(jié)如果為0x01,則表示這是一個(gè)可以接收的數(shù)據(jù)包;如果為0x0,則表示沒有可接收的數(shù)據(jù)包。因此在讀取其他字節(jié)時(shí),一定要先判斷首字節(jié)是否為0x01。數(shù)據(jù)包的第二個(gè)字節(jié)為數(shù)據(jù)包的一些信息,它的高字節(jié)的格式與DM9000的寄存器RSR完全一致。第三個(gè)和第四個(gè)字節(jié)為數(shù)據(jù)包的長(zhǎng)度。后面的數(shù)據(jù)就是真正要接收的數(shù)據(jù)了。下面就是DM9000接收數(shù)據(jù)的程序,其中輸入?yún)?shù)為存放輸入數(shù)據(jù)數(shù)組的首地址,輸出參數(shù)為接收數(shù)據(jù)的長(zhǎng)度。


int dm_rec_packet(unsigned char *datas)

{

       unsigned char int_status;

       unsigned char rx_ready;

       unsigned short rx_status;

       unsigned short rx_length;

       unsigned short temp;

       int i;

 

       int_status = dm_reg_read(DM9000_ISR);           //讀取ISR

       if(int_status & 0x1)                     //判斷是否有數(shù)據(jù)要接受

       {

              rx_ready = dm_reg_read(DM9000_MRCMDX);         //先讀取一個(gè)無效的數(shù)據(jù)

              rx_ready = (unsigned char)DM_DATA_PORT;            //真正讀取到的數(shù)據(jù)包首字節(jié)

             

              if(rx_ready == 1)                 //判讀首字節(jié)是否為1或0

              {

                     DM_ADDR_PORT = DM9000_MRCMD;           //連續(xù)讀取數(shù)據(jù)包內(nèi)容

 

                     rx_status = DM_DATA_PORT;                           //狀態(tài)字節(jié)

[1] [2]
關(guān)鍵字:mini2440  裸機(jī)編程  網(wǎng)卡 引用地址:mini2440裸機(jī)編程---網(wǎng)卡

上一篇:ARM處理器架構(gòu)----處理器的工作狀態(tài)
下一篇:mini2440裸機(jī)編程--------LCD驅(qū)動(dòng)

推薦閱讀

集微網(wǎng)消息 10月20日,維信諾發(fā)布《關(guān)于與合肥市人民政府簽署項(xiàng)目投資框架協(xié)議的公告》,維信諾合肥第6代柔性AMOLED生產(chǎn)線項(xiàng)目簽約,項(xiàng)目總投資440億元。公告披露,維信諾擬將與合肥市人民政府(以下簡(jiǎn)稱“甲方”)簽訂《合肥第 6 代柔性有源 矩陣有機(jī)發(fā)光顯示器件(AMOLED)生產(chǎn)線項(xiàng)目投資框架協(xié)議》(以下簡(jiǎn)稱“《框 架協(xié)議》”),鑒于公司有意在...
“經(jīng)常尋找‘迷路’的它,掃的不干凈還需人工掃、清理塵盒易揚(yáng)塵影響我們的健康”作為一款能幫我們減輕家庭負(fù)擔(dān)的智能掃地機(jī),似乎并沒有讓我們省心省力。致力打造家居清潔服務(wù)的一站式解決方案的聯(lián)想,推出了全球首款自動(dòng)集塵的掃拖一體機(jī)器人,自動(dòng)集塵、掃拖一體、導(dǎo)航等高能設(shè)計(jì),不僅彌補(bǔ)了用戶體驗(yàn)上的不足,更是完全碾壓石頭、科沃斯等產(chǎn)品。 究...
10月,國(guó)務(wù)院常務(wù)會(huì)議通過的《新能源汽車產(chǎn)業(yè)發(fā)展規(guī)劃(2020-2035)》提到,以市場(chǎng)主導(dǎo)、創(chuàng)新驅(qū)動(dòng)、協(xié)調(diào)推進(jìn)、開放發(fā)展為基本原則,力爭(zhēng)經(jīng)過15年持續(xù)努力,使我國(guó)新能源汽車核心技術(shù)達(dá)到國(guó)際領(lǐng)先水平,質(zhì)量品牌具備較強(qiáng)國(guó)際競(jìng)爭(zhēng)力,我國(guó)進(jìn)入世界汽車強(qiáng)國(guó)行列。《規(guī)劃》的出臺(tái)將加快我國(guó)新能源汽車產(chǎn)業(yè)發(fā)展舉措落地,為未來我國(guó)新能源汽車產(chǎn)業(yè)發(fā)展描繪出新...
汽車行業(yè)的未來前景廣闊,自動(dòng)駕駛和全電動(dòng)汽車等技術(shù)正在推動(dòng)汽車行業(yè)快速發(fā)展。因此而帶來的巨大變化將改善人們的生活、提高駕乘體驗(yàn),然而汽車制造商將需要不斷努力提高消費(fèi)者信心和理解 ,以取得商業(yè)上的成功。這需要對(duì)測(cè)試和測(cè)量設(shè)備進(jìn)行持續(xù)且大量投資,這些設(shè)備可能很快就會(huì)過時(shí)。在當(dāng)今的環(huán)境中,更靈活的測(cè)試方法,仔細(xì)平衡風(fēng)險(xiǎn)和回報(bào)至關(guān)重要。...

史海拾趣

問答坊 | AI 解惑

海信TC2102G、2175G(LA76810)彩電電路圖

海信TC2102G、2175G(LA76810)彩電電路圖…

查看全部問答∨

向大家 咨詢X86系統(tǒng)平臺(tái)

最近想買個(gè)X86平臺(tái)的開發(fā)板不知道大家有沒有好的建議!…

查看全部問答∨

FMD_ReadSector()函數(shù)的疑問?

BOOL FMD_ReadSector(     SECTOR_ADDR startSectorAddr,     LPBYTE pSectorBuff,     PSectorInfo pSectorInfoBuff,     DWORD dwNumSectors     ) {     DWORD  & ...…

查看全部問答∨

急!!!!

我不知道怎么寫8255的初始化程序  請(qǐng)問有人能指點(diǎn)我一下么? 由于我不會(huì)貼圖上來   所以手寫算了。。。 左邊是89S51  右邊是8255 P0的0-7口 ---------------D0-D7 P20---------------------A0 P21------------- ...…

查看全部問答∨

求書籍資料!!!(關(guān)于51系列單片機(jī)與TMS9914接口技術(shù))

小弟看了幾天GPIB通信(488.2),9914模式的E文,自己用89C52和TMS9914芯片(還有譯碼的SN75160,SN75161)做了塊板,通過GPIB卡連到電腦,但是連地址都找不到。。。。。。無奈,現(xiàn)在求助各位大俠,介紹一些關(guān)于單片機(jī)與GPIB接口的書籍,特別是使用T ...…

查看全部問答∨

彩信MMS Notification問題

這是彩信通知的短信PDU: 0891683108200315F0640891015618450004802151902533238C0605040B8423F0A3 06246170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500 B487AF848C8298504A31675A684A4D4C6C4F42008D9083687474703A2F2F323138 ...…

查看全部問答∨

PPC3模擬器上無法顯示地圖(利用mapx mobile控件)

我的機(jī)子上已經(jīng)安裝了:EVC+PPC2003   SDK+MapX   Mobile    按照MapX Mobile的幫助文檔,在模擬器上也安裝了MapX   Mobile(即運(yùn)行了C:\\Program Files\\MapInfo\\MapX Mobile-5.05\\target\\x86\\TargetIn ...…

查看全部問答∨

求助:國(guó)外MP4,英文WINCE O/S,我是菜鳥,請(qǐng)教怎樣才能正確顯示中文?

近日收到國(guó)外寄來MP4,ARM9+TI DM320,觸摸屏,英文WINCE 5.0 O/S,30G硬盤,電影,音樂,圖片,OFFICE,收音機(jī),錄像,錄音,功能也還全。但不能顯示中文。 我看機(jī)器里面三個(gè)文件OSImage.img,ndloader.exe and NK.bin。也看了網(wǎng)上的文章,應(yīng)該是關(guān) ...…

查看全部問答∨

自己手工DIYUSBLED臺(tái)燈步驟含圖

自制一個(gè)USB燈吧!讓微藍(lán)的燈光照在鍵盤上,不影響顯示器的顯示,也不打擾家人休息。其他好玩的USB產(chǎn)品:USB臺(tái)燈、USB充電器、USB風(fēng)扇等。  USB產(chǎn)品原理:利用USB接口的充電功能。只要所負(fù)載的東東不超過500mA的電流,就能實(shí)現(xiàn)。所需設(shè)備:  US ...…

查看全部問答∨

STM32CAN問題

請(qǐng)教版主:我用STM32F103系列的單片機(jī)做CAN通信使用網(wǎng)上的例程,在LLOKBACK模式下,完全正常當(dāng)我把兩個(gè)板子燒錄上程序,一個(gè)是發(fā)送,一個(gè)是接收(中斷接收)兩塊板子分為A板B板,A板是用的默認(rèn)口PA11 PA12   B板用的是PB8 ...…

查看全部問答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 乌兰浩特市| 日喀则市| 攀枝花市| 辉县市| 马尔康县| 花莲市| 通城县| 通山县| 襄汾县| 鄂温| 绍兴县| 伊吾县| 湘潭市| 庆元县| 北碚区| 鹿泉市| 于田县| 辽中县| 黄陵县| 天镇县| 新余市| 开鲁县| 石门县| 晋宁县| 黄骅市| 宁都县| 金坛市| 青神县| 阆中市| 安塞县| 栾川县| 青神县| 景东| 乌鲁木齐市| 通海县| 林州市| 乌鲁木齐县| 通州区| 滨海县| 怀柔区| 南江县|