嵌入式以太网第三部分——以太网协议实现
目錄:
1:概述
2:MAC地址設(shè)置
3:以太網(wǎng)協(xié)議
4:PING指令測試
1、概述
1.1:以太網(wǎng)是實現(xiàn)LAN的一種技術(shù),它允許嵌入式系統(tǒng)連接到一個LAN中,并可通過使用網(wǎng)關(guān)經(jīng)Internet連接到外部世界,以太網(wǎng)的主要目的是向LAN發(fā)送和從LAN接收以太網(wǎng)幀,在TCP/IP協(xié)議族中,不包括以太網(wǎng)協(xié)議,可以理解它為TCP/IP中的網(wǎng)絡(luò)接口層(物理層和數(shù)據(jù)鏈路層),為TCP/IP中的上層協(xié)議(比如:IP協(xié)議和ARP協(xié)議)提供服務(wù);
1.2:ENC28J60是帶SPI接口的以太網(wǎng)控制器,支持IEEE802.3協(xié)議,當(dāng)然,也兼容Ethernet第二版的協(xié)議,此協(xié)議幀結(jié)構(gòu)簡單,被大量使用;
1.3:以太網(wǎng)幀結(jié)構(gòu):目的mac地址+源mac地址+協(xié)議類型+數(shù)據(jù);
1.4:本篇編寫ENC28J60驅(qū)動,實現(xiàn)以太網(wǎng)控制,將我們的嵌入式設(shè)備連接到LAN中,并使用ping命令進(jìn)行測試;
1.7:開發(fā)板:STM32F103ZERT 奮斗開發(fā)板V5 軟件環(huán)境:KEIL MDK5
2、MAC地址設(shè)置
2.1:MAC地址是在以太網(wǎng)mac層定義的,也就是物理地址,每一種LAN技術(shù)的網(wǎng)絡(luò)都有其唯一對應(yīng)的MAC地址,常用的格式為48位;
2.2:mac地址的47位是單一地址或者組地址位,該位為0,表示一個單一的站地址;該位為1,表示一個組地址(多播地址),所有位都為1,表示廣播地址;
2.3:mac地址的46位是全球管理或者本地管理位,該位為0,mac地址遵循全球地址管理格式,接下來的22位是生產(chǎn)商標(biāo)識符,最后剩下的24位是由相關(guān)機(jī)構(gòu)分配的唯一地址,我們的電腦都遵循這種方式的編址方式;該位為1,剩下的64位構(gòu)成本地管理地址,由人為規(guī)定;
2.4:enc28j60模塊不提供mac地址,需要用戶自己定義mac地址,如果是用于私有網(wǎng)路,任意定義即可,如果需要訪問外網(wǎng),就必須由用戶定義一個全球唯一的mac地址,如果需要,可以利用某些廠家的芯片上的mac地址來定義,比如:美國微芯的24AA02E48串行eeprom芯片中的mac地址;一般將定義的mac地址存放在flash或者eeprom中,如果使用24AA02E48芯片,即可省去這一步;
2.5:本例程中,為了方便,任意定義了mac地址;
3、以太網(wǎng)協(xié)議
3.1:建立keil工程,如下圖,APP目錄中的app.c文件中實現(xiàn)main函數(shù);TCP/IP STACK協(xié)議棧目錄中ethernet.c文件中實現(xiàn)以太網(wǎng)協(xié)議調(diào)用的函數(shù),都是包裹函數(shù),包裹enc28j60驅(qū)動中的函數(shù);DRIVEER中實現(xiàn)定時器、串口(用于控制臺)、spi、enc28j60驅(qū)動;
3.2:以太網(wǎng)部分的實現(xiàn),主要完成ethernet.h、ethernet.c和app.c三個文件;
ethernet.h文件:定義以太網(wǎng)頭部結(jié)構(gòu)體,RX_FRAME、TX_FRAME宏定義,所有以太網(wǎng)數(shù)據(jù)幀的讀寫都是通過這兩個宏來實現(xiàn);
#ifndef ETHERNET #define ETHERNET#include "stack.h" #include "enc28j60.h"/*地址定義*/ #define MAC_ADDRESS {0x00,0x14,0x0B,0x3F,0x04,0xB1} #define IP_ADDRESS {192,168,1,25} #define GATEWAY_ADDRESS {192,168,1,1} #define SUBNETMASK {255,255,255,0}/*協(xié)議類型定義*/ #define ARP_PROTOCOL 0x0806 #define IP_PROTOCOL 0x0800 #define ICMP_PROTOCOL 1 #define UDP_PROTOCOL 17 #define TCP_PROTOCOL 6#define RX_FRAME ((struct eth_header *)&rx_buff[0]) #define TX_FRAME ((struct eth_header *)&tx_buff[0])/*以太網(wǎng)頭部定義*/ #pragma pack(1) struct eth_header {unsigned char destination[6];unsigned char source[6];unsigned short protocol; }; #pragma pack()extern char rx_buff[PACKAGE_BUFF_SIZE]; extern char tx_buff[PACKAGE_BUFF_SIZE];void ethernet_init(void); unsigned int ethernet_read(void); void ethernet_send(void);#endif
3.3:實現(xiàn)main函數(shù),完成所需模塊的初始化,然后阻塞等待以太網(wǎng)接口接受到數(shù)據(jù)幀,如果收到數(shù)據(jù)幀,打印收到的以太網(wǎng)數(shù)據(jù)幀,包括目的mac地址、源mac地址、協(xié)議類型; app.c #include "stm32f10x.h" #include "usart_init.h" #include "time3_init.h" #include "ethernet.h" #include "spi_init.h" #include "enc28j60.h" #include "ethernet.h"u32 baud_menu[] = {1200,2400,3840,4800,5760,9600,19200,115200}; u16 ARR = 0;int main() {unsigned int len = 0;ARR = T_35_Set(baud_menu[7]); //根據(jù)3.5T時間,計算定時器3重載寄存器的值NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級 Usart_Init(baud_menu[7]); //串口初始化TIM3_Int_Init(ARR,71); //定時器初始化,3.5T時間中斷 spi_init(); //spi初始化ethernet_init(); //以太網(wǎng)芯片初始化while(1){len = ethernet_read();if(len > 0){printf("*****************Ethernet Frame*******************\r\n");printf("\r\n");printf("Destination Address: %02x-%02x-%02x-%02x-%02x-%02x\r\n",RX_FRAME->destination[0],RX_FRAME->destination[1],RX_FRAME->destination[2],RX_FRAME->destination[3],RX_FRAME->destination[4],RX_FRAME->destination[5]);printf("\r\n");printf("Source Address: %02x-%02x-%02x-%02x-%02x-%02x\r\n",RX_FRAME->source[0],RX_FRAME->source[1],RX_FRAME->source[2],RX_FRAME->source[3],RX_FRAME->source[4],RX_FRAME->source[5]);printf("\r\n");printf("Protocol Type:%04x\r\n",HTONS(RX_FRAME->protocol));printf("\r\n");printf("*****************Ethernet Frame*******************\r\n\r\n");}/*接收串口數(shù)據(jù)成功,處理接受到的數(shù)據(jù)*/if(Usart_Receive_Ok == 1){Usart_Receive_Ok = 0;Usart_Handle_func(); //處理接收到的數(shù)據(jù)}} }
4、PING指令測試
4.1:將開發(fā)板通過網(wǎng)線連接至路由器,此時,電腦和開發(fā)板在同一個局域網(wǎng),然后在電腦上使用ping指令,確保ping指令的ip地址沒有被占用且ip地址和路由器地址在同一個網(wǎng)段,如ping 192.168.1.16; 4.2:ping指令是基于ICMP協(xié)議的程序,當(dāng)ping一個IP時,如果此ip地址沒有在ARP條目中,ping程序會發(fā)送一個廣播的以太網(wǎng)幀至局域網(wǎng)來跟新arp條目; 4.3:當(dāng)使用ping指令連接一個未連接過的ip時,本例程會受到一個以太網(wǎng)廣播幀,并將其打印出來,包括全為1的目的mac地址+源mac地址(電腦mac地址+0806(協(xié)議類型)),如下圖:
總結(jié)
以上是生活随笔為你收集整理的嵌入式以太网第三部分——以太网协议实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot自定义starte
- 下一篇: android .9图片的使用