国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

歷史上的今天

今天是:2025年07月15日(星期二)

2019年07月15日 | STM32開發(fā)筆記55:STM32F4+DP83848以太網(wǎng)通信指南系列(九)

發(fā)布者:cw57324588 來源: eefocus關(guān)鍵字:STM32  STM32F4  DP83848  以太網(wǎng)通信 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

本章為系列指南的第九章,終結(jié)篇,本章主要來分析一下完整的ARP協(xié)議,并在STM32F4中實(shí)現(xiàn)一個精簡的ARP協(xié)議響應(yīng)流程。

ARP協(xié)議的本質(zhì)是使局域網(wǎng)內(nèi)的其他主機(jī)能夠知道我在哪兒,比如在局域網(wǎng)上有人沖著所有人喊了一句「IP為XXXX的家伙,你在哪兒」,我一聽,XXXX不是我的IP嗎,我得回答他啊,于是我沖著所有人(也可以是單獨(dú)的這個人)喊一句「我在這兒呢,我的MAC是YYYY」,這樣局域網(wǎng)內(nèi)所有用戶,包括交換機(jī)就知道IP為XXXX的家伙MAC地址是YYYY,并且交換機(jī)知道了我連在它的第N個端口上,以后有人要通過交換機(jī)向IP為XXXX的我發(fā)信息,交換機(jī)就把數(shù)據(jù)包發(fā)到N port上去了。沒有上面這套流程,局域網(wǎng)上就沒人知道你是誰,你的IP多少,你的MAC多少,你連在交換機(jī)大佬的第幾個端口上,自然你也收不到任何非廣播包數(shù)據(jù)了。

ARP請求

如果我要向一個之前沒有任何聯(lián)系的主機(jī)主動發(fā)一個數(shù)據(jù)包,一般情況下都會觸發(fā)一個ARP詢問,比如我們上一章《STM32F4+DP83848以太網(wǎng)通信指南第八章:收包流程》中,最后的實(shí)驗(yàn),我打開CMD命令行,輸入了一個指令ping 192.168.1.201,這時候PC的底層設(shè)備(一般是網(wǎng)卡)首先判斷一下自己的緩存中有沒有192.168.1.201這個IP的緩存信息,如果沒有通信記錄或者時間過長失效了,就得在網(wǎng)絡(luò)上廣播一下,找找看當(dāng)前有沒有誰在用192.168.1.201這個IP地址,包內(nèi)容如下:


ff ff ff ff ff ff 00 0e c6 d4 1d d4 08 06 00 01

08 00 06 04 00 01 00 0e c6 d4 1d d4 c0 a8 01 c8

00 00 00 00 00 00 c0 a8 01 C9


WireShark分析以上報文的解析如下圖所示:

ARP響應(yīng)

目標(biāo)主機(jī)的MAC地址為FF FF FF FF FF FF時,交換機(jī)會將此包廣播到所有端口,這時候所有節(jié)點(diǎn)的網(wǎng)卡上都能收到這個廣播包,如果某一節(jié)點(diǎn)的IP地址為192.168.1.201則需要對此包進(jìn)行響應(yīng),判斷依據(jù)為上述包的以下特征:

第一行倒數(shù)第4,第3字節(jié):0806,代表的是ARP協(xié)議

第二行第6字節(jié):01,代表的是ARP請求

第三行最后4字節(jié):c0 a8 01 C9,代表的是192.168.1.1,跟自己寄存器中的值匹配

響應(yīng)數(shù)據(jù)包為以下內(nèi)容:

00 0e c6 d4 1d d4 00 11 0e 0b 03 8a 08 06 00 01

08 00 06 04 00 02 00 11 0e 0b 03 8a c0 a8 01 c9

00 0e c6 d4 1d d4 c0 a8 01 c8 00 00 00 00 00 00

00 00 00 00 00 00 00 00 20 20 20 20

上述中,以下數(shù)據(jù)是動態(tài)變化的:

第一行前6個字節(jié):00 0e c6 d4 1d d4,根據(jù)請求包中的第7-12六個字節(jié)決定,表示目標(biāo)MAC地址

第一行第7-12六個字節(jié):00 11 0e 0b 03 8a,自由設(shè)置的自己的MAC地址

第二行第7-12六個字節(jié):00 11 0e 0b 03 8a,自由設(shè)置的自己的MAC地址

第二行倒數(shù)4個字節(jié):c0 a8 01 c9,自己的IP地址,也就是請求包中所呼喚的IP地址,192.168.1.201

第三行前6個字節(jié):00 0e c6 d4 1d d4,根據(jù)請求包中的第7-12六個字節(jié)決定,表示目標(biāo)MAC地址

第三行第7-10四個字節(jié):c0 a8 01 c8,根據(jù)請求包第二行倒數(shù)四個字節(jié)決定,表示目標(biāo)IP地址

這些信息都可以用WireShark分析出來,WireShark對每一個字節(jié)的含義都有明確的解釋。

編碼實(shí)現(xiàn)

有了特征匹配及填充規(guī)則,配合我們之前的STM32發(fā)包和收包DEMO,我們就可以編程實(shí)現(xiàn)ARP數(shù)據(jù)包的響應(yīng)了。

#define LEN_ARP 42

 

/* 以下為業(yè)務(wù)邏輯需要用到的全局變量 */

u8 IPAddr[4];

 

vu8  SystemStatus; /* 系統(tǒng)狀態(tài),bit0:是否需要發(fā)送被動響應(yīng)數(shù)據(jù)包,bit1:是否打開了PNIO開關(guān),bit2:是否需要發(fā)送PNControl request */

vu16 sendLen;      /* 發(fā)送包長度 */

u8 sendBuffer[1024];   /* 發(fā)送包BUFFER */

u8 arp_answer[LEN_ARP]={

    0,0,0,0,0,0, /* ArpAskerMac */ 0,0,0,0,0,0, /* myMac */ 0x08, 0x06, 0x00, 0x01,

    0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 0,0,0,0,0,0, /* myMac */ 0,0,0,0, /* IP address */

    0,0,0,0,0,0, /* ArpAskerMac */ 0,0,0,0/* ArpAskerIP */

};

 

int main() {

    SystemStatus = SS_NOTHING;

    sendLen = 0;    

 

    /* 默認(rèn)調(diào)用SystemInit,系統(tǒng)時鐘168MHz */

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);        //4位搶占,0位響應(yīng)

 

    DelayInit(168);        //初始化168MHz

 

    NVIC_SetPriority (SysTick_IRQn, 0);        //系統(tǒng)滴答定時器優(yōu)先級最高  

 

    DP83848Init(MyMacAddr);        //初始化DP83848

 

    while(1) {

        if (0x01 == (SystemStatus & 0x01)){

            /* 如果需要發(fā)送被動網(wǎng)卡響應(yīng) */

            DP83848Send(sendBuffer, sendLen);            

            sendLen = 0;

            SystemStatus = SystemStatus & 0xFE; /* bit0置為0 */

        }

    }

}

 

void Pkt_Handle(void) {

    FrameTypeDef frame;

    __IO ETH_DMADESCTypeDef *DMARxNextDesc;

 

    /* get received frame */

    frame = ETH_Get_Received_Frame();

    /* Obtain the size of the packet and put it into the "len" variable. */

    receiveLen = frame.length;

    receiveBuffer = (u8 *)frame.buffer;

 

    if (Match(receiveBuffer, ArpProtocol, 12, 2) && Match(receiveBuffer, IPAddr, 38, 4)){

        /* ARP */

        //printf("ARP test receivedn");

        memcpy(sendBuffer, arp_answer, LEN_ARP);

 

        for (int i = 0; i < 6; i++) {

            /* ArpAskerMac */

            sendBuffer[i] = receiveBuffer[6 + i];    

            sendBuffer[32 + i] = receiveBuffer[6 + i];

        }

        for (int i = 0; i < 4; i++) {

            /* ArpAskerIP */

            sendBuffer[38 + i] = receiveBuffer[28 + i];    

        }

 

        sendLen = LEN_ARP;

        SystemStatus = (SystemStatus | 0x01); /* 打開網(wǎng)卡被動數(shù)據(jù)發(fā)送開關(guān) */

    }

 

    /* Check if frame with multiple DMA buffer segments */

    if (DMA_RX_FRAME_infos->Seg_Count > 1) {

        DMARxNextDesc = DMA_RX_FRAME_infos->FS_Rx_Desc;

    } else {

        DMARxNextDesc = frame.descriptor;

    }

 

    /* Set Own bit in Rx descriptors: gives the buffers back to DMA */

    for (i = 0; i < DMA_RX_FRAME_infos->Seg_Count; i++) {

        DMARxNextDesc->Status = ETH_DMARxDesc_OWN;

        DMARxNextDesc = (ETH_DMADESCTypeDef *)(DMARxNextDesc->Buffer2NextDescAddr);

    }

 

    /* Clear Segment_Count */

    DMA_RX_FRAME_infos->Seg_Count = 0;

 

    /* When Rx Buffer unavailable flag is set: clear it and resume reception */

    if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET) {

        /* Clear RBUS ETHERNET DMA flag */

        ETH->DMASR = ETH_DMASR_RBUS;

        /* Resume DMA reception */

        ETH->DMARPDR = 0;

    }

}

編碼的總體思想就是中斷中快進(jìn)快出,用變量來標(biāo)記狀態(tài),主循環(huán)中不斷判斷狀態(tài)并復(fù)位狀態(tài)。

使用這種方式,可以繼續(xù)擴(kuò)展ICMP協(xié)議,實(shí)現(xiàn)PING指令,以及更多按需裁剪的TCP/IP協(xié)議,當(dāng)然擴(kuò)展的協(xié)議越多,這種純粹的if判斷也會越多,以后會細(xì)分各個層,在層次中繼續(xù)if判斷,當(dāng)?shù)搅隧攲討?yīng)用層之后,就只管TCP/UDP協(xié)議了,內(nèi)容一般都是應(yīng)用協(xié)議自己規(guī)劃的比如HTTP,F(xiàn)TP這些協(xié)議,只需要把上層協(xié)議的數(shù)據(jù)結(jié)構(gòu)填充到下層協(xié)議的內(nèi)容區(qū)域就行了。當(dāng)遇到數(shù)據(jù)包比較龐大的時候,還需要分包傳輸,暫時我們沒有用到,LWIP中有相應(yīng)的實(shí)現(xiàn),有需求的話可以去研究。此外,我們實(shí)驗(yàn)中的代碼都是基于數(shù)組進(jìn)行數(shù)據(jù)裝箱拆箱操作的,而網(wǎng)絡(luò)包的協(xié)議是按層次來的,使用數(shù)組不斷的進(jìn)行數(shù)據(jù)的填充是非常消耗性能的,因此在遇到數(shù)據(jù)量比較大,需要實(shí)現(xiàn)的協(xié)議比較多時,仍然建議按照LWIP的思路使用收尾相接的鏈?zhǔn)浇Y(jié)構(gòu)進(jìn)行拆裝箱。

系列總結(jié)

到此我們這個系列就算告一段落了,后面的工業(yè)以太網(wǎng)的協(xié)議的分析和實(shí)現(xiàn)我不方便做公開的教程,也是自己一步一步摸索過來的,目前自己在設(shè)計(jì)PCB板,后期這個工程需要制板貼片并做成最終的工業(yè)產(chǎn)品。

我們來回顧總結(jié)一下這個系列教程,首先我們對STM32F407的時鐘、中斷等相關(guān)知識做了一個梳理,接著我們認(rèn)識了STM32中的MAC,以及跟MAC搭配的PHY,同時還對DMA技術(shù)做了一個粗略的了解。試著初始化相關(guān)的GPIO,使能了MAC,DMA,PHY,這樣一個DP83848Init()函數(shù)就搞定了;再后來我們又完成DP83848Send()函數(shù),能夠發(fā)包了,接著配置了以太網(wǎng)中斷,能夠在Pkt_Handle()函數(shù)中進(jìn)行以太網(wǎng)收包了,以上函數(shù)的編寫,我們都是參考的ethernetif.c文件,它的幾個底層函數(shù)low_level_init、low_level_output、low_level_input給我們提供了重要的線索。最后對TCP/IP協(xié)議棧中的ARP協(xié)議進(jìn)行了分析,并運(yùn)用之前的全部知識,進(jìn)行了ARP響應(yīng)的編碼實(shí)現(xiàn),并對以后其他協(xié)議的擴(kuò)展實(shí)現(xiàn)提出了思路和優(yōu)化建議。


關(guān)鍵字:STM32  STM32F4  DP83848  以太網(wǎng)通信 引用地址:STM32開發(fā)筆記55:STM32F4+DP83848以太網(wǎng)通信指南系列(九)

上一篇:STM32開發(fā)筆記56: STM32F407VGT6的解釋
下一篇:STM32開發(fā)筆記54:STM32F4+DP83848以太網(wǎng)通信指南系列(八)

推薦閱讀

我們要實(shí)現(xiàn)的功能是在程序運(yùn)行的時候通過單片機(jī)的串口向串口調(diào)試助手發(fā)送一個字符串諸如“hello world”,串口通信助手接收到字符串之后顯示并由用戶反饋回去一個長度為4的字符串并顯示到數(shù)碼管上來看一下效果首先是串口通信電路的配置和借助VSPD、串口通信助手對相關(guān)串口的設(shè)置通過VSPD創(chuàng)建兩個可以相互通信的虛擬串口,如COM1和COM2。點(diǎn)擊添加端口按鈕...
(記者 劉楊)7月15日,國家電網(wǎng)有限公司2019年年中工作會議在京召開。公司董事長寇偉出席會議并作題為《擔(dān)當(dāng)作為 狠抓落實(shí) 確保完成全年目標(biāo)任務(wù)》的工作報告。會議回顧公司今年上半年工作,中央重大決策部署完成良好,安全生產(chǎn)總體平穩(wěn),電網(wǎng)發(fā)展取得新進(jìn)展,泛在電力物聯(lián)網(wǎng)建設(shè)加快推進(jìn),企業(yè)經(jīng)營保持穩(wěn)健,各項(xiàng)改革加快落地,科技創(chuàng)新不斷強(qiáng)化。 ...
為了簡化物聯(lián)網(wǎng)節(jié)點(diǎn)開發(fā)者面臨的復(fù)雜軟件的開發(fā)難題,意法半導(dǎo)體推出了B-L4S5I-IOT01A STM32探索套件。新套件包含經(jīng)過相關(guān)標(biāo)準(zhǔn)認(rèn)證的FreeRTOS?操作系統(tǒng)編程接口,該編程接口完全集成在STM32Cube開發(fā)生態(tài)系統(tǒng)內(nèi),可直連亞馬遜云服務(wù)Amazon Web Services (AWS)。 硬件工具包括一塊STM32L4+微控制器開發(fā)板,板載意法半導(dǎo)體的各種MEMS傳感器,以及STSAFE-...
最近在學(xué)習(xí)飛思卡爾MC9S12G系列單片機(jī)底層驅(qū)動,看了很多,目前理解還不深,處于入門菜鳥級別,僅在此記錄下學(xué)習(xí)心得,后續(xù)會在實(shí)操中強(qiáng)化底層驅(qū)動開發(fā)能力,不能老是處于光說不練,搞些假把式。好了,言歸正傳。本文主要記錄筆者基于MC9S12G系列單片機(jī)flash擦寫,還望各路大神路過時,可指點(diǎn)一番。Flash本身是非易失性存儲,可以通過編程的方式擦寫其中的...

史海拾趣

問答坊 | AI 解惑

現(xiàn)在還有帶COM口的筆記本嗎?

本信息來自合作QQ群:AVR單片機(jī)學(xué)習(xí)與交流群(17727270) 群管理員在壇子里的ID:銅河 要有COM口,有并口。有網(wǎng)口…

查看全部問答∨

EP3C120F780 等效門數(shù)多少??

EP3C120F780是CYCLONE III 中比較大的FPGA,其相關(guān)介紹資料如下圖: 780個管腳,F(xiàn)BGA封裝,工業(yè)溫度(-40 到100度),商業(yè)溫度(0~85度) ES: 工程樣品, LEAD-FREE 表示啥意思?   此外上面也沒有介紹,其等效的邏輯門數(shù)量? 這而也 ...…

查看全部問答∨

WINCE USB攝像頭驅(qū)動成功,結(jié)果實(shí)時視頻速度太慢

這是一個大喜又大悲的結(jié)果,前天搞定了6410下USB攝像頭驅(qū)動,可以捕獲320X240 YUV420格式圖像,昨天修改成了實(shí)時視頻流的程序,結(jié)果大失所望,S3C6410的USB HOST是USB1.1協(xié)議的,全速12Mbps,所以我想獲取30FPS的圖像很難呀,實(shí)際測試結(jié)果是160MS一 ...…

查看全部問答∨

獲取-5v電源

用7805獲取+5v電源,當(dāng)然用7905就可以獲取-5v電源 我的想法是,我能不能用運(yùn)放把+5v輸出經(jīng)過運(yùn)放反相輸出做-5電源輸出,我估計(jì)這樣的-5V電源不穩(wěn)定,忘高手說說我的想法行嗎? …

查看全部問答∨

補(bǔ)充一點(diǎn)

關(guān)鍵是ARN9,S3C2410的功耗問題,在有一定的外圍電路時,靜態(tài)功耗和工作功耗?…

查看全部問答∨

(慳錢十月)我的淘寶購物經(jīng)

淘寶購物特點(diǎn)是,一次性的,退不了的,所以\"兵者國之大事,不可不察也\" 一句話,挑最近成交多的,而且貨比三家,再有同賣家談好,別發(fā)生不愉快.   我上淘寶買東西主要有以下幾種方式: 一,急 我對急用的東東,不賣不行非買不可的,我貨比三家后,找 ...…

查看全部問答∨

阻塞賦值和非阻塞賦值,綜合出來硬件上的區(qū)別??

據(jù)我的總結(jié)如下: begin-end語句的各句話是順序執(zhí)行的; fork-join語句各句話是并行執(zhí)行的; 阻塞賦值“=”計(jì)算表達(dá)式和賦值一起進(jìn)行; 非阻塞賦值“<=”先計(jì)算表達(dá)式,再在語句塊中統(tǒng)一賦值; 但是,唉,說實(shí)話還是搞得不明不白的??!比如begin- ...…

查看全部問答∨

STM32F103VC的FSMC同步模式怎么用啊

                                 請教版主主,有沒有相關(guān)的應(yīng)用筆記,我用異步模式可以讀寫,但用同步模式就會跳到硬件錯誤中斷?!?

查看全部問答∨

BeagleBone 學(xué)習(xí)筆記03_2012_10_08

開貼說說sqlite移植 1)下載sqlite的源碼,解壓后進(jìn)入文件夾,新建build文件夾 2)可使用../configure -help查看配置的參數(shù)說明項(xiàng) 3)進(jìn)入build文件夾使用命令生成makefile文件:../configure --host=arm-arago-linux-gnueabi --prefix=/hom ...…

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

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

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

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved