日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32+ENC28J60+UIP协议栈实现WEB服务器示例

發(fā)布時(shí)間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32+ENC28J60+UIP协议栈实现WEB服务器示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、環(huán)境介紹

MCU:??STM32F103ZET6

網(wǎng)卡:?ENC28J60

協(xié)議棧: UIP

開發(fā)軟件:?Keil5

二、功能介紹

完整項(xiàng)目源碼下載鏈接:https://download.csdn.net/download/xiaolong1126626497/18617694

STM32控制ENC28J60+UIP協(xié)議棧創(chuàng)建TCP服務(wù)器(WEB服務(wù)器),支持瀏覽器訪問完成數(shù)據(jù)傳輸。 瀏覽器可以實(shí)時(shí)顯示溫度、時(shí)間、可以控制STM32開發(fā)板上的LED燈、蜂鳴器。

?

?

?

三、?ENC28J60芯片介紹

ENC28J60 是帶有行業(yè)標(biāo)準(zhǔn)串行外設(shè)接口(Serial Peripheral Interface,SPI)的獨(dú)立以太網(wǎng) 控制器。它可作為任何配備有 SPI 的控制器的以太網(wǎng)接口。ENC28J60 符合 IEEE 802.3 的全部規(guī)范,采用了一系列包過濾機(jī)制以對(duì)傳入數(shù)據(jù)包進(jìn)行限制。 它還提供了一個(gè)內(nèi)部 DMA 模塊, 以實(shí)現(xiàn)快速數(shù)據(jù)吞吐和硬件支持的 IP 校驗(yàn)和計(jì)算。 與主控制器的通信通過兩個(gè)中斷引腳和 SPI 實(shí)現(xiàn),數(shù)據(jù)傳輸速率高達(dá) 10 Mb/s。兩個(gè)專用的引腳用于連接 LED,進(jìn)行網(wǎng)絡(luò)活動(dòng)狀態(tài)指示。ENC28J60 總共只有 28 腳,提供 QFN/TF。

?ENC28J60 的主要特點(diǎn)如下:

  • 兼容 IEEE802.3 協(xié)議的以太網(wǎng)控制器
  • 集成 MAC 和 10 BASE-T 物理層
  • 支持全雙工和半雙工模式
  • 數(shù)據(jù)沖突時(shí)可編程自動(dòng)重發(fā)
  • SPI 接口速度可達(dá) 10Mbps
  • 8K 數(shù)據(jù)接收和發(fā)送雙端口 RAM
  • 提供快速數(shù)據(jù)移動(dòng)的內(nèi)部 DMA 控制器
  • 可配置的接收和發(fā)送緩沖區(qū)大小
  • 兩個(gè)可編程 LED 輸出
  • 帶7個(gè)中斷源的兩個(gè)中斷引腳
  • TTL 電平輸入
  • 提供多種封裝:SOIC/SSOP/SPDIP/QFN 等。
  • ?

    ENC28J60 由七個(gè)主要功能模塊組成:

    1) SPI 接口,充當(dāng)主控制器和 ENC28J60 之間通信通道。

    2) 控制寄存器,用于控制和監(jiān)視 ENC28J60。

    3) 雙端口 RAM 緩沖器,用于接收和發(fā)送數(shù)據(jù)包。

    4) 判優(yōu)器,當(dāng) DMA、發(fā)送和接收模塊發(fā)出請(qǐng)求時(shí)對(duì) RAM 緩沖器的訪問進(jìn)行控制。

    5) 總線接口,對(duì)通過 SPI 接收的數(shù)據(jù)和命令進(jìn)行解析。

    6) MAC(Medium Access Control)模塊,實(shí)現(xiàn)符合 IEEE 802.3 標(biāo)準(zhǔn)的 MAC 邏輯。

    7) PHY(物理層)模塊,對(duì)雙絞線上的模擬數(shù)據(jù)進(jìn)行編碼和譯碼。?

    ENC28J60 還包括其他支持模塊,諸如振蕩器、片內(nèi)穩(wěn)壓器、電平變換器(提供可以接受 5V 電壓的 I/O 引腳)和系統(tǒng)控制邏輯。

    ?

    四、UIP 簡(jiǎn)介

    uIP 由瑞典計(jì)算機(jī)科學(xué)學(xué)院(網(wǎng)絡(luò)嵌入式系統(tǒng)小組)的Adam Dunkels 開發(fā)。其源代碼由C 語 言編寫,并完全公開,uIP 的最新版本是 1.0 版本。 uIP 協(xié)議棧去掉了完整的 TCP/IP 中不常用的功能,簡(jiǎn)化了通訊流程,但保留了網(wǎng)絡(luò)通信 必須使用的協(xié)議,設(shè)計(jì)重點(diǎn)放在了 IP/TCP/ICMP/UDP/ARP 這些網(wǎng)絡(luò)層和傳輸層協(xié)議上,保證 了其代碼的通用性和結(jié)構(gòu)的穩(wěn)定性。

    官網(wǎng):https://github.com/adamdunkels/uip

    ?由于 uIP 協(xié)議棧專門為嵌入式系統(tǒng)而設(shè)計(jì),因此還具有如下優(yōu)越功能:

    1) 代碼非常少,其協(xié)議棧代碼不到 6K,很方便閱讀和移植。

    2) 占用的內(nèi)存數(shù)非常少,RAM 占用僅幾百字節(jié)。

    3) 其硬件處理層、協(xié)議棧層和應(yīng)用層共用一個(gè)全局緩存區(qū),不存在數(shù)據(jù)的拷貝,且發(fā)送 和接收都是依靠這個(gè)緩存區(qū),極大的節(jié)省空間和時(shí)間。

    4) 支持多個(gè)主動(dòng)連接和被動(dòng)連接并發(fā)。

    5) 其源代碼中提供一套實(shí)例程序:web 服務(wù)器,web 客戶端,電子郵件發(fā)送程序(SMTP 客 戶端),Telnet 服務(wù)器, DNS 主機(jī)名解析程序等。通用性強(qiáng),移植起來基本不用修改就可以通過。

    6) 對(duì)數(shù)據(jù)的處理采用輪循機(jī)制,不需要操作系統(tǒng)的支持。 由于 uIP 對(duì)資源的需求少和移植容易,大部分的 8 位微控制器都使用過uIP 協(xié)議棧, 而且很多的著名的嵌入式產(chǎn)品和項(xiàng)目(如衛(wèi)星,Cisco 路由器,無線傳感器網(wǎng)絡(luò))中都在使用 uIP 協(xié)議棧。 uIP 相當(dāng)于一個(gè)代碼庫,通過一系列的函數(shù)實(shí)現(xiàn)與底層硬件和高層應(yīng)用程序的通訊,對(duì)于 整個(gè)系統(tǒng)來說它內(nèi)部的協(xié)議組是透明的,從而增加了協(xié)議的通用性。

    uIP 提供的接口函數(shù)有:

    1.初始化 uIP 協(xié)議棧:uip_init()

    2.處理輸入包:uip_input()

    3.處理周期計(jì)時(shí)事件:uip_periodic()

    4.開始監(jiān)聽端口:uip_listen()

    5.連接到遠(yuǎn)程主機(jī):uip_connect()

    6.接收到連接請(qǐng)求:uip_connected()

    7.主動(dòng)關(guān)閉連接:uip_close()

    8.連接被關(guān)閉:uip_closed()

    9.發(fā)出去的數(shù)據(jù)被應(yīng)答:uip_acked()

    10.在當(dāng)前連接發(fā)送數(shù)據(jù):uip_send()

    11.在當(dāng)前連接上收到新的數(shù)據(jù):uip_newdata()

    12.告訴對(duì)方要停止連接:uip_stop()

    13.連接被意外終止:uip_aborted()

    ?

    五、核心代碼

    5.1? main.c

    #include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include <string.h> #include <stdio.h> #include "enc28j60.h" #include "time.h"#include "uip.h" #include "uip_arp.h" #include "tapdev.h" #include "timer.h" #include "uip-conf.h" #include "httpd.h" #include "ds18b20.h" #include "rtc.h"void uip_EventPoll(void); //事件處理函數(shù) #define UIP_BUF ((struct uip_eth_hdr *)&uip_buf[0])/* 當(dāng)Uip接收到Uip接收到底層傳遞的數(shù)據(jù),將接收到的數(shù)據(jù)通過調(diào)用http_appcall(),傳遞給Webserver處理, 再通過handle_connection()先后調(diào)用handle_input()函數(shù)和handle_output()函數(shù) handle_input()主要作用是分析http數(shù)據(jù)流:得到請(qǐng)求的路徑、解析出請(qǐng)求的文件名稱。 然后調(diào)用函數(shù)handle_output進(jìn)行查找對(duì)應(yīng)文件,進(jìn)行發(fā)送到瀏覽器,完成交互。 注意:瀏覽器最好使用谷歌瀏覽器,否則會(huì)導(dǎo)致訪問失敗! */int main() {u8 key;u32 tcnt=0;uip_ipaddr_t ipaddr; //保存IP地址信息BeepInit(); //蜂鳴器初始化LedInit(); //LED燈初始化UsartInit(USART1,72,115200);KeyInit(); //按鍵初始化TimerInit(TIM6,72,10000); //定時(shí)器初始化,DS18B20_Init();RTC_Init();SET_RTC_TIME(2019,5,24,10,58,20);printf("串口工作正常!\r\n");while(tapdev_init()) //初始化ENC28J60錯(cuò)誤{printf("ENC28J60 Init Error!\r\n");Delay72M_Ms(500);}printf("ENC28J60 初始化成功!\r\n");uip_init(); //uIP初始化uip_ipaddr(ipaddr, 192,168,1,89); //填充開發(fā)板IP地址uip_sethostaddr(ipaddr); //設(shè)置開發(fā)板IP地址uip_ipaddr(ipaddr, 192,168,1,1); //填充開發(fā)板網(wǎng)關(guān)地址uip_setdraddr(ipaddr); //設(shè)置開發(fā)板網(wǎng)關(guān)IP地址(其實(shí)就是你路由器的IP地址)uip_ipaddr(ipaddr, 255,255,255,0); //填充開發(fā)板網(wǎng)絡(luò)掩碼uip_setnetmask(ipaddr); //填充開發(fā)板網(wǎng)絡(luò)掩碼httpd_init(); //創(chuàng)建WEB服務(wù)器,設(shè)置監(jiān)聽端口while(1){ uip_EventPoll(); //輪詢方式處理處理網(wǎng)絡(luò)數(shù)據(jù)} }/* 函數(shù)功能:uip事件處理函數(shù),需要將該函數(shù)插入用戶主循環(huán),循環(huán)調(diào)用 */ void uip_EventPoll(void) {u8 i;static struct timer arp_timer; //定義定時(shí)器static u8 timer_ok=0;if(timer_ok==0)//僅初始化一次{timer_ok = 1;timer_set(&arp_timer,CLOCK_SECOND*10); //創(chuàng)建1個(gè)10秒的定時(shí)器}uip_len=tapdev_read(); //從網(wǎng)絡(luò)設(shè)備讀取一個(gè)IP包,得到數(shù)據(jù)長(zhǎng)度.uip_len在uip.c中定義if(uip_len>0) //有數(shù)據(jù){//處理IP數(shù)據(jù)包(只有校驗(yàn)通過的IP包才會(huì)被接收)if(UIP_BUF->type == htons(UIP_ETHTYPE_IP))//是否是IP包?{uip_arp_ipin(); //去除以太網(wǎng)頭結(jié)構(gòu),更新ARP表uip_input(); //IP包處理//當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量 uip_len > 0//需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len (這是2個(gè)全局變量)if(uip_len>0)//需要回應(yīng)數(shù)據(jù){uip_arp_out();//加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要構(gòu)造ARP請(qǐng)求tapdev_send();//發(fā)送數(shù)據(jù)到以太網(wǎng)}} else if (UIP_BUF->type==htons(UIP_ETHTYPE_ARP))//處理arp報(bào)文,是否是ARP請(qǐng)求包?{uip_arp_arpin();//當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量uip_len>0//需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len(這是2個(gè)全局變量)if(uip_len>0)tapdev_send();//需要發(fā)送數(shù)據(jù),則通過tapdev_send發(fā)送}}//輪流處理每個(gè)TCP連接, UIP_CONNS缺省是40個(gè)for(i=0; i<UIP_CONNS; i++){uip_periodic(i); //處理TCP通信事件//當(dāng)上面的函數(shù)執(zhí)行后,如果需要發(fā)送數(shù)據(jù),則全局變量uip_len>0//需要發(fā)送的數(shù)據(jù)在uip_buf, 長(zhǎng)度是uip_len (這是2個(gè)全局變量)if(uip_len>0){uip_arp_out();//加以太網(wǎng)頭結(jié)構(gòu),在主動(dòng)連接時(shí)可能要構(gòu)造ARP請(qǐng)求tapdev_send();//發(fā)送數(shù)據(jù)到以太網(wǎng)}}//每隔10秒調(diào)用1次ARP定時(shí)器函數(shù) 用于定期ARP處理,ARP表10秒更新一次,舊的條目會(huì)被拋棄if(timer_expired(&arp_timer)){timer_reset(&arp_timer);uip_arp_timer();} }

    5.2 enc28j60.c

    #include "delay.h" #include <stdio.h> #include "enc28j60.h" /* 以下是ENC28J60驅(qū)動(dòng)移植接口: MISO--->PA6----主機(jī)輸入 MOSI--->PA7----主機(jī)輸出 SCLK--->PA5----時(shí)鐘信號(hào) CS----->PA4----片選 RESET-->PG15---復(fù)位 */ #define ENC28J60_CS PAout(4) //ENC28J60片選信號(hào) #define ENC28J60_RST PGout(15) //ENC28J60復(fù)位信號(hào) #define ENC28J60_MOSI PAout(7) //輸出 #define ENC28J60_MISO PAin(6) //輸入 #define ENC28J60_SCLK PAout(5) //時(shí)鐘線static u8 ENC28J60BANK; static u32 NextPacketPtr;/* 函數(shù)功能:底層SPI接口收發(fā)一個(gè)字節(jié) 說 明:模擬SPI時(shí)序,ENC28J60時(shí)鐘線空閑電平為低電平,在第一個(gè)下降沿采集數(shù)據(jù) */ u8 ENC28J60_SPI_ReadWriteOneByte(u8 tx_data) {u16 cnt=0; while((SPI1->SR&1<<1)==0) //等待發(fā)送區(qū)空--等待發(fā)送緩沖為空 {cnt++;if(cnt>=65530)return 0; //超時(shí)退出 u16=2個(gè)字節(jié)} SPI1->DR=tx_data; //發(fā)送一個(gè)byte cnt=0;while((SPI1->SR&1<<0)==0) //等待接收完一個(gè)byte {cnt++;if(cnt>=65530)return 0; //超時(shí)退出} return SPI1->DR; //返回收到的數(shù)據(jù) }/* 函數(shù)功能:復(fù)位ENC28J60,包括SPI初始化/IO初始化等 MISO--->PA6----主機(jī)輸入 MOSI--->PA7----主機(jī)輸出 SCLK--->PA5----時(shí)鐘信號(hào) CS----->PA4----片選 RESET-->PG15---復(fù)位 */ void ENC28J60_Reset(void) { /*開啟時(shí)鐘*/RCC->APB2ENR|=1<<12; //開啟SPI1時(shí)鐘RCC->APB2ENR|=1<<2; //PAGPIOA->CRL&=0X0000FFFF; //清除寄存器GPIOA->CRL|=0XB8B30000;GPIOA->ODR|=0XF<<4; // 上拉--輸出高電平GPIOA->ODR&=~(1<<5);RCC->APB2ENR|=1<<8; //2 3 4 5 6 7 8GPIOG->CRH&=0x0FFFFFFF;GPIOG->CRH|=0x30000000;/*SPI2基本配置*/SPI1->CR1=0X0; //清空寄存器SPI1->CR1|=0<<15; //選擇“雙線雙向”模式SPI1->CR1|=0<<11; //使用8位數(shù)據(jù)幀格式進(jìn)行發(fā)送/接收;SPI1->CR1|=0<<10; //全雙工(發(fā)送和接收);SPI1->CR1|=1<<9; //啟用軟件從設(shè)備管理SPI1->CR1|=1<<8; //NSSSPI1->CR1|=0<<7; //幀格式,先發(fā)送高位SPI1->CR1|=0x1<<3;//當(dāng)總線頻率為36MHZ時(shí),SPI速度為18MHZ,高速。SPI1->CR1|=1<<2; //配置為主設(shè)備SPI1->CR1|=1<<1; //空閑狀態(tài)時(shí), SCK保持高電平。SPI1->CR1|=1<<0; //數(shù)據(jù)采樣從第二個(gè)時(shí)鐘邊沿開始。SPI1->CR1|=1<<6; //開啟SPI設(shè)備。//針對(duì)ENC28J60的特點(diǎn)(SCK空閑為低電平)修改SPI的設(shè)置SPI1->CR1&=~(1<<6); //SPI設(shè)備失能SPI1->CR1&=~(1<<1); //空閑模式下SCK為0 CPOL=0SPI1->CR1&=~(1<<0); //數(shù)據(jù)采樣從第1個(gè)時(shí)間邊沿開始,CPHA=0 SPI1->CR1|=1<<6; //SPI設(shè)備使能ENC28J60_RST=0; //復(fù)位ENC28J60DelayMs(10); ENC28J60_RST=1; //復(fù)位結(jié)束 DelayMs(10); }/* 函數(shù)功能:讀取ENC28J60寄存器(帶操作碼) 參 數(shù):op:操作碼addr:寄存器地址/參數(shù) 返 回 值:讀到的數(shù)據(jù) */ u8 ENC28J60_Read_Op(u8 op,u8 addr) {u8 dat=0; ENC28J60_CS=0; dat=op|(addr&ADDR_MASK);ENC28J60_SPI_ReadWriteOneByte(dat);dat=ENC28J60_SPI_ReadWriteOneByte(0xFF);//如果是讀取MAC/MII寄存器,則第二次讀到的數(shù)據(jù)才是正確的,見手冊(cè)29頁if(addr&0x80)dat=ENC28J60_SPI_ReadWriteOneByte(0xFF);ENC28J60_CS=1;return dat; }/* 函數(shù)功能:讀取ENC28J60寄存器(帶操作碼) 參 數(shù):op:操作碼addr:寄存器地址data:參數(shù) */ void ENC28J60_Write_Op(u8 op,u8 addr,u8 data) {u8 dat = 0; ENC28J60_CS=0; dat=op|(addr&ADDR_MASK);ENC28J60_SPI_ReadWriteOneByte(dat); ENC28J60_SPI_ReadWriteOneByte(data);ENC28J60_CS=1; }/* 函數(shù)功能:讀取ENC28J60接收緩存數(shù)據(jù) 參 數(shù):len:要讀取的數(shù)據(jù)長(zhǎng)度data:輸出數(shù)據(jù)緩存區(qū)(末尾自動(dòng)添加結(jié)束符) */ void ENC28J60_Read_Buf(u32 len,u8* data) {ENC28J60_CS=0; ENC28J60_SPI_ReadWriteOneByte(ENC28J60_READ_BUF_MEM);while(len){len--; *data=(u8)ENC28J60_SPI_ReadWriteOneByte(0);data++;}*data='\0';ENC28J60_CS=1; }/* 函數(shù)功能:向ENC28J60寫發(fā)送緩存數(shù)據(jù) 參 數(shù):len:要寫入的數(shù)據(jù)長(zhǎng)度data:數(shù)據(jù)緩存區(qū) */ void ENC28J60_Write_Buf(u32 len,u8* data) {ENC28J60_CS=0; ENC28J60_SPI_ReadWriteOneByte(ENC28J60_WRITE_BUF_MEM); while(len){len--;ENC28J60_SPI_ReadWriteOneByte(*data);data++;}ENC28J60_CS=1; }/* 函數(shù)功能:設(shè)置ENC28J60寄存器Bank 參 數(shù):ban:要設(shè)置的bank */ void ENC28J60_Set_Bank(u8 bank) { if((bank&BANK_MASK)!=ENC28J60BANK)//和當(dāng)前bank不一致的時(shí)候,才設(shè)置{ ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,ECON1,(ECON1_BSEL1|ECON1_BSEL0));ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON1,(bank&BANK_MASK)>>5);ENC28J60BANK=(bank&BANK_MASK);} }/* 函數(shù)功能:讀取ENC28J60指定寄存器 參 數(shù):addr:寄存器地址 返 回 值:讀到的數(shù)據(jù) */ u8 ENC28J60_Read(u8 addr) { ENC28J60_Set_Bank(addr);//設(shè)置BANK return ENC28J60_Read_Op(ENC28J60_READ_CTRL_REG,addr); }/* 函數(shù)功能:向ENC28J60指定寄存器寫數(shù)據(jù) 參 數(shù):addr:寄存器地址data:要寫入的數(shù)據(jù) */ void ENC28J60_Write(u8 addr,u8 data) { ENC28J60_Set_Bank(addr); ENC28J60_Write_Op(ENC28J60_WRITE_CTRL_REG,addr,data); }/* 函數(shù)功能:向ENC28J60的PHY寄存器寫入數(shù)據(jù) 參 數(shù):addr:寄存器地址data:要寫入的數(shù)據(jù) */ void ENC28J60_PHY_Write(u8 addr,u32 data) {u16 retry=0;ENC28J60_Write(MIREGADR,addr); //設(shè)置PHY寄存器地址ENC28J60_Write(MIWRL,data); //寫入數(shù)據(jù)ENC28J60_Write(MIWRH,data>>8); while((ENC28J60_Read(MISTAT)&MISTAT_BUSY)&&retry<0XFFF)retry++;//等待寫入PHY結(jié)束 }/* 函數(shù)功能:初始化ENC28J60 參 數(shù):macaddr:MAC地址 返 回 值:0,初始化成功;1,初始化失敗; */ u8 ENC28J60_Init(u8* macaddr) { u16 retry=0; ENC28J60_Reset(); //復(fù)位底層引腳接口ENC28J60_Write_Op(ENC28J60_SOFT_RESET,0,ENC28J60_SOFT_RESET);//軟件復(fù)位while(!(ENC28J60_Read(ESTAT)&ESTAT_CLKRDY)&&retry<500)//等待時(shí)鐘穩(wěn)定{retry++;DelayMs(1);};if(retry>=500)return 1;//ENC28J60初始化失敗// do bank 0 stuff// initialize receive buffer// 16-bit transfers,must write low byte first// set receive buffer start address 設(shè)置接收緩沖區(qū)地址 8K字節(jié)容量NextPacketPtr=RXSTART_INIT;// Rx start//接收緩沖器由一個(gè)硬件管理的循環(huán)FIFO 緩沖器構(gòu)成。//寄存器對(duì)ERXSTH:ERXSTL 和ERXNDH:ERXNDL 作//為指針,定義緩沖器的容量和其在存儲(chǔ)器中的位置。//ERXST和ERXND指向的字節(jié)均包含在FIFO緩沖器內(nèi)。//當(dāng)從以太網(wǎng)接口接收數(shù)據(jù)字節(jié)時(shí),這些字節(jié)被順序?qū)懭?/接收緩沖器。 但是當(dāng)寫入由ERXND 指向的存儲(chǔ)單元//后,硬件會(huì)自動(dòng)將接收的下一字節(jié)寫入由ERXST 指向//的存儲(chǔ)單元。 因此接收硬件將不會(huì)寫入FIFO 以外的單//元。//設(shè)置接收起始字節(jié)ENC28J60_Write(ERXSTL,RXSTART_INIT&0xFF); ENC28J60_Write(ERXSTH,RXSTART_INIT>>8); //ERXWRPTH:ERXWRPTL 寄存器定義硬件向FIFO 中//的哪個(gè)位置寫入其接收到的字節(jié)。 指針是只讀的,在成//功接收到一個(gè)數(shù)據(jù)包后,硬件會(huì)自動(dòng)更新指針。 指針可//用于判斷FIFO 內(nèi)剩余空間的大小 8K-1500。 //設(shè)置接收讀指針字節(jié)ENC28J60_Write(ERXRDPTL,RXSTART_INIT&0xFF);ENC28J60_Write(ERXRDPTH,RXSTART_INIT>>8);//設(shè)置接收結(jié)束字節(jié)ENC28J60_Write(ERXNDL,RXSTOP_INIT&0xFF);ENC28J60_Write(ERXNDH,RXSTOP_INIT>>8);//設(shè)置發(fā)送起始字節(jié)ENC28J60_Write(ETXSTL,TXSTART_INIT&0xFF);ENC28J60_Write(ETXSTH,TXSTART_INIT>>8);//設(shè)置發(fā)送結(jié)束字節(jié)ENC28J60_Write(ETXNDL,TXSTOP_INIT&0xFF);ENC28J60_Write(ETXNDH,TXSTOP_INIT>>8);// do bank 1 stuff,packet filter:// For broadcast packets we allow only ARP packtets// All other packets should be unicast only for our mac (MAADR)//// The pattern to match on is therefore// Type ETH.DST// ARP BROADCAST// 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9// in binary these poitions are:11 0000 0011 1111// This is hex 303F->EPMM0=0x3f,EPMM1=0x30//接收過濾器//UCEN:單播過濾器使能位//當(dāng)ANDOR = 1 時(shí)://1 = 目標(biāo)地址與本地MAC 地址不匹配的數(shù)據(jù)包將被丟棄//0 = 禁止過濾器//當(dāng)ANDOR = 0 時(shí)://1 = 目標(biāo)地址與本地MAC 地址匹配的數(shù)據(jù)包會(huì)被接受//0 = 禁止過濾器//CRCEN:后過濾器CRC 校驗(yàn)使能位//1 = 所有CRC 無效的數(shù)據(jù)包都將被丟棄//0 = 不考慮CRC 是否有效//PMEN:格式匹配過濾器使能位//當(dāng)ANDOR = 1 時(shí)://1 = 數(shù)據(jù)包必須符合格式匹配條件,否則將被丟棄//0 = 禁止過濾器//當(dāng)ANDOR = 0 時(shí)://1 = 符合格式匹配條件的數(shù)據(jù)包將被接受//0 = 禁止過濾器ENC28J60_Write(ERXFCON,ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);ENC28J60_Write(EPMM0,0x3f);ENC28J60_Write(EPMM1,0x30);ENC28J60_Write(EPMCSL,0xf9);ENC28J60_Write(EPMCSH,0xf7);// do bank 2 stuff// enable MAC receive//bit 0 MARXEN:MAC 接收使能位//1 = 允許MAC 接收數(shù)據(jù)包//0 = 禁止數(shù)據(jù)包接收//bit 3 TXPAUS:暫停控制幀發(fā)送使能位//1 = 允許MAC 發(fā)送暫停控制幀(用于全雙工模式下的流量控制)//0 = 禁止暫停幀發(fā)送//bit 2 RXPAUS:暫停控制幀接收使能位//1 = 當(dāng)接收到暫停控制幀時(shí),禁止發(fā)送(正常操作)//0 = 忽略接收到的暫停控制幀ENC28J60_Write(MACON1,MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);// bring MAC out of reset//將MACON2 中的MARST 位清零,使MAC 退出復(fù)位狀態(tài)。ENC28J60_Write(MACON2,0x00);// enable automatic padding to 60bytes and CRC operations//bit 7-5 PADCFG2:PACDFG0:自動(dòng)填充和CRC 配置位//111 = 用0 填充所有短幀至64 字節(jié)長(zhǎng),并追加一個(gè)有效的CRC//110 = 不自動(dòng)填充短幀//101 = MAC 自動(dòng)檢測(cè)具有8100h 類型字段的VLAN 協(xié)議幀,并自動(dòng)填充到64 字節(jié)長(zhǎng)。如果不//是VLAN 幀,則填充至60 字節(jié)長(zhǎng)。填充后還要追加一個(gè)有效的CRC//100 = 不自動(dòng)填充短幀//011 = 用0 填充所有短幀至64 字節(jié)長(zhǎng),并追加一個(gè)有效的CRC//010 = 不自動(dòng)填充短幀//001 = 用0 填充所有短幀至60 字節(jié)長(zhǎng),并追加一個(gè)有效的CRC//000 = 不自動(dòng)填充短幀//bit 4 TXCRCEN:發(fā)送CRC 使能位//1 = 不管PADCFG如何,MAC都會(huì)在發(fā)送幀的末尾追加一個(gè)有效的CRC。 如果PADCFG規(guī)定要//追加有效的CRC,則必須將TXCRCEN 置1。//0 = MAC不會(huì)追加CRC。 檢查最后4 個(gè)字節(jié),如果不是有效的CRC 則報(bào)告給發(fā)送狀態(tài)向量。//bit 0 FULDPX:MAC 全雙工使能位//1 = MAC工作在全雙工模式下。 PHCON1.PDPXMD 位必須置1。//0 = MAC工作在半雙工模式下。 PHCON1.PDPXMD 位必須清零。ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,MACON3,MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN|MACON3_FULDPX);// set inter-frame gap (non-back-to-back)//配置非背對(duì)背包間間隔寄存器的低字節(jié)//MAIPGL。 大多數(shù)應(yīng)用使用12h 編程該寄存器。//如果使用半雙工模式,應(yīng)編程非背對(duì)背包間間隔//寄存器的高字節(jié)MAIPGH。 大多數(shù)應(yīng)用使用0Ch//編程該寄存器。ENC28J60_Write(MAIPGL,0x12);ENC28J60_Write(MAIPGH,0x0C);// set inter-frame gap (back-to-back)//配置背對(duì)背包間間隔寄存器MABBIPG。當(dāng)使用//全雙工模式時(shí),大多數(shù)應(yīng)用使用15h 編程該寄存//器,而使用半雙工模式時(shí)則使用12h 進(jìn)行編程。ENC28J60_Write(MABBIPG,0x15);// Set the maximum packet size which the controller will accept// Do not send packets longer than MAX_FRAMELEN:// 最大幀長(zhǎng)度 1500ENC28J60_Write(MAMXFLL,MAX_FRAMELEN&0xFF); ENC28J60_Write(MAMXFLH,MAX_FRAMELEN>>8);// do bank 3 stuff// write MAC address// NOTE: MAC address in ENC28J60 is byte-backward//設(shè)置MAC地址ENC28J60_Write(MAADR5,macaddr[0]); ENC28J60_Write(MAADR4,macaddr[1]);ENC28J60_Write(MAADR3,macaddr[2]);ENC28J60_Write(MAADR2,macaddr[3]);ENC28J60_Write(MAADR1,macaddr[4]);ENC28J60_Write(MAADR0,macaddr[5]);//配置PHY為全雙工 LEDB為拉電流ENC28J60_PHY_Write(PHCON1,PHCON1_PDPXMD); // no loopback of transmitted frames 禁止環(huán)回//HDLDIS:PHY 半雙工環(huán)回禁止位//當(dāng)PHCON1.PDPXMD = 1 或PHCON1.PLOOPBK = 1 時(shí)://此位可被忽略。//當(dāng)PHCON1.PDPXMD = 0 且PHCON1.PLOOPBK = 0 時(shí)://1 = 要發(fā)送的數(shù)據(jù)僅通過雙絞線接口發(fā)出//0 = 要發(fā)送的數(shù)據(jù)會(huì)環(huán)回到MAC 并通過雙絞線接口發(fā)出ENC28J60_PHY_Write(PHCON2,PHCON2_HDLDIS);// switch to bank 0//ECON1 寄存器//寄存器3-1 所示為ECON1 寄存器,它用于控制//ENC28J60 的主要功能。 ECON1 中包含接收使能、發(fā)//送請(qǐng)求、DMA 控制和存儲(chǔ)區(qū)選擇位。 ENC28J60_Set_Bank(ECON1);// enable interrutps//EIE: 以太網(wǎng)中斷允許寄存器//bit 7 INTIE: 全局INT 中斷允許位//1 = 允許中斷事件驅(qū)動(dòng)INT 引腳//0 = 禁止所有INT 引腳的活動(dòng)(引腳始終被驅(qū)動(dòng)為高電平)//bit 6 PKTIE: 接收數(shù)據(jù)包待處理中斷允許位//1 = 允許接收數(shù)據(jù)包待處理中斷//0 = 禁止接收數(shù)據(jù)包待處理中斷ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,EIE,EIE_INTIE|EIE_PKTIE);// enable packet reception//bit 2 RXEN:接收使能位//1 = 通過當(dāng)前過濾器的數(shù)據(jù)包將被寫入接收緩沖器//0 = 忽略所有接收的數(shù)據(jù)包ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON1,ECON1_RXEN);if(ENC28J60_Read(MAADR5)== macaddr[0])return 0;//初始化成功else return 1; }/* 函數(shù)功能:讀取EREVID 參 數(shù): */ u8 ENC28J60_Get_EREVID(void) {//在EREVID 內(nèi)也存儲(chǔ)了版本信息。 EREVID 是一個(gè)只讀控//制寄存器,包含一個(gè)5 位標(biāo)識(shí)符,用來標(biāo)識(shí)器件特定硅片//的版本號(hào)return ENC28J60_Read(EREVID); }/* 函數(shù)功能:通過ENC28J60發(fā)送數(shù)據(jù)包到網(wǎng)絡(luò) 參 數(shù):len :數(shù)據(jù)包大小packet:數(shù)據(jù)包 */ void ENC28J60_Packet_Send(u32 len,u8* packet) {//設(shè)置發(fā)送緩沖區(qū)地址寫指針入口ENC28J60_Write(EWRPTL,TXSTART_INIT&0xFF);ENC28J60_Write(EWRPTH,TXSTART_INIT>>8);//設(shè)置TXND指針,以對(duì)應(yīng)給定的數(shù)據(jù)包大小 ENC28J60_Write(ETXNDL,(TXSTART_INIT+len)&0xFF);ENC28J60_Write(ETXNDH,(TXSTART_INIT+len)>>8);//寫每包控制字節(jié)(0x00表示使用macon3的設(shè)置) ENC28J60_Write_Op(ENC28J60_WRITE_BUF_MEM,0,0x00);//復(fù)制數(shù)據(jù)包到發(fā)送緩沖區(qū)//printf("len:%d\r\n",len); //監(jiān)視發(fā)送數(shù)據(jù)長(zhǎng)度ENC28J60_Write_Buf(len,packet);//發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON1,ECON1_TXRTS);//復(fù)位發(fā)送邏輯的問題。參見Rev. B4 Silicon Errata point 12.if((ENC28J60_Read(EIR)&EIR_TXERIF))ENC28J60_Write_Op(ENC28J60_BIT_FIELD_CLR,ECON1,ECON1_TXRTS); }/* 函數(shù)功能:從網(wǎng)絡(luò)獲取一個(gè)數(shù)據(jù)包內(nèi)容 函數(shù)參數(shù):maxlen:數(shù)據(jù)包最大允許接收長(zhǎng)度packet:數(shù)據(jù)包緩存區(qū) 返 回 值:收到的數(shù)據(jù)包長(zhǎng)度(字節(jié)) */ u32 ENC28J60_Packet_Receive(u32 maxlen,u8* packet) {u32 rxstat;u32 len; if(ENC28J60_Read(EPKTCNT)==0)return 0; //是否收到數(shù)據(jù)包? //設(shè)置接收緩沖器讀指針ENC28J60_Write(ERDPTL,(NextPacketPtr));ENC28J60_Write(ERDPTH,(NextPacketPtr)>>8); // 讀下一個(gè)包的指針NextPacketPtr=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);NextPacketPtr|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;//讀包的長(zhǎng)度len=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);len|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;len-=4; //去掉CRC計(jì)數(shù)//讀取接收狀態(tài)rxstat=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0);rxstat|=ENC28J60_Read_Op(ENC28J60_READ_BUF_MEM,0)<<8;//限制接收長(zhǎng)度 if (len>maxlen-1)len=maxlen-1; //檢查CRC和符號(hào)錯(cuò)誤// ERXFCON.CRCEN為默認(rèn)設(shè)置,一般我們不需要檢查.if((rxstat&0x80)==0)len=0;//無效else ENC28J60_Read_Buf(len,packet);//從接收緩沖器中復(fù)制數(shù)據(jù)包 //RX讀指針移動(dòng)到下一個(gè)接收到的數(shù)據(jù)包的開始位置 //并釋放我們剛才讀出過的內(nèi)存ENC28J60_Write(ERXRDPTL,(NextPacketPtr));ENC28J60_Write(ERXRDPTH,(NextPacketPtr)>>8);//遞減數(shù)據(jù)包計(jì)數(shù)器標(biāo)志我們已經(jīng)得到了這個(gè)包 ENC28J60_Write_Op(ENC28J60_BIT_FIELD_SET,ECON2,ECON2_PKTDEC);return(len); }

    5.3 enc28j60.h

    #include "sys.h" #ifndef __ENC28J60_H #define __ENC28J60_H #include "stm32f10x.h"// ENC28J60 Control Registers // Control register definitions are a combination of address, // bank number, and Ethernet/MAC/PHY indicator bits. // - Register address (bits 0-4) // - Bank number (bits 5-6) // - MAC/PHY indicator (bit 7) #define ADDR_MASK 0x1F #define BANK_MASK 0x60 #define SPRD_MASK 0x80 // All-bank registers #define EIE 0x1B #define EIR 0x1C #define ESTAT 0x1D #define ECON2 0x1E #define ECON1 0x1F // Bank 0 registers #define ERDPTL (0x00|0x00) #define ERDPTH (0x01|0x00) #define EWRPTL (0x02|0x00) #define EWRPTH (0x03|0x00) #define ETXSTL (0x04|0x00) #define ETXSTH (0x05|0x00) #define ETXNDL (0x06|0x00) #define ETXNDH (0x07|0x00) #define ERXSTL (0x08|0x00) #define ERXSTH (0x09|0x00) #define ERXNDL (0x0A|0x00) #define ERXNDH (0x0B|0x00) //ERXWRPTH:ERXWRPTL 寄存器定義硬件向FIFO 中 //的哪個(gè)位置寫入其接收到的字節(jié)。 指針是只讀的,在成 //功接收到一個(gè)數(shù)據(jù)包后,硬件會(huì)自動(dòng)更新指針。 指針可 //用于判斷FIFO 內(nèi)剩余空間的大小。 #define ERXRDPTL (0x0C|0x00) #define ERXRDPTH (0x0D|0x00) #define ERXWRPTL (0x0E|0x00) #define ERXWRPTH (0x0F|0x00) #define EDMASTL (0x10|0x00) #define EDMASTH (0x11|0x00) #define EDMANDL (0x12|0x00) #define EDMANDH (0x13|0x00) #define EDMADSTL (0x14|0x00) #define EDMADSTH (0x15|0x00) #define EDMACSL (0x16|0x00) #define EDMACSH (0x17|0x00) // Bank 1 registers #define EHT0 (0x00|0x20) #define EHT1 (0x01|0x20) #define EHT2 (0x02|0x20) #define EHT3 (0x03|0x20) #define EHT4 (0x04|0x20) #define EHT5 (0x05|0x20) #define EHT6 (0x06|0x20) #define EHT7 (0x07|0x20) #define EPMM0 (0x08|0x20) #define EPMM1 (0x09|0x20) #define EPMM2 (0x0A|0x20) #define EPMM3 (0x0B|0x20) #define EPMM4 (0x0C|0x20) #define EPMM5 (0x0D|0x20) #define EPMM6 (0x0E|0x20) #define EPMM7 (0x0F|0x20) #define EPMCSL (0x10|0x20) #define EPMCSH (0x11|0x20) #define EPMOL (0x14|0x20) #define EPMOH (0x15|0x20) #define EWOLIE (0x16|0x20) #define EWOLIR (0x17|0x20) #define ERXFCON (0x18|0x20) #define EPKTCNT (0x19|0x20) // Bank 2 registers #define MACON1 (0x00|0x40|0x80) #define MACON2 (0x01|0x40|0x80) #define MACON3 (0x02|0x40|0x80) #define MACON4 (0x03|0x40|0x80) #define MABBIPG (0x04|0x40|0x80) #define MAIPGL (0x06|0x40|0x80) #define MAIPGH (0x07|0x40|0x80) #define MACLCON1 (0x08|0x40|0x80) #define MACLCON2 (0x09|0x40|0x80) #define MAMXFLL (0x0A|0x40|0x80) #define MAMXFLH (0x0B|0x40|0x80) #define MAPHSUP (0x0D|0x40|0x80) #define MICON (0x11|0x40|0x80) #define MICMD (0x12|0x40|0x80) #define MIREGADR (0x14|0x40|0x80) #define MIWRL (0x16|0x40|0x80) #define MIWRH (0x17|0x40|0x80) #define MIRDL (0x18|0x40|0x80) #define MIRDH (0x19|0x40|0x80) // Bank 3 registers #define MAADR1 (0x00|0x60|0x80) #define MAADR0 (0x01|0x60|0x80) #define MAADR3 (0x02|0x60|0x80) #define MAADR2 (0x03|0x60|0x80) #define MAADR5 (0x04|0x60|0x80) #define MAADR4 (0x05|0x60|0x80) #define EBSTSD (0x06|0x60) #define EBSTCON (0x07|0x60) #define EBSTCSL (0x08|0x60) #define EBSTCSH (0x09|0x60) #define MISTAT (0x0A|0x60|0x80) #define EREVID (0x12|0x60) #define ECOCON (0x15|0x60) #define EFLOCON (0x17|0x60) #define EPAUSL (0x18|0x60) #define EPAUSH (0x19|0x60) // PHY registers #define PHCON1 0x00 #define PHSTAT1 0x01 #define PHHID1 0x02 #define PHHID2 0x03 #define PHCON2 0x10 #define PHSTAT2 0x11 #define PHIE 0x12 #define PHIR 0x13 #define PHLCON 0x14 // ENC28J60 ERXFCON Register Bit Definitions #define ERXFCON_UCEN 0x80 #define ERXFCON_ANDOR 0x40 #define ERXFCON_CRCEN 0x20 #define ERXFCON_PMEN 0x10 #define ERXFCON_MPEN 0x08 #define ERXFCON_HTEN 0x04 #define ERXFCON_MCEN 0x02 #define ERXFCON_BCEN 0x01 // ENC28J60 EIE Register Bit Definitions #define EIE_INTIE 0x80 #define EIE_PKTIE 0x40 #define EIE_DMAIE 0x20 #define EIE_LINKIE 0x10 #define EIE_TXIE 0x08 #define EIE_WOLIE 0x04 #define EIE_TXERIE 0x02 #define EIE_RXERIE 0x01 // ENC28J60 EIR Register Bit Definitions #define EIR_PKTIF 0x40 #define EIR_DMAIF 0x20 #define EIR_LINKIF 0x10 #define EIR_TXIF 0x08 #define EIR_WOLIF 0x04 #define EIR_TXERIF 0x02 #define EIR_RXERIF 0x01 // ENC28J60 ESTAT Register Bit Definitions #define ESTAT_INT 0x80 #define ESTAT_LATECOL 0x10 #define ESTAT_RXBUSY 0x04 #define ESTAT_TXABRT 0x02 #define ESTAT_CLKRDY 0x01 // ENC28J60 ECON2 Register Bit Definitions #define ECON2_AUTOINC 0x80 #define ECON2_PKTDEC 0x40 #define ECON2_PWRSV 0x20 #define ECON2_VRPS 0x08 // ENC28J60 ECON1 Register Bit Definitions #define ECON1_TXRST 0x80 #define ECON1_RXRST 0x40 #define ECON1_DMAST 0x20 #define ECON1_CSUMEN 0x10 #define ECON1_TXRTS 0x08 #define ECON1_RXEN 0x04 #define ECON1_BSEL1 0x02 #define ECON1_BSEL0 0x01 // ENC28J60 MACON1 Register Bit Definitions #define MACON1_LOOPBK 0x10 #define MACON1_TXPAUS 0x08 #define MACON1_RXPAUS 0x04 #define MACON1_PASSALL 0x02 #define MACON1_MARXEN 0x01 // ENC28J60 MACON2 Register Bit Definitions #define MACON2_MARST 0x80 #define MACON2_RNDRST 0x40 #define MACON2_MARXRST 0x08 #define MACON2_RFUNRST 0x04 #define MACON2_MATXRST 0x02 #define MACON2_TFUNRST 0x01 // ENC28J60 MACON3 Register Bit Definitions #define MACON3_PADCFG2 0x80 #define MACON3_PADCFG1 0x40 #define MACON3_PADCFG0 0x20 #define MACON3_TXCRCEN 0x10 #define MACON3_PHDRLEN 0x08 #define MACON3_HFRMLEN 0x04 #define MACON3_FRMLNEN 0x02 #define MACON3_FULDPX 0x01 // ENC28J60 MICMD Register Bit Definitions #define MICMD_MIISCAN 0x02 #define MICMD_MIIRD 0x01 // ENC28J60 MISTAT Register Bit Definitions #define MISTAT_NVALID 0x04 #define MISTAT_SCAN 0x02 #define MISTAT_BUSY 0x01 // ENC28J60 PHY PHCON1 Register Bit Definitions #define PHCON1_PRST 0x8000 #define PHCON1_PLOOPBK 0x4000 #define PHCON1_PPWRSV 0x0800 #define PHCON1_PDPXMD 0x0100 // ENC28J60 PHY PHSTAT1 Register Bit Definitions #define PHSTAT1_PFDPX 0x1000 #define PHSTAT1_PHDPX 0x0800 #define PHSTAT1_LLSTAT 0x0004 #define PHSTAT1_JBSTAT 0x0002 // ENC28J60 PHY PHCON2 Register Bit Definitions #define PHCON2_FRCLINK 0x4000 #define PHCON2_TXDIS 0x2000 #define PHCON2_JABBER 0x0400 #define PHCON2_HDLDIS 0x0100// ENC28J60 Packet Control Byte Bit Definitions #define PKTCTRL_PHUGEEN 0x08 #define PKTCTRL_PPADEN 0x04 #define PKTCTRL_PCRCEN 0x02 #define PKTCTRL_POVERRIDE 0x01// SPI operation codes #define ENC28J60_READ_CTRL_REG 0x00 #define ENC28J60_READ_BUF_MEM 0x3A #define ENC28J60_WRITE_CTRL_REG 0x40 #define ENC28J60_WRITE_BUF_MEM 0x7A #define ENC28J60_BIT_FIELD_SET 0x80 #define ENC28J60_BIT_FIELD_CLR 0xA0 #define ENC28J60_SOFT_RESET 0xFF// The RXSTART_INIT should be zero. See Rev. B4 Silicon Errata // buffer boundaries applied to internal 8K ram // the entire available packet buffer space is allocated // // start with recbuf at 0/ #define RXSTART_INIT 0x0 // receive buffer end #define RXSTOP_INIT (0x1FFF-1518-1) // start TX buffer at 0x1FFF-0x0600, pace for one full ethernet frame (0~1518 bytes) #define TXSTART_INIT (0x1FFF-1518) // stp TX buffer at end of mem #define TXSTOP_INIT 0x1FFF // max frame length which the conroller will accept: #define MAX_FRAMELEN 1518 // (note: maximum ethernet frame length would be 1518)void ENC28J60_Reset(void); u8 ENC28J60_Read_Op(u8 op,u8 addr); void ENC28J60_Write_Op(u8 op,u8 addr,u8 data); void ENC28J60_Read_Buf(u32 len,u8* data); void ENC28J60_Write_Buf(u32 len,u8* data); void ENC28J60_Set_Bank(u8 bank); u8 ENC28J60_Read(u8 addr); void ENC28J60_Write(u8 addr,u8 data); void ENC28J60_PHY_Write(u8 addr,u32 data); u8 ENC28J60_Init(u8* macaddr); u8 ENC28J60_Get_EREVID(void); void ENC28J60_Packet_Send(u32 len,u8* packet); u32 ENC28J60_Packet_Receive(u32 maxlen,u8* packet); #endif

    5.4 httpd-fs.c

    /** Copyright (c) 2001, Swedish Institute of Computer Science.* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions* are met:* 1. Redistributions of source code must retain the above copyright* notice, this list of conditions and the following disclaimer.* 2. Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in the* documentation and/or other materials provided with the distribution.* 3. Neither the name of the Institute nor the names of its contributors* may be used to endorse or promote products derived from this software* without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF* SUCH DAMAGE.** This file is part of the lwIP TCP/IP stack.** Author: Adam Dunkels <adam@sics.se>** $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $*/#include "httpd.h" #include "httpd-fs.h" #include "httpd-fsdata.h"#ifndef NULL #define NULL 0 #endif /* NULL */#include "httpd-fsdata.c"#if HTTPD_FS_STATISTICS static u16_t count[HTTPD_FS_NUMFILES]; #endif /* HTTPD_FS_STATISTICS *//*-----------------------------------------------------------------------------------*/ static u8_t httpd_fs_strcmp(const char *str1, const char *str2) {u8_t i;i = 0; loop:if(str2[i] == 0 ||str1[i] == '\r' ||str1[i] == '\n') {return 0;}if(str1[i] != str2[i]) {return 1;}++i;goto loop; } #include <string.h> #include <stdio.h> #include "led.h" #include "ds18b20.h" #include "stm32f10x.h" #include "rtc.h"extern const unsigned char web_data[]; extern const char led1_on[]; extern const char led1_off[];char ds18b20_temp[100]; //存放DS18B20溫度信息 u16 ds18b20_T; u16 ds18b20_intT,ds18b20_decT; //溫度值的整數(shù)和小數(shù)部分/*-----------------------------------------------------------------------------------*/ int httpd_fs_open(const char *name, struct httpd_fs_file *file) {//第一次的默認(rèn)頁面if(strstr(name,"/index.html")){file->data=(char*)web_data;file->len = sizeof(web_data);return 1;}else if(strstr(name,"/404.html")){file->data=(char*)data_404_html;file->len = sizeof(data_404_html);return 0; }else if(strstr(name,"/test?data=off1")){file->data=(char*)led1_on;file->len = strlen(led1_on);LED1=1;return 1; }else if(strstr(name,"/test?data=on1")){file->data=(char*)led1_off;file->len = strlen(led1_off);LED1=0;return 1; }else if(strstr(name,"/test?data=off2")){file->data=(char*)led1_on;file->len = strlen(led1_on);LED2=1;return 1; }else if(strstr(name,"/test?data=on2")){file->data=(char*)led1_off;file->len = strlen(led1_off);LED2=0;return 1; }else if(strstr(name,"/test?data=off3")){file->data=(char*)led1_on;file->len = strlen(led1_on);LED3=1;return 1; }else if(strstr(name,"/test?data=on3")){file->data=(char*)led1_off;file->len = strlen(led1_off);LED3=0;return 1; }else if(strstr(name,"/test?data=off4")){file->data=(char*)led1_on;file->len = strlen(led1_on);LED4=1;return 1; }else if(strstr(name,"/test?data=on4")){file->data=(char*)led1_off;file->len = strlen(led1_off);LED4=0;return 1; }else if(strstr(name,"/test?data=off5")){file->data=(char*)led1_on;file->len = strlen(led1_on);BEEP=0;return 1; }else if(strstr(name,"/test?data=on5")){file->data=(char*)led1_off;file->len = strlen(led1_off);BEEP=1;return 1; }else if(strstr(name,"/test?data=temp")){/*讀取溫度信息*/ds18b20_T=DS18B20_Get_Temp();ds18b20_intT = ds18b20_T >> 4; //分離出溫度值整數(shù)部分ds18b20_decT = ds18b20_T & 0xF; //分離出溫度值小數(shù)部分//printf("%d-%d-%d %d:%d:%d\r\n",rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);sprintf(ds18b20_temp,"%d.%d&%d-%d-%d %d:%d:%d",ds18b20_intT,ds18b20_decT,rtc_time.year,rtc_time.mon,rtc_time.day,rtc_time.hour,rtc_time.min,rtc_time.sec);file->data=(char*)ds18b20_temp;file->len = strlen(ds18b20_temp);return 1; }return 0; }/*-----------------------------------------------------------------------------------*/ void httpd_fs_init(void) { #if HTTPD_FS_STATISTICSu16_t i;for(i = 0; i < HTTPD_FS_NUMFILES; i++) {count[i] = 0;} #endif /* HTTPD_FS_STATISTICS */ } /*-----------------------------------------------------------------------------------*/ #if HTTPD_FS_STATISTICS u16_t httpd_fs_count (char *name) {struct httpd_fsdata_file_noconst *f;u16_t i;i = 0;for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT;f != NULL;f = (struct httpd_fsdata_file_noconst *)f->next) {if(httpd_fs_strcmp(name, f->name) == 0) {return count[i];}++i;}return 0; } #endif /* HTTPD_FS_STATISTICS */ /*-----------------------------------------------------------------------------------*/

    ?

    總結(jié)

    以上是生活随笔為你收集整理的STM32+ENC28J60+UIP协议栈实现WEB服务器示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    www.成人久久| 看片一区二区三区 | 亚洲成人一区 | 天天操天天干天天摸 | 日韩午夜av电影 | 亚洲成aⅴ人在线观看 | 99精品久久精品一区二区 | 日韩a在线观看 | 国产精品原创av片国产免费 | 国产精品久久久久久久免费大片 | 久久国产电影 | 日韩免费视频在线观看 | 97综合视频 | 九九视频在线观看视频6 | 麻豆视频免费在线播放 | 亚洲国产精品电影 | 国产中文在线播放 | 免费看av片网站 | 欧美激情视频一区 | 日日干天天插 | 国产精品综合在线观看 | 色香网| 激情婷婷亚洲 | 欧美日韩伦理一区 | 99热这里只有精品在线观看 | 青草视频免费观看 | 美女在线国产 | 免费在线观看成人av | av片一区| 在线观看视频亚洲 | 91麻豆精品国产 | 精品福利网 | 国产又粗又猛又黄又爽 | 最近免费中文字幕大全高清10 | 伊人亚洲综合网 | 中文字幕在线观看第一区 | 国产一级免费在线观看 | 在线精品视频在线观看高清 | 亚洲黄色在线观看 | 亚州性色 | 国产91电影在线观看 | 久久久精品国产免费观看一区二区 | 国产精品原创视频 | 91在线在线观看 | 成人亚洲网 | 天天久久综合 | 日本3级在线观看 | 91精品一区二区三区久久久久久 | 婷婷综合av| 亚洲国产成人在线 | 成人h视频| 色小说av| 日韩一区二区三区免费视频 | 日韩一区二区三 | 国产精品一区二区三区免费看 | 天天搞天天干天天色 | 人人讲| 欧美一二区视频 | 久草精品在线播放 | 美女久久视频 | 国产在线91精品 | 久久久久亚洲天堂 | 中文字幕91视频 | 久久国产精品成人免费浪潮 | 久久在线免费 | 日日爱网址 | 国产亚洲精品久久久久久无几年桃 | 国产高清在线一区 | 亚洲3级| 天天插一插 | 国产一级淫片在线观看 | 久久久五月天 | 不卡在线一区 | 日韩欧美国产精品 | 久久久三级视频 | 国产精品九九久久久久久久 | 粉嫩av一区二区三区四区 | 免费合欢视频成人app | 99久久婷婷国产 | 久久深夜福利免费观看 | 久久久久久高潮国产精品视 | 国内视频1区 | 国产精品久久久久三级 | 国产成人专区 | www视频在线免费观看 | 天天干天天射天天爽 | 国产你懂的在线 | 日韩欧美一区二区三区黑寡妇 | 欧美另类交人妖 | 国产黄视频在线观看 | 99色免费| 99 久久久久 | 9ⅰ精品久久久久久久久中文字幕 | 久久好看免费视频 | 国产成人一区二区三区在线观看 | 97夜夜澡人人双人人人喊 | 在线观看的a站 | 特级西西444www大胆高清无视频 | 欧美午夜a| 中文字幕有码在线观看 | 日韩成人在线免费观看 | 国产女人40精品一区毛片视频 | 日韩免费看的电影 | 国产精品a久久 | 国产超碰在线 | 正在播放亚洲精品 | 日韩一级黄色大片 | av视屏在线 | 亚洲爱av| 一二区精品 | 久久精品黄 | 天天操天天干天天综合网 | 五月色婷 | 亚洲精区二区三区四区麻豆 | 美女视频黄频大全免费 | 天天草天天草 | 久久天天拍 | 黄www在线观看 | 波多野结衣视频一区 | 国产高清不卡在线 | 久久香蕉影视 | 免费黄色a网站 | 欧美国产日韩在线视频 | 亚洲激精日韩激精欧美精品 | 亚洲一区精品人人爽人人躁 | 中文字幕在线观看1 | 日韩和的一区二在线 | 国产亚洲综合性久久久影院 | 欧美精品一区二区蜜臀亚洲 | 91麻豆精品国产91久久久久久久久 | 国产精品亚洲片夜色在线 | 99精品视频免费在线观看 | 在线亚洲小视频 | 午夜骚影 | 久久免费av | 韩国av永久免费 | 国产视频一区在线播放 | 久久久久成人免费 | 国产xvideos免费视频播放 | 国产成人精品久久久久 | 91av免费观看 | 91福利试看 | 国产精品igao视频网网址 | 国产精品美女视频网站 | 92精品国产成人观看免费 | 激情视频网页 | 天天射狠狠干 | 黄色av一区 | 成人av在线一区二区 | 亚洲精品免费在线 | 久久爱资源网 | 国产美女精品 | 中文在线www| 狠狠狠色狠狠色综合 | 一区二区三区免费在线观看视频 | 精品一区精品二区高清 | 亚洲精品在线免费看 | 成年人国产在线观看 | 99精品视频在线免费观看 | 国产专区视频在线观看 | 国产福利精品在线观看 | 狠狠干成人综合网 | 四虎在线永久免费观看 | 视频一区二区精品 | 欧美黄色免费 | 久久精品男人的天堂 | 96久久欧美麻豆网站 | 国产 视频 久久 | 久久精品免费 | 国产亚洲va综合人人澡精品 | 久久视频一区 | 人人超碰人人 | 99九九99九九九视频精品 | 黄色大片日本免费大片 | 亚洲精品午夜aaa久久久 | 国产一级在线视频 | 国产日韩欧美在线 | 国产精品乱码久久久 | 国产精品视频久久久 | 国产色啪 | 久久国产精品免费 | 四虎在线免费观看视频 | 国产精品女人久久久 | 91av在线精品 | 国产精品国产三级国产 | 成人a在线观看高清电影 | 色婷婷播放 | 久久婷亚洲五月一区天天躁 | 国产精品福利在线观看 | 中文字幕av全部资源www中文字幕在线观看 | 最新99热 | 中文字幕在线观看免费观看 | 久久久18| 色综合天天爱 | 久久成 | 999久久国产 | 91精品人成在线观看 | 99热在线免费观看 | 国产精品综合av一区二区国产馆 | 午夜123 | av中文字幕在线电影 | 久久好看 | 免费网站看av片 | 国产精品久久久久久婷婷天堂 | 2019中文在线观看 | 免费看国产一级片 | 一级免费看| 97人人爽人人 | 午夜美女视频 | 天天射天天色天天干 | av成人在线观看 | 狠狠网 | 亚洲天堂色婷婷 | 丝袜美腿在线视频 | 国产手机在线视频 | 久久理论片 | 亚洲色图激情文学 | 2019中文字幕网站 | a天堂中文在线 | 亚洲国内在线 | 超碰97网站 | av成人免费 | 亚洲精品视频在线 | 激情综合网色播五月 | 免费视频二区 | 狠狠色噜噜狠狠狠合久 | 免费一级毛毛片 | 欧美日韩一区二区免费在线观看 | 美女视频网站久久 | 亚洲天堂精品视频 | 五月天欧美精品 | 91人网站| 欧洲激情综合 | 美女网站色在线观看 | 日韩特黄一级欧美毛片特黄 | 天天干夜夜夜 | 狠狠色噜噜狠狠狠合久 | 日韩在线观看视频在线 | www.99av | 欧美成年人在线观看 | 日韩黄色一级电影 | 日韩久久午夜一级啪啪 | 草草草影院 | 伊香蕉大综综综合久久啪 | 香蕉精品视频在线观看 | 精品免费国产一区二区三区四区 | 久久久久久久久久久久久国产精品 | 日韩欧美精品一区 | 91av观看 | 黄色片网站av | 亚洲精品视频在线播放 | 色久av | 欧美午夜精品久久久久 | 欧美另类调教 | 国产成人61精品免费看片 | 日韩日韩日韩日韩 | 欧洲视频一区 | 亚洲爱爱视频 | 亚洲视频1 | 综合影视| 欧美另类高清 | 二区三区毛片 | 久久久久久久久久久电影 | 久久无码精品一区二区三区 | 2019中文 | 99麻豆视频 | 91亚洲精品在线观看 | 精品一二三区 | 又爽又黄又无遮挡网站动态图 | 99精品一区二区三区 | 天天干天天干天天操 | 丁香花中文在线免费观看 | 国产精品免费一区二区 | 天天搞天天干天天色 | 在线小视频 | www色片 | 天天操天天干天天综合网 | 在线视频观看成人 | 91精品国自产在线偷拍蜜桃 | 久久久91精品国产一区二区三区 | 午夜精品在线看 | 国产视频午夜 | 精品视频免费播放 | 激情五月婷婷综合 | 精品欧美小视频在线观看 | 在线观看视频免费大全 | 91精品国产91久久久久 | 激情久久久 | 在线观看免费视频你懂的 | 国产精品四虎 | 日韩精品一二三 | 91精品视频在线播放 | 国产精品99视频 | 婷婷亚洲激情 | 久草在线视频免赞 | 天堂av观看 | 9久久精品 | 亚洲精品小视频 | 五月婷在线视频 | 日韩免费视频播放 | 日韩精品在线视频 | 99久久久久免费精品国产 | 国产视频在线观看一区二区 | 久草在线视频免赞 | 中文字幕av影院 | 久久9999久久免费精品国产 | 操操日日 | 中文在线| 日韩二区三区 | 国产精品人成电影在线观看 | www.成人精品| 97品白浆高清久久久久久 | 久热这里有精品 | 国产免费久久久久 | 99久久久免费视频 | 黄色三几片 | 涩av在线 | 国模精品一区二区三区 | 在线直播av | 亚洲精品在线一区二区三区 | 欧美成年网站 | 欧美十八 | 精品亚洲男同gayvideo网站 | 日韩电影在线看 | 视频成人永久免费视频 | 日韩高清免费在线 | 免费看国产黄色 | 最新91在线视频 | 99视频在线免费播放 | 婷婷视频在线播放 | 中国一级片在线观看 | 欧美一区二区视频97 | 西西www4444大胆视频 | 免费在线观看日韩视频 | 不卡中文字幕在线 | 2018亚洲男人天堂 | 麻豆视频在线 | 欧美激情视频在线免费观看 | 亚洲免费av观看 | 99久久精品国产一区二区三区 | 丁香婷婷亚洲 | 成人av日韩| 久久免费激情视频 | 久草综合在线观看 | 天天干亚洲 | 国产精品永久久久久久久www | 久久免视频| 欧美analxxxx | 美女视频久久黄 | 丁香av在线 | 亚洲国产欧美在线人成大黄瓜 | 久久久久久久久久国产精品 | 精品伦理一区二区三区 | 久久久久国产a免费观看rela | 91亚色视频 | 国产精品久久久久亚洲影视 | 人人插人人做 | 亚洲成人免费在线 | 久久艹艹 | 中文字幕刺激在线 | 久久久国产精品视频 | 中文字幕在线观看国产 | 国产中文字幕在线播放 | 很黄很黄的网站免费的 | 国产不卡精品视频 | 国产亚洲精品久久久久久久久久久久 | 国产成人一区二区在线观看 | 怡春院av | 国产精品久久久久久久久大全 | 五月天天色 | 天天爱av导航 | 人人澡人人澡人人 | 97国产精品亚洲精品 | 天天天干 | 欧美大香线蕉线伊人久久 | 香蕉视频在线网站 | 综合久久一本 | 娇妻呻吟一区二区三区 | 色av婷婷| 国产在线一区观看 | 成人在线免费视频 | 成年人免费在线播放 | 香蕉视频亚洲 | 天天干天天色2020 | www.99在线观看| 欧美精品一区二区蜜臀亚洲 | 91亚洲精品国产 | 一级黄色在线免费观看 | 91视视频在线直接观看在线看网页在线看 | 伊人开心激情 | 中文高清av | 九九视频在线播放 | 国产高清在线免费视频 | 天天爽天天射 | 色噜噜日韩精品欧美一区二区 | 国产精品久久久久久久久毛片 | 日本精品久久久一区二区三区 | 丁香九月激情综合 | 亚洲国产小视频在线观看 | 国产麻豆视频免费观看 | 精品亚洲一区二区 | 色婷婷综合久久久久中文字幕1 | 日韩精品视频免费在线观看 | 日韩在线高清免费视频 | 日日操夜 | 欧美美女视频在线观看 | 四虎在线影视 | 免费久久久 | 亚洲色影爱久久精品 | 亚洲国产成人在线观看 | 国产午夜精品理论片在线 | 麻豆国产露脸在线观看 | 亚洲精品视频在线观看免费视频 | 日韩欧美精品在线观看视频 | 日韩视频一区二区三区在线播放免费观看 | 激情动态 | av黄网站| 欧美小视频在线 | 中文字幕在线观看2018 | 久久久午夜影院 | 人人擦| 丁香六月网 | 天天操偷偷干 | 夜夜爱av| 精品二区久久 | 欧美日韩三级在线观看 | 国产精品午夜在线 | 亚洲最新av网址 | 精品国产乱码一区二区三区在线 | 精品亚洲va在线va天堂资源站 | 欧美国产高清 | 狠狠狠狠狠狠天天爱 | 91麻豆精品国产午夜天堂 | 中文字幕免费在线 | 最近更新好看的中文字幕 | 97人人爽人人 | 黄色大片入口 | 国产精品成人自产拍在线观看 | 91精品久久久久久综合乱菊 | 91精品啪啪 | 天天干天天天 | 808电影| 麻豆精品国产传媒 | 午夜123| 91热在线| 97成人在线免费视频 | 国产成人av在线影院 | 日韩影视大全 | 日韩美女av在线 | 欧美日韩国产网站 | 日韩日韩日韩日韩 | 中文字幕欧美日韩va免费视频 | 成人在线免费观看网站 | 狠狠插狠狠操 | 国产精品成人久久久久久久 | 在线观看av片 | 久久免费在线 | 亚洲午夜久久久久久久久 | 久久精品精品电影网 | 久久免费影院 | 国产午夜在线观看视频 | 天天躁日日躁狠狠 | 女人18毛片a级毛片一区二区 | 亚洲专区一二三 | 日韩av一区在线观看 | 久久精品99国产精品 | 91麻豆网 | 涩涩网站在线看 | 国产精品亚洲视频 | 精品国产91亚洲一区二区三区www | 国产精品黄色 | av成人黄色 | 久久国产精品一区二区三区四区 | 日韩在线一二三区 | 久久综合九色99 | 狠狠狠色丁香婷婷综合激情 | 国产一区二区不卡视频 | 91电影福利 | 少妇视频一区 | 亚洲国产精品成人va在线观看 | 欧美一级大片在线观看 | 在线观看网站你懂的 | www国产在线 | 成人国产一区 | 亚洲成人xxx | 国产精品久久9 | 91新人在线观看 | 成人精品国产免费网站 | 中文字幕在线观看免费高清电影 | 99免费精品 | 亚洲黄色av| 国产精品专区在线 | 国产亚洲精品美女 | 天天综合区| 中文字幕在线观看av | 天天色天天草天天射 | 激情丁香5月 | 天天综合天天综合 | 色资源中文字幕 | 在线视频 一区二区 | 四虎在线视频 | 久久久国产精品一区二区中文 | 国产精品免费视频网站 | 国产精品一区二区无线 | 亚洲天堂网在线观看视频 | 99热.com| 婷婷色在线播放 | av电影 一区二区 | 欧美精品久久久久久久免费 | 91在线看网站 | 久久免费黄色大片 | av中文字幕电影 | 在线观看av免费观看 | 欧美91片| 国产精品网址在线观看 | 欧美另类美少妇69xxxx | 六月色丁 | 精品国产一区二区在线 | 综合色中色 | 超碰在线人人艹 | 日韩毛片在线播放 | 国产中文视频 | 狠狠狠综合 | 久久综合婷婷国产二区高清 | 亚洲高清在线视频 | 操高跟美女 | 91亚瑟视频 | 亚洲国产日韩精品 | 色播激情五月 | 国产不卡av在线播放 | 亚洲人成人在线 | 国产做aⅴ在线视频播放 | 免费黄色特级片 | 免费精品在线视频 | 久久视频这里有久久精品视频11 | 国产精品免费久久久久影院仙踪林 | 天天久久夜夜 | 日一日干一干 | 日本mv大片欧洲mv大片 | 国内99视频 | 中文在线中文资源 | 99久久99久久精品免费 | 麻豆一精品传二传媒短视频 | 91尤物国产尤物福利在线播放 | 操少妇视频 | 国产a国产 | 亚洲午夜精品福利 | 亚洲国产精品500在线观看 | 成年人在线观看 | 一区二区三区日韩精品 | 欧美综合干 | 久久综合影视 | 韩国一区二区三区视频 | 国产精品免费小视频 | 精品一区二区三区四区在线 | 欧美91精品| 精品免费视频123区 午夜久久成人 | av电影在线免费观看 | 国产污视频在线观看 | 精品国内自产拍在线观看视频 | www.五月天激情 | 国产黄色精品在线观看 | 97国产精品亚洲精品 | 久久www免费视频 | 亚洲资源| 欧美日韩中文字幕视频 | 日韩色视频在线观看 | 91精品国产麻豆国产自产影视 | 欧美另类色图 | 久久国产精品小视频 | 中国美女一级看片 | 亚洲 欧美 91 | 韩国三级在线一区 | 韩国三级av在线 | 欧美韩国在线 | 免费国产在线视频 | 美女网色 | 国产视频2区| 亚洲成a人片77777潘金莲 | 在线观看中文 | 中文字幕有码在线观看 | 国产精品久久一区二区无卡 | 91av观看 | 久保带人 | 国产伦精品一区二区三区在线 | 米奇影视7777 | 色午夜 | 国产手机免费视频 | 美女av免费 | 国产精品成人自产拍在线观看 | 波多野结衣在线观看一区二区三区 | 国产91欧美 | 狠狠干激情 | 亚洲免费av一区二区 | 欧美在线观看禁18 | 国产中文字幕在线免费观看 | 国产成人一区二区三区 | 亚洲精品福利在线观看 | 久久久麻豆 | 久久国产露脸精品国产 | 亚洲一区二区91 | 免费视频色 | 免费看黄在线 | 婷婷综合激情 | 一区二区三区免费在线观看视频 | 999在线视频| 欧美淫视频 | 黄色av成人在线观看 | 国产精品ⅴa有声小说 | 欧美成人a在线 | 六月丁香在线视频 | 九九免费在线观看 | 少妇高潮流白浆在线观看 | 狠狠狠狠狠狠狠狠 | 日韩免费一区 | 久久久免费精品国产一区二区 | 久青草电影 | 日韩精品一区二区三区外面 | 激情综合网天天干 | av高清免费在线 | 久久久这里有精品 | 在线黄色国产 | 日韩视频欧美视频 | 中文字幕在线视频国产 | 国产精品美女久久久 | 亚洲精品小视频 | 丁香六月在线 | 国产视频999 | 国产福利91精品一区二区三区 | 中文乱幕日产无线码1区 | 热精品 | 天天操天天爽天天干 | 91福利视频免费观看 | 亚洲一区二区三区在线看 | 久久久久久久久久久久国产精品 | 日韩欧美一区二区三区视频 | 免费黄色特级片 | 最近更新好看的中文字幕 | 国产精品成人自产拍在线观看 | 国产 日韩 欧美 中文 在线播放 | 黄色影院在线免费观看 | www欧美日韩 | 一区二区三区韩国免费中文网站 | www.国产精品 | 天天亚洲综合 | 国产在线小视频 | 欧美亚洲国产精品久久高清浪潮 | 欧美日韩性视频在线 | 国产免费视频在线 | 国产黄色在线网站 | 麻豆视频免费在线观看 | 日韩在线小视频 | 蜜臀av性久久久久av蜜臀三区 | 日韩啪视频 | 五月婷婷激情六月 | 久久久五月天 | 麻豆视频免费版 | 国产精品嫩草影院9 | 黄色国产在线观看 | 国产精品日韩久久久久 | 99热在| 精品国产一区二区三区在线观看 | 久操视频在线免费看 | 日韩在线一区二区免费 | 成年人在线免费看视频 | 欧美日韩视频 | 国产69熟 | 日韩国产精品久久久久久亚洲 | 色鬼综合网 | 久久综合九色综合久久久精品综合 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲精品在线免费观看视频 | 中文资源在线播放 | 天天干,天天操 | 在线观看免费视频 | 日韩av综合网站 | 天天操天天干天天爱 | 精品高清美女精品国产区 | 四虎在线影视 | 国产成人精品一区一区一区 | 国产精品美女视频网站 | 免费看污网站 | 日本在线观看中文字幕 | 伊人黄色网 | 一区二区三区在线免费观看视频 | 九色精品在线 | 99久久日韩精品视频免费在线观看 | 欧美激情精品久久久久久变态 | 久久成年人视频 | 国产成人精品国内自产拍免费看 | 国产精品一区二区美女视频免费看 | 国产精品第一页在线 | www久| 91经典在线 | 精品久久久久久久久久岛国gif | 亚洲干视频在线观看 | 免费精品 | 午夜影视剧场 | 日韩在线观看电影 | 超碰在线日韩 | 亚洲视频免费 | 射综合网 | 婷婷久久综合九色综合 | 日韩精品免费一区二区在线观看 | 天天干天天拍 | 婷婷在线视频观看 | 欧美成人tv | 日本精品二区 | 欧美日韩免费观看一区二区三区 | 91视频高清完整版 | 激情偷乱人伦小说视频在线观看 | 国产精品日韩欧美 | 久久久久免费 | 81国产精品久久久久久久久久 | 国产原创中文在线 | 久久久不卡影院 | 中文字幕 国产 一区 | 成年人视频在线免费 | 日韩精品中文字幕在线观看 | 国产亚洲视频系列 | 久久人人艹| 91精品国产入口 | 菠萝菠萝在线精品视频 | 亚洲男男gaygay无套同网址 | 免费在线h| 亚洲人精品午夜 | 日本乱视频 | 九九久久婷婷 | 九九在线视频免费观看 | 国产在线自 | 一区在线播放 | 成人高清在线 | 一区二区视频在线播放 | 99视频在线| 天堂av在线中文在线 | 色操插 | 色999精品| 国产亲近乱来精品 | 黄色av网站在线免费观看 | 91香蕉视频| 日日天天干 | 国产成人精品久久久久 | 综合天天色 | 特黄特色特刺激视频免费播放 | 成人cosplay福利网站 | 亚洲成人二区 | 久久久久国产精品午夜一区 | 蜜臀av一区 | 六月丁香激情综合色啪小说 | 91看片淫黄大片91 | 欧美日韩免费一区二区 | 国产精品久久久久永久免费观看 | 麻花豆传媒mv在线观看网站 | 国产91精品一区二区麻豆亚洲 | 中文在线字幕免费观看 | 亚洲激情视频在线观看 | 成人av网站在线播放 | 夜夜操网站 | 永久免费毛片 | 99精品欧美一区二区三区黑人哦 | 精品一区精品二区高清 | 久久网站最新地址 | 日本久久片| 日韩精品短视频 | 久久成人国产精品入口 | 成人羞羞视频在线观看免费 | 偷拍精偷拍精品欧洲亚洲网站 | 亚洲砖区区免费 | 美女视频是黄的免费观看 | 毛片888 | 香蕉久久国产 | 亚洲一二视频 | 精品免费一区二区三区 | 美女福利视频一区二区 | 日本aa在线| 你操综合| 97国产精品视频 | 免费看黄20分钟 | 精品一区二区三区在线播放 | 日韩亚洲在线视频 | 国产成a人亚洲精v品在线观看 | 亚洲精品午夜久久久久久久 | 丁香六月婷婷开心 | 狠狠干狠狠插 | 69视频国产 | 亚洲精品三级 | 国产精品国产精品 | 天堂麻豆| 免费看黄色毛片 | 久久婷亚洲五月一区天天躁 | 国产精品国内免费一区二区三区 | 国产中文字幕第一页 | 伊人午夜 | 91丨九色丨勾搭 | 国产福利一区在线观看 | 久久福利 | 欧美日韩一区二区在线观看 | 天天干婷婷 | 黄色大片入口 | 91精彩视频| 日本久草电影 | 国产精品久久久 | 国产成人精品亚洲精品 | 狠狠搞,com | 成人app在线免费观看 | 少妇bbb | 午夜精品成人一区二区三区 | 亚洲精品国久久99热 | 欧美一区二区在线看 | 国产精品久久久久久久久久久久午 | 国产精品原创av片国产免费 | 免费成人av电影 | 日韩欧美电影网 | 97免费视频在线播放 | 综合久久网站 | 国产一二区在线观看 | 狠狠色丁香婷婷综合欧美 | 欧美在线久久 | 国产一区福利在线 | 久久成人一区二区 | 日韩午夜在线播放 | 久久亚洲影视 | 久久99精品久久久久久三级 | 国产女v资源在线观看 | 成人动漫视频在线 | 日韩中文字幕在线观看 | 九九av | 玖玖爱在线观看 | 偷拍视频一区 | 日韩在线网址 | 亚洲一级黄色 | 精品视频亚洲 | 日韩视频区| 91av在线视频免费观看 | 国产精品久久久久久久久久白浆 | 国产免费观看久久黄 | 91精品一区二区三区蜜桃 | 亚洲精品一区二区三区在线观看 | 国产亚洲精品久久久久久久久久久久 | 337p西西人体大胆瓣开下部 | 久久九九久久九九 | 日韩欧美综合在线视频 | 久久成人麻豆午夜电影 | 97超碰国产精品女人人人爽 | 国产一区在线视频 | 欧美日韩国产色综合一二三四 | 婷婷综合国产 | 婷婷在线综合 | 日本久久免费电影 | 国产在线97 | 午夜性色 | 亚洲爱av| 在线黄av | 亚洲视频1区2区 | 天天干天天怕 | 国产永久网站 | 久久天堂精品视频 | 久久综合久久综合这里只有精品 | 在线免费黄色 | 人人插人人爱 | 一级黄色在线免费观看 | 182午夜在线观看 | 中文字幕在线看视频国产 | 日韩超碰 | 日日弄天天弄美女bbbb | 天天操狠狠操网站 | 久久久久久久久久久久电影 | 成人h在线观看 | 五月激情av| 五月天激情婷婷 | 三级av网| 日韩av在线资源 | 一区二区三区四区免费视频 | 久久爱影视i | 九九热免费在线视频 | 伊人五月天婷婷 | 国产福利网站 | 久久怡红院 | 激情网在线视频 | 欧美日韩高清国产 | 激情五月婷婷网 | 九九欧美视频 | 天天操天天操一操 | 国产精品毛片久久久久久久 | 成在线播放| 91精品亚洲影视在线观看 | 韩国av一区二区三区 | 日韩成人邪恶影片 | 久久国产视频网站 | 一区精品久久 | av综合网址| av 一区二区三区四区 | 99久久久| 天天干天天拍天天操天天拍 | 高清在线一区二区 | 日韩女同av| 成人蜜桃 | 日韩免费在线网站 | 夜夜看av | 午夜久久 | 欧美日韩国产二区 | 婷婷四房综合激情五月 | 成人在线超碰 | 激情av在线播放 | 亚洲一区二区三区精品在线观看 | 欧美激情综合色综合啪啪五月 | 永久免费视频国产 | av电影 一区二区 | 国产精品久久久久久久久蜜臀 | 中文永久字幕 | 成年人在线电影 | 91人网站 | 日本在线观看黄色 | 最新中文字幕在线观看视频 | 国产一级免费在线 | av在线播放国产 | 亚洲天天草 | 国产亚洲婷婷免费 | 麻豆免费视频观看 | 天堂网一区二区三区 | 久久久久久久久久影院 | 亚洲精品午夜久久久久久久 | 久久亚洲精品国产亚洲老地址 | 欧美日韩视频一区二区三区 | 视频在线日韩 | 高清久久久久久 | 国产一级视频在线免费观看 | 韩国视频一区二区三区 | 中文字幕色在线 | 日本精品一区二区在线观看 | 99爱这里只有精品 | 日韩免费看的电影 | 国产午夜精品一区二区三区 | 国产精品一区二区精品视频免费看 | 91亚洲精品国产 | 在线观看91精品视频 | 日韩videos | 成人手机在线视频 | 综合久久影院 | 欧美a级成人淫片免费看 | 一区二区三区免费看 | 最新av观看 | 麻豆免费在线播放 | 日韩精品在线视频 | 国产毛片aaa | av网站在线观看免费 | 精品国产123 | 99热最新精品| 国产黑丝一区二区三区 | 天天曰天天爽 | 久久免费在线观看 | 国产精品久久久影视 | 91中文字幕永久在线 | 亚洲国产精品影院 | 九九视频这里只有精品 | 国产精品一区二区免费看 | 曰韩精品 | 日韩欧美在线免费 | 久久久久久久亚洲精品 | 视频在线国产 | 国产一区二区三区四区大秀 | 久久久久 免费视频 | 91在线一区 | 免费国产视频 | 9999在线视频 | 在线你懂的视频 | 日本二区三区在线 | 日韩免费中文字幕 | 国产在线观看免费av | 午夜视频一区二区三区 | 成人h视频 | 国产一区免费 | 成人在线视频在线观看 | 日韩精品久久一区二区 | 天天色天天干天天 | 成人黄色电影在线播放 | 在线观看视频黄 | 国产理论片在线观看 | 手机在线永久免费观看av片 | 中文字幕二区三区 | 99久久99热这里只有精品 | 日本久久中文字幕 | 中文字幕在线成人 | 欧美激情视频一区二区三区免费 | 99国产视频在线 | 精品9999| 国产精品观看视频 | 香蕉影院在线 | 中文字幕精品在线 | 日韩在线视频线视频免费网站 | 婷婷5月色 | 中文字幕一区二 | 麻豆影视在线免费观看 | 婷婷夜夜 | 青青草国产在线 | 一区二区三区观看 | 国产一区二区三区在线免费观看 | 免费v片|