新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 十一 ARM9(2440)的網卡接口擴展

        十一 ARM9(2440)的網卡接口擴展

        作者: 時間:2016-11-27 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/201611/322174.htm

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

        dm_reg_write(DM9000_IMR, 0x81);//打開DM9000接收數據中斷

        }

        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)//判斷是否有數據要接受

        {
        dm_reg_write(DM9000_ISR,0x01);//清除中斷*******************F
        rx_ready = dm_reg_read(DM9000_MRCMDX);//先讀取一個無效的數據
        Uart_Printf("ready1=%dn",rx_ready);

        rx_ready = (unsigned char)DM_DATA_PORT;//真正讀取到的數據包首字節
        Uart_Printf("ready2=%dn",rx_ready);

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

        {

        DM_ADDR_PORT = DM9000_MRCMD;//連續讀取數據包內容

        rx_status = DM_DATA_PORT;//狀態字節

        rx_length = DM_DATA_PORT;//數據長度

        Uart_Printf("nlength=%dn",rx_length);

        for(i=0; i//16位數據轉換為8位數據存儲

        {

        delay(20);

        temp = DM_DATA_PORT;

        datas[i] = temp & 0x0ff;

        datas[i + 1] = (temp >> 8) & 0x0ff;

        }
        if((datas[12]==8)&&(datas[13]==6))
        {
        if((datas[20]==0)&&(datas[21]==1))
        Uart_Printf("ARP請求n");
        if((datas[20]==0)&&(datas[21]==2))
        Uart_Printf("ARP應答n");
        for(i=1; i<=rx_length; i++)
        {
        Uart_Printf("%d",datas[i-1]);
        if(i%6==0)
        Uart_Printf("n");
        }
        }

        }

        }

        else if(rx_ready !=0)//停止設備

        {

        //dm_reg_write(DM9000_IMR,0x80);//停止中斷

        //dm_reg_write(DM9000_ISR,0x0F);//清中斷狀態

        //dm_reg_write(DM9000_RCR,0x0);//停止接收

        //還需要復位系統,這里暫時沒有處理

        }

        dm_reg_write(DM9000_ISR, 0x1);//清中斷

        return rx_length;

        }

        void __irq uartISR(void)

        {

        char ch;

        rSUBSRCPND |= 0x1;

        rSRCPND |= 0x1<<28;

        rINTPND |= 0x1<<28;

        ch=rURXH0;

        if(ch == s)

        tran=1;//表示發送一個ARP數據請求包


        while(!(rUTRSTAT0 & 0x2));
        rUTXH0=ch;
        //for(i=0;i<100;i++);

        }
        void __irq DM9000ISR(void)

        {


        DisableIrq(BIT_EINT4_7);
        Uart_Printf("nEINT7 Occuredn");

        if(rEINTPEND&(1<<7))

        {

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

        packet_len = dm_rec_packet(buffer);//接收網卡數據




        }

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

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


        EnableIrq(BIT_EINT4_7);

        }


        void init()
        {
        //uart0 port

        rGPHCON = 0x00faaa;

        rGPHUP= 0x7ff;

        rULCON0 = 0x3;

        rUCON0 = 0x5;

        rUFCON0 = 0;

        rUMCON0 = 0;

        rUBRDIV0 = 26;

        rSRCPND = (0x1<<27)|(0x1<<28);

        rSUBSRCPND = 0x1;

        rINTPND = (0x1<<27)|(0x1<<28);

        rINTSUBMSK = ~(0x1);

        rINTMSK = ~((0x1<<27)|(0x1<<28));

        pISR_UART0 = (U32)uartISR;

        //EINT7

        rGPFCON = 2<<14;

        rEXTINT0 = (rEXTINT0 & (~(0x07<<28))) | (0x01<<28);

        rEINTMASK &= ~(1<<7);

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

        rINTPND = rINTPND | (0x1<<4);
        rGPFCON = (rGPFCON & (~(0x03<<14))) | (0x02<<14);//GPF7設置為EINT7
        rEXTINT0 = (rEXTINT0 & (~(0x07<<28))) | (0x01<<28);
        rEINTMASK = rEINTMASK & (~(0x01<<7));
        ClearPending(BIT_EINT4_7);

        pISR_EINT4_7 = (U32)DM9000ISR;
        rINTMSK &= ~(1<<4);


        }

        void Main(void)

        {
        tran=0;
        MMU_Init();
        init();
        dm_init();

        while(1)
        {
        if(tran==1)
        {
        dm_tran_packet(arpsendbuf1, 42 );//因為PC機不斷向外發送數據,其中剛開始就有ARP數據包,
        tran=0;//所以為了方便查看,PC機通過串口發送s時,DM9000
        }
        //向PC機發送一個ARP數據請求,再收到的ARP數據就是PC機的應答信號

        }

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 吴江市| 景泰县| 房产| 十堰市| 江陵县| 资兴市| 镇江市| 南充市| 武冈市| 大埔区| 宁晋县| 临澧县| 虞城县| 北流市| 北川| 和林格尔县| 淮南市| 教育| 淳化县| 黄龙县| 镇安县| 佛坪县| 聊城市| 古蔺县| 周口市| 通州区| 工布江达县| 新野县| 枣强县| 黄梅县| 昌江| 永修县| 高雄县| 长寿区| 奎屯市| 恩平市| 五指山市| 木兰县| 滕州市| 资溪县| 大埔县|