;++++++++++++++++++++++++++++++++++++++++++++++ ; 功能介紹 ;++++++++++++++++++++++++++++++++++++++++++++++ ; 1. 基于UDP協議的數據交換 ; 2. 通過LED屏顯示郵件 ; 3. ARP應答 ; 4. Ping應答 ; ; 定義本機的IP和MAC地址 ; IP 202.96.170.165 IP1 EQU 202 IP2 EQU 96 IP3 EQU 170 IP4 EQU 165 ; ; MAC 01-23-45-67-89-0A MAADR0_WORD EQU 01H MAADR1_WORD EQU 23H MAADR2_WORD EQU 45H MAADR3_WORD EQU 67H MAADR4_WORD EQU 89H MAADR5_WORD EQU 0AH ; ; 各個寄存器的地址 MACON1_ADDR EQU 40H;MAC控制寄存器MACON1地址 MACON2_ADDR EQU 41H;MAC控制寄存器MACON2地址 MACON3_ADDR EQU 42H;MAC控制寄存器MACON3地址 MABBIPG_ADDR EQU 44H;背對背包間間隔寄存器MABBIPG地址 MAIPGL_ADDR EQU 46H;非背對背包間間隔寄存器低字節MAIPGL地址 EIE_ADDR EQU 5BH;以太網中斷允許寄存器EIE地址 ESTAT_ADDR EQU 5DH;以太網中斷允許寄存器ESTAT地址 ECON2_ADDR EQU 5Eh;以太網控制寄存器ECON2地址 ECON1_ADDR EQU 5Fh;以太網控制寄存器ECON1地址 ETXSTL_ADDR EQU 04H;發送緩沖器起始地址ERXSTL ETXSTH_ADDR EQU 05H;發送緩沖器起始地址ERXSTH ETXNDL_ADDR EQU 06H;發送緩沖器結束地址ERXNDL ETXNDH_ADDR EQU 07H;發送緩沖器結束地址ERXNDH MAADR1_ADDR EQU 00H;MAC地址 MAADR0_ADDR EQU 01H;MAC地址 MAADR3_ADDR EQU 02H;MAC地址 MAADR2_ADDR EQU 03H;MAC地址 MAADR5_ADDR EQU 04H;MAC地址 MAADR4_ADDR EQU 05H;MAC地址 ; ; 定義各寄存器的值 ECON1_WORD EQU 00000110B;通過當前過濾器的數據包?被寫入接收緩沖器,SPI EIE_WORD EQU 11000000B;以太網中斷允許寄存器EIE控制字,允許中斷事件驅動 MACON2_WORD EQU 00000000B;使MAC退出複位狀? MACON1_WORD EQU 00000001B;允許MAC 接收數據包 MACON3_WORD EQU 11110111B;用0 填充所有短幀至64 字節長,并追加一個有效的CRC MABBIPG_WORD EQU 15H ;寄存器設置?15h MAIPGL_WORD EQU 12H SPSTA EQU 03H ; ;發送數據包時的報頭 PACKET_CTLWORD EQU 00001110B;包控制字節格式字 ; ; 設置51中的一些參數 ; 設置堆棧 SP_BASE EQU 60H ; ; 設置SPI控制寄存器控制字 SPCON_WORD EQU 01010110B; NextPtL EQU 08H NextPtH EQU 09H ; ; 接收狀?向量 pktLenL EQU 0AH pktLenH EQU 0BH status2 EQU 0CH status3 EQU 0EH ; ; 設置以太網幀的有關地址及偏移量 PacketRAM EQU 00H ; 放置幀起始位置0000H ; ; 設置以太網幀相關字段 ; 幀目的地址 pktDest0H EQU 00H pktDest0L EQU 01H pktDest1H EQU 02H pktDest1L EQU 03H pktDest2H EQU 04H pktDest2L EQU 05H ; ; 幀的源地址 pktSrc0H EQU 06H pktSrc0L EQU 07H pktSrc1H EQU 08H pktSrc1L EQU 09H pktSrc2H EQU 0AH pktSrc2L EQU 0BH ; ; 幀類型 pktTypeH EQU 0CH pktTypeL EQU 0DH ; ; ARP部分 ; 硬件類型字段,0001H表示10M以太網 arp_hwtype EQU 0EH ; 協議類型字段,0806H表示ARP協議 arp_ptype EQU 10H ; 硬件地址長度,應?6 arp_hwlen EQU 12H ; 協議地址長度,應?4 arp_prlen EQU 13H ; 操作碼字段,ARP請求?0001H,ARP應答?0002H arp_op EQU 14H ; 發送端硬件地址,應?6字節 arp_sha EQU 16H ; 發送端協議地址,應?4字節 arp_spa EQU 1CH ; 接收端硬件地址,應?6字節 arp_tha EQU 20H ; 接收端協議地址,應?4字節 arp_tpa EQU 26H ; ; IP部分 ; 版本字段?容?4,IP首部長度應?14H ip_VerLen EQU 0EH ; TOS服務類型字段 ip_TOS EQU 0FH ; 總長度字段 ip_Len EQU 10H ; ?識字段 ip_ID EQU 12H ; 段偏移量及?志位 ip_Fragoff EQU 14H ; TTL生存時間字段 ip_ttl EQU 16H ; 協議類型:01H?ICMP報文,11H?UDP報文 ip_proto EQU 17H ; 校驗和字段 ip_cksum EQU 18H ; 源IP地址,4字節 ip_src EQU 1AH ; 目的IP地址,4字節 ip_dst EQU 1EH ; 數據段 ip_data EQU 22H ; ; ICMP部分 ; ICMP類型字段,00H?回顯應答,08H?回顯請求 ic_type EQU ip_data ; ICMP代碼字段,應?0 ic_code EQU ic_type+1 ; ICMP檢驗和 ic_cksum EQU ic_code+1 ; ICMP回顯?識字段 ic_id EQU ic_cksum+2 ; ICMP回顯序列?字段 ic_seq EQU ic_id+2 ; ; UDP部分 ; 源端口字段 u_src EQU ip_data ; 目的端口字段 u_dst EQU u_src+2 ; UDP總長度 u_len EQU u_dst+2 ; ; IP類型轉換表 IPT_ICMP EQU 01H IPT_UDP EQU 11H ; ;*************************************** ; 程序開始 ;*************************************** ORG 0000H LJMP Start ORG 0003H LJMP INT0 ;SPI初始化 Start: MOV SCON,#SPCON_WORD LCALL Delay ;初始化ENC28J60 Init: LCALL InitE60 ; 設置堆棧指針 SpSet: MOV A,#SP_BASE MOV SPDAT,A SETB EA SETB EX0 SETB IT0 ;等待中斷 Wait: AJMP Wait ;************************************ ; ENC28J60初始化 ;************************************ ;檢測ESTAT.CLKRDY位 InitE60:MOV A,#ESTAT_ADDR MOV SPDAT,A LCALL ChkSPIF LCALL Delay MOV SPDAT,A LCALL ChkSPIF MOV A,SPDAT ANL A,#01H JZ InitE60 ;設置以太網中斷允許寄存器EIE MOV A,#EIE_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#EIE_WORD MOV SPDAT,A LCALL ChkSPIF ;設置以太網控制寄存器ECON1 MOV A,#ECON1_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#ECON1_WORD MOV SPDAT,A LCALL ChkSPIF ;設置MAC 控制寄存器MACON2 MOV A,#MACON2_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MACON2_WORD MOV SPDAT,A LCALL ChkSPIF ;設置MAC 控制寄存器MACON1 MOV A,#MACON1_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MACON1_WORD MOV SPDAT,A LCALL ChkSPIF ;設置MAC 控制寄存器MACON3 MOV A,#MACON3_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MACON3_WORD MOV SPDAT,A LCALL ChkSPIF ;設置MAC 背對背包間間隔寄存器MABBIPG MOV A,#MABBIPG_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MABBIPG_WORD MOV SPDAT,A LCALL ChkSPIF ;設置非背對背包間間隔寄存器的低字節MAIPGL MOV A,#MAIPGL_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAIPGL_WORD MOV SPDAT,A LCALL ChkSPIF ;寫MAC地址 ;設置以太網控制寄存器ECON1 MOV A,#ECON1_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#00000111B MOV SPDAT,A LCALL ChkSPIF ;配置MAC地址 MOV A,#MAADR0_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR0_WORD MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR1_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR1_WORD MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR2_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR2_WORD MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR3_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR3_WORD MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR5_ADDR MOV SPDAT,A LCALL ChkSPIF MOV A,#MAADR5_WORD MOV SPDAT,A LCALL ChkSPIF RET ;************************************ ; 中斷服務程序(接收數據包、顯示郵件?容) ;************************************ INT0: CLR EA MOV A,#00111010B LCALL Delay MOV SPDAT,A LCALL ChkSPIF MOV NextPtL,A MOV SPDAT,A LCALL ChkSPIF MOV NextPtH,A MOV SPDAT,A LCALL ChkSPIF MOV pktLenL,A MOV SPDAT,A LCALL ChkSPIF MOV pktLenH,A MOV SPDAT,A LCALL ChkSPIF MOV status2,A MOV SPDAT,A LCALL ChkSPIF ; MOV status3,A ; MOV A,status2 ; ANL A,#80H ; JZ Init RET ;************************************ ; 檢測SPI傳輸是否完成 ;************************************ ChkSPIF:MOV A,#10000000B ANL A,SPSTA Judge: JZ Judge MOV SPSTA,#0 RET ;************************************ ; 延時模塊 ;************************************ Delay: MOV R0,#5 Loop1: MOV R1,#200 Loop2: MOV R2,#200 Loop3: NOP NOP DJNZ R2,Loop3 DJNZ R1,Loop2 DJNZ R0,Loop1 RET