⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 供暖控制_以太网接口.s43

📁 用MSP430汇编写的简单IP协议程序
💻 S43
📖 第 1 页 / 共 5 页
字号:
        RET

;******************************************************************************
;subroutine:  ProcessARP_Request
;******************************************************************************
ProcessARP_Request
        MOV     #MACDestinationUDS,R14
        MOV     #0FFFFH,0(R14)                                  ;广播地址
        MOV     #0FFFFH,2(R14)
        MOV     #0FFFFH,4(R14)
        MOV     &RAMModelMAC6,6(R14)                            ;这里使用无线ID作为网卡MAC地址
        MOV     &RAMModelMAC4,8(R14)
        MOV     &RAMModelMAC2,10(R14)                
        MOV     #MACType_ARP,&MACType

        MOV     #0100H,&ARP_HardwareType                        ;硬件类为0001H表示以太网地址
        MOV     #MACType_IP,&ARP_ProtocolType                   ;这里应该写IP的类型而不是ARP的类型
        MOV.B   #06H,&ARP_HardwareLength                        ;对于以太网IP地址的APR请求合应答来说
        MOV.B   #04H,&ARP_ProtocolLength                        ;硬件地址长度和协议地址长度分别为06H和04H
        MOV     #0100H,&ARP_OP                                  ;ARP请求帧该值为0001H                                                    
        MOV     #ARP_TransmitUDS,R14                 
        MOV     &RAMModelMAC6,0(R14)                            ;ARP_TransmitUDS
        MOV     &RAMModelMAC4,2(R14)
        MOV     &RAMModelMAC2,4(R14)
        MOV     &RAMSelfIP4,6(R14)                              ;ARP_TransmitIP
        MOV     &RAMSelfIP2,8(R14)
        MOV     #00H,10(R14)                                    ;ARP_ReceiveUDS
        MOV     #00H,12(R14)
        MOV     #00H,14(R14)              
;在实际应用过程中,这里应该根据子网掩码判断目的IP是不是在子网中,如果在直接发送,
;如果是子网以外的设备,目的IP应该填写为网关IP地址。         
        MOV     &RAMNetGateIP4,16(R14)                          ;ARP_ReceiveIP
        MOV     &RAMNetGateIP2,18(R14) 
        
        MOV     #EthernetFrameData,R9
        MOV     #2AH,R8
        CALL    #WriteAX88796Frame
        RET

;******************************************************************************
;subroutine:  ProcessICM_PingAnswer
;******************************************************************************
ProcessICMP_PingAnswer      
        MOV     &ICMP_IP_ByteLength,R4
        SWPB    R4
        CMP     #120,R4                                          ;内存只开了150个字节所以有这个限制
        JHS     PingDataTooLong
        MOV     #MACDestinationUDS,R5
        MOV     #MACResourceUDS,R4
        MOV     @R4+,0(R5)
        MOV     @R4+,2(R5)
        MOV     @R4+,4(R5)
        MOV     #MACResourceUDS,R4
        MOV     &RAMModelMAC6,0(R4)                           ;这里使用无线ID作为网卡MAC地址
        MOV     &RAMModelMAC4,2(R4)
        MOV     &RAMModelMAC2,4(R4)                
        MOV     #ICMP_IP_ResourceIP,R5
        MOV     #ICMP_IP_DestinationIP,R4
        MOV     @R5+,0(R4)
        MOV     @R5+,2(R4)  
        MOV     #ICMP_IP_ResourceIP,R5        
        MOV     &RAMSelfIP4,0(R5)
        MOV     &RAMSelfIP2,2(R5)

        CLR     &CheckSum_TCPUDP
        CLR     &CheckSumTemp
        MOV.B   &ICMP_IP_VarAndLength,R5                        ;这个算法针对有IP选项的首部
        AND     #000FH,R5
        RLA     R5                                              ;IP首部长度以4个字节位单位
        RLA     R5                                              
        MOV     &ICMP_IP_ByteLength,R4
        SWPB    R4
        SUB     R5,R4                                           
        TST     R4
        JZ      ICMPNothingData        
;Ping应答的时候ICMP类型域和代码域都是00H,并且要求设置校验和为零
;因此计算直接从ICMP_Data开始
        MOV.B   #00H,&ICMP_MessageType                          ;Ping应答时类型为00H
        MOV     #ICMP_Data,R6                                   ;这两个字节已经被读出了
        MOV.B   @R6+,&CheckSum_TCPUDPHigh
        MOV.B   @R6+,&CheckSum_TCPUDPLow
        ADD.B   @R6+,&CheckSum_TCPUDPHigh
        ADC     &CheckSumTemp
        ADD.B   @R6+,&CheckSum_TCPUDPLow
        ADC     &CheckSum_TCPUDPHigh
        ADC     &CheckSumTemp        
        SUB     #08H,R4                                         ;前8个字节已经被读出了
        TST     R4
        JZ      ICMPNothingData        

        ADD     #26,R5                                          ;26=以太网层(18)+在IP首部以后多读出的8个字节
        ReadSomeByte
        
        MOV     #ICMP_Data,R6
        INCD    R6                                              ;数据的前4个字节已经被读走了         
        INCD    R6
ReadICMPData_CheckSum
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R6)
        ADD.B   R14,&CheckSum_TCPUDPHigh
        ADC     &CheckSumTemp
        INC     R6
        DEC     R4        
        JZ      ICMPDataEnd
        MOV     #10H,R15                     
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R6)
        ADD.B   R14,&CheckSum_TCPUDPLow
        ADC.B   &CheckSum_TCPUDPHigh
        ADC     &CheckSumTemp
        INC     R6
        DEC     R4
        JNZ     ReadICMPData_CheckSum                    
ICMPDataEnd                                        
        SWPB    &CheckSum_TCPUDP
        ADD     &CheckSumTemp,&CheckSum_TCPUDP
        ADC     &CheckSum_TCPUDP                                ;防止加完之后又有进位
        SWPB    &CheckSum_TCPUDP
        XOR     #0FFFFH,&CheckSum_TCPUDP
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
;在这里可以用算出的结果在做一个简单的结算与接收的校验和比较
;判断是否正确
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ICMPNothingData
        CALL    #RingPrepare
        MOV     &CheckSum_TCPUDP,&ICMP_MessageCheckSum
        MOV     #EthernetFrameData,R9
        MOV     &ICMP_IP_ByteLength,R8
        SWPB    R8
        ADD     #14,R8                                          ;18=以太网首部+CRC校验 
        CALL    #WriteAX88796Frame
        CLR     R4
        RET 
PingDataTooLong
        MOV     #0CCH,R4        
        RET

;******************************************************************************
;subroutine:  UDPFrame_Receive
;******************************************************************************

;注册到那个网关就只收那个网关的命令


UDPFrame_Receive                           
        CMP     #MyWorkPort,&ICMP_MessageCheckSum              ;判断端口号是否正确
        JZ      GoodPort
        CMP     #MyConfigPort,&ICMP_MessageCheckSum                
        JNZ     JumpUDPDataEnd
GoodPort
        MOV     &UDP_Rec_Length,R4
        SWPB    R4
        SUB.B   #08H,R4                                         ;UDP首部长度
        MOV     R4,&IP_RS232_FrameLength        
        INC     &IP_RS232_FrameLength                           ;校验和的一个字节
        MOV.B   &ICMP_IP_VarAndLength,R5                        ;这个算法针对有IP选项的首部
        AND     #000FH,R5
        RLA     R5                                              ;IP首部长度以4个字节位单位
        RLA     R5                                              
        
        ADD     #26,R5                                          ;26=以太网层(18)+在IP首部以后多读出的8个字节
        ReadSomeByte
        
        MOV     #IPToRS232StartData,R6                       ;这里没有做校验和判断
ReadUDPData
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R6)
        INC     R6
        DEC     R4        
        JNZ     ReadUDPData                    
        CALL    #RingPrepare                   

        MOV     #IPToRS232StartData,R7
        CMP     #CharacterWord1,0(R7)
        JNZ     NotEnrol_UDP
        CMP     #CharacterWord2,2(R7)
        JNZ     NotEnrol_UDP
        CMP     &RAMModelMAC6,8(R7)
        JNZ     JumpUDPDataEnd
        CMP     &RAMModelMAC4,10(R7)
        JNZ     JumpUDPDataEnd
        CMP     &RAMModelMAC2,12(R7)
        JNZ     JumpUDPDataEnd
        CMP     #0210H,4(R7)                                    ;交换这个位置是为了使程序执行更快一些,这样只                                                                
        JNZ     NotNetGateAnswer                                ;要地址不对后面就不接收了
        CMP     &RandomData1,6(R7)
        JNZ     JumpUDPDataEnd        
        BR      #IASHMPOffer        
NotNetGateAnswer
        CMP     #0410H,4(R7)
        JNZ     NotNetGateSuccess
        CMP     &RandomData1,6(R7)
        JNZ     JumpUDPDataEnd        
        BR      #IASHMPSuccess    
NotNetGateSuccess
        CMP     #0610H,4(R7)
        JNZ     JumpUDPDataEnd
        BR      #IASHMPMust

JumpUDPDataEnd
        BR      #UDPDataEnd

NotEnrol_UDP           
        CMP     #1980H,0(R7)
        JNZ     JumpUDPDataEnd
        CMP     #8019H,2(R7)
        JNZ     JumpUDPDataEnd
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;处理网关控制命令
        CMP.B   #01H,&IP_RS232_FrameType            ;控制帧
        JZ      IsControlFrame
        CMP.B   #10H,&IP_RS232_FrameType                 ;查询未注册设备
        JZ      NetGateQueryDevice
        CMP.B   #12H,&IP_RS232_FrameType                 ;注册设备
        JZ      NetGateACKDeviceLoginOk
        CMP.B   #14H,&IP_RS232_FrameType                 ;申请下载设备文件
        JZ      ApplyDeviceFile             
        CMP.B   #1AH,&IP_RS232_FrameType                 ;获取设备地址
        JZ      SearchDeviceID
        CMP.B   #16H,&IP_RS232_FrameType                 ;按UDS删除设备
        JZ      ToPurgeDevice     
        CMP.B   #17H,&IP_RS232_FrameType                 ;按串号删除设备
        JZ      PurgeDeviceBySN     
        CMP.B   #09H,&IP_RS232_FrameType
        JZ      HeatStopAlarm
        CMP.B   #07H,&IP_RS232_FrameType            ;读去数据
        JZ      IsReadDataFrame                 
;;      CMP.B   #0AH,&IP_RS232_FrameType            ;下载菜单
;;      JZ      IsDownloadMenuFrame
        JMP     NothingGateNetCommand

HeatStopAlarm
        BIS     #StopAlarmBit
        RET
        
IsControlFrame 
        BIS     #TemperatureAlarmBit
        CMP.B   #4DH,&IP_RS232_FrameData                 
        JNZ     HaveDataCommand
        CMP.B   #01H,&(IP_RS232_FrameData+1)                 ;查询命令
        JZ      SearchStateCommand  
        CMP.B   #02H,&(IP_RS232_FrameData+1)                 ;开启供暖系统
        JZ      StartHeatCommand                             
        CMP.B   #03H,&(IP_RS232_FrameData+1)                 ;关闭供暖系统
        JZ      StopHeatCommand
        JMP     NothingGateNetCommand

HaveDataCommand        
        CMP.B   #5DH,&IP_RS232_FrameData
        JNZ     NothingGateNetCommand
        CMP.B   #01H,&(IP_RS232_FrameData+1)                 ;设置温度
        JZ      ConfigTemperatureCommand
        CMP.B   #02H,&(IP_RS232_FrameData+1)                 ;设置开启时间
        JZ      ConfigTimeOnCommand
        CMP.B   #03H,&(IP_RS232_FrameData+1)                 ;设置停机时间
        JZ      ConfigTimeOffCommand
        JMP     NothingGateNetCommand

StartHeatCommand
        MOV     #StartSystemCommand,&StateWorks
        JMP     ComeBackData
StopHeatCommand
        BIC.B   #ControlHeat
        MOV     #StopSystemCommand,&StateWorks
        JMP     ComeBackData        
ConfigTemperatureCommand
        MOV.B   &(IP_RS232_FrameData+2),&ControlTemperatureHigh
        MOV.B   &(IP_RS232_FrameData+3),&ControlTemperatureLow
        BIS     #StoreStateBit
        JMP     ComeBackData 
ConfigTimeOnCommand
        MOV.B   &(IP_RS232_FrameData+2),&TimeOnHigh
        MOV.B   &(IP_RS232_FrameData+3),&TimeOnLow
;;      BIS     #StoreStateBit
        JMP     ComeBackData 
ConfigTimeOffCommand
        MOV.B   &(IP_RS232_FrameData+2),&TimeOffHigh
        MOV.B   &(IP_RS232_FrameData+3),&TimeOffLow
;;      BIS     #StoreStateBit

SearchStateCommand
IsReadDataFrame
ComeBackData
        MOV     #22,&RS232_IP_FrameLength  
        ADD     #12,&RS232_IP_FrameLength                ;加上12个字节的特征数据和保留字
        MOV     #RS232ToIPStartData,R5 
        MOV     #1980H,0(R5)                            ;数据特征字
        MOV     #8019H,2(R5)
        CLR     4(R5)
        CLR     6(R5)
        CLR     8(R5)
        CLR     10(R5)    
        MOV.B   &SourceID6,12(R5)
        MOV.B   &SourceID5,13(R5)
        MOV.B   &SourceID4,14(R5)
        MOV.B   &SourceID3,15(R5)
        MOV.B   &SourceID2,16(R5)
        MOV.B   &SourceID1,17(R5)
        MOV.B   #00H,&RS232_IP_FrameControl
        MOV.B   #02H,&RS232_IP_FrameType
        MOV.B   #6DH,20(R5)
        MOV.B   #01H,21(R5)
        MOV.B   &MeasureTemperatureHigh,22(R5)
        MOV.B   &MeasureTemperatureLow,23(R5)
        MOV.B   &ControlTemperatureHigh,23(R5)
        MOV.B   &ControlTemperatureLow,25(R5) 
        MOV.B   &TimeOffHigh,26(R5)
        MOV.B   &TimeOffLow,27(R5)
        MOV.B   &TimeOnHigh,28(R5)
        MOV.B   &TimeOnLow,29(R5)
        MOV.B   &TimeNowHigh,30(R5)
        MOV.B   &TimeNowLow,31(R5)
        MOV.B   &StateWorksHigh,32(R5)
        MOV.B   &StateWorksLow,33(R5) 
        CALL    #RS232CheckSum
        BIS     #RS232BufferFull
NothingGateNetCommand           
        RET
;----------------------------------------------
NetGateQueryDevice                        ;查询未注册设备
;        BIT     #RAMSourceIDFlag             ?????
;        JC      UDPDataEnd                   ?????
        MOV     #IP_RS232_FrameData,R5 
;;      CMP     @R5+,&SeriesNumber3                  ;如果收到得设备SN于本设备SN不符,
;;      JNZ     UDPDataEnd                     ;不对网关查询作出回应。
        CMP     @R5+,&SeriesNumber2
        JNZ     UDPDataEnd                              
        CMP     @R5+,&SeriesNumber1
        JNZ     UDPDataEnd                                                      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -