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

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

📁 用MSP430汇编写的简单IP协议程序
💻 S43
📖 第 1 页 / 共 5 页
字号:
        MOV.B   &SourceID1,17(R5)
        MOV.B   #00H,&RS232_IP_FrameControl
        MOV.B   #02H,&RS232_IP_FrameType
        MOV.B   #0FH,20(R5)
        MOV.B   #5AH,21(R5)
        MOV.B   &TemperatureAlarmHigh,22(R5)
        MOV.B   &TemperatureAlarmLow,23(R5) 
        CALL    #RS232CheckSum
        BIS     #RS232BufferFull
                      
GateNetStopAlarm
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
        BIT     #StartEnrolBit
        JNC     Enrol_The_Second
Enrol_The_First
;;        BIS     #RS232BufferFull                                ;模块发起注册                                                
        CLR     &LivingTimeCounter                              ;注册的时候关掉生存时间汇报
               
        MOV     #24,&RS232_IP_FrameLength
        MOV     #RS232ToIPStartData,R7
        MOV     #CharacterWord1,0(R7)                           ;特征字63828263
        MOV     #CharacterWord2,2(R7)
        MOV     &EnrolType,4(R7)                                ;命令字        
        BIC     #MC1,&TACTL
        MOV     &TAR,R5
        MOV     R5,&RandomData1                                 ;随机数
        ADD     &RAMModelMAC2,&RandomData1
        BIS     #MC1,&TACTL  
        MOV     &RandomData1,6(R7)
        MOV     &RAMModelMAC6,8(R7)          
        MOV     &RAMModelMAC4,10(R7)        
        MOV     &RAMModelMAC2,12(R7)
        MOV     &TempRAMIP4,14(R7)          
        MOV     &TempRAMIP2,16(R7)             

        MOV     &RAMWirelessID6,18(R7)
        MOV     &RAMWirelessID4,20(R7)
        MOV     &RAMWirelessID2,22(R7)
        MOV     #12,R6
        CLR     &PrepareCheckSum
        CLR     &PrepareCheckSumTemp
LoopAddData1
        MOV     @R7+,R4
        SWPB    R4
        CLRC
        ADD     R4,&PrepareCheckSum 
        ADC     &PrepareCheckSumTemp
        DEC     R6
        JNZ     LoopAddData1                
        CALL    #ProcessUDPFrame_Transmit                       ;使用UDP
        BIC     #StartEnrolBit 
        BIC     #RS232BufferFull         
Enrol_The_Second        
        BIT     #StartARPBit
        JNC     HaveBeEnroled
        CALL    #ProcessARP_Request
        BIC     #StartARPBit
        MOV     &RAMNetGateIP4,&TempRAMIP4
        MOV     &RAMNetGateIP2,&TempRAMIP2
        MOV     #0FFFFH,&RAMNetGateIP4                          ;这个网关IP只是在ARP的时候使用,用完之后应该恢复
        MOV     #0FFFFH,&RAMNetGateIP2          
        BIS     #WaitARPAnswerBit
        
        CLR     &CCTL2
        CLR     &WaitARPCounter
        BIC     #MC1,&TACTL
        MOV     &TAR,&CCR2
        ADD     #7373,&CCR2
        BIS     #MC1,&TACTL
        MOV     #CCIE,&CCTL2
HaveBeEnroled        
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
WirteFLASH
        BIT     #StoreStateBit
        JNC     HaveDataToSent

        MOV     #FlashAddress,R4
        CMP     @R4+,&RAMWirelessID6
        JNZ     NeedRewrited
        CMP     @R4+,&RAMWirelessID4
        JNZ     NeedRewrited
        CMP     @R4+,&RAMWirelessID2
        JNZ     NeedRewrited         
        CMP     @R4+,&RAMSelfIP4
        JNZ     NeedRewrited
        CMP     @R4+,&RAMSelfIP2
        JNZ     NeedRewrited
        JMP     DoNotWriteFlash
NeedRewrited
        DINT                         
        MOV     #FWKEY,&FCTL3
test_busy11
        BIT     #BUSY,&FCTL3
        JNZ     test_busy11
        MOV     #(FWKEY+ERASE),&FCTL1
        CLR     &FlashAddress
test_busy21
        BIT     #BUSY,&FCTL3
        JNZ     test_busy21
        MOV     #FWKEY,&FCTL1        
        XOR     #(FXKEY+LOCK),&FCTL3         
WriteFlash1
        MOV     #(FWKEY+42h),&FCTL2
        MOV     #RAMWirelessID,R5
        CLR     R4
WriteNextWord1        
        MOV     #FWKEY,&FCTL3
        MOV     #(FWKEY+WRT),&FCTL1 
        MOV     @R5+,FlashAddress(R4)
WriteFlashWait     
        BIT     #BUSY,&FCTL3
        JNZ     WriteFlashWait                 
        INCD    R4
        CMP     #06,R4
        JNZ     WriteNextWord1     
;-------------------------------------------------------
        MOV     #SourceIDFlagRegister,R5 
WriteAddressFlash
        MOV     #FWKEY,&FCTL3
        MOV     #(FWKEY+WRT),&FCTL1
        MOV     @R5+,FlashAddress(R4)        
WriteAddressFlashWait   
        BIT     #BUSY,&FCTL3
        JNZ     WriteAddressFlashWait
        INCD    R4
        CMP     #22,R4
        JNZ     WriteAddressFlash
        
        MOV     #TimeOff,R5
WriteTimeFlash
        MOV     #FWKEY,&FCTL3
        MOV     #(FWKEY+WRT),&FCTL1  
        MOV     @R5+,FlashAddress(R4)
WriteTimeFlashWait
        BIT     #BUSY,&FCTL3
        JNZ     WriteTimeFlashWait
        INCD    R4
        CMP     #26,R4
        JNZ     WriteTimeFlash              
        EINT        
DoNotWriteFlash         
        BIC     #StoreStateBit
;-----------------------------------------------------------------
HaveDataToSent
        BIT     #RS232BufferFull
        JNC     NothingDataToSend
        BIT     #EnrolBeNetGate
        JNC     NotEnrol        
        CALL    #ProcessUDPFrame_Transmit                       ;使用UDP
;;      CALL    #ProcessTCPFrame_Transmit                       ;使用TCP
NotEnrol
        BIC     #RS232BufferFull
;---------------------------------------------------------------
NothingDataToSend
        MOV     #00H,R15                                       
        MOV     #62H,R14
        CALL    #WriteAX88796Register  
        MOV     #07H,R15
        CALL    #ReadAX88796Register
        MOV.B   &BoundaryPointer,R13
        INC.B   R13
        CMP.B   #80H,R13
        JLO     IsRingLoop             
        MOV     #4CH,R13
IsRingLoop
        CMP.B   R13,R14
        JZ      Main_Loop
        MOV.B   R13,&BoundaryPointer
                
        MOV     #18,R4                                          ;18=MAC层首部
        MOV     #00H,R5
        ReadSomeByte
                
        MOV     #MACHeadData,R4 
        MOV     #18,R5                                          ;18=MAC层首部
ReadMACHead
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R4)
        INC     R4
        DEC     R5
        JNZ     ReadMACHead
        MOV.B   &MACHead_Status,R14
        BIC.B   #10100000B,R14
        XOR     #00000001B,R14
        JNZ     TheDataError
ProcessMACData
        CMP     #MACType_IP,&MACType                            ;IP数据帧
        JNZ     IsNotIPFrame
        JMP     ProcessReceiveIP
;----------------------------------------------------------
IsNotIPFrame
        CMP     #MACType_ARP,&MACType                           ;ARP数据帧
        JNZ     TheDataError                
        MOV     &MACHead_ByteCount,R5
        MOV     #28,R4                                          
        MOV     #18,R5                                    
        MOV     R4,R6
        ReadSomeByte
                
DoARP_Answer
        MOV     #MACProtocolData,R5
ReadARPDataToAnswer
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R5)
        INC     R5
        DEC     R6
        JNZ     ReadARPDataToAnswer
        CALL    #RingPrepare
;-----------------------------------------------------------------------------------------
        CMP     #ARP_Answer,&ARP_OP
        JNZ     ARPRequestFrame
        BIT     #WaitARPAnswerBit
        JNC     Main_Loop
        CMP     &ARP_TransmitIP,&TempRAMIP4
        JNZ     Main_Loop
        CMP     &(ARP_TransmitIP+2),&TempRAMIP2
        JNZ     Main_Loop
        CLR     &CCTL2                                          ;收到ARP应答说明有其它设备已经使用了这个IP
        BIC     #WaitARPAnswerBit 
        BIS     #StartEnrolBit
        MOV     #0610H,&EnrolType        
        JMP     Main_Loop
ARPRequestFrame
        CMP     #ARP_Request,&ARP_OP
        JNZ     Main_Loop   
        MOV     #MACResourceUDS,R4 
        MOV     #MACDestinationUDS,R5
        MOV.B   @R4+,0(R5)                                      ;将发送端的地址作为目的地址
        MOV.B   @R4+,1(R5)
        MOV.B   @R4+,2(R5)
        MOV.B   @R4+,3(R5)
        MOV.B   @R4+,4(R5)
        MOV.B   @R4+,5(R5)
        MOV     &RAMModelMAC6,6(R5)                             ;这里使用无线ID作为网卡MAC地址
        MOV     &RAMModelMAC4,8(R5)
        MOV     &RAMModelMAC2,10(R5)                

        MOV     #ARP_Answer,&ARP_OP                             ;ARP应答帧该值为0002H                                                    
        MOV     #ARP_TransmitUDS,R4
        MOV     #ARP_ReceiveUDS,R5
        MOV     @R4+,0(R5)                                      ;把发送方的地址和IP作为接收端地址
        MOV     @R4+,2(R5)
        MOV     @R4+,4(R5)        
        MOV     @R4+,6(R5)
        MOV     @R4+,8(R5)     
        MOV     #ARP_TransmitUDS,R4        
        MOV     &RAMModelMAC6,0(R4)                             ;ARP_TransmitUDS
        MOV     &RAMModelMAC4,2(R4)
        MOV     &RAMModelMAC2,4(R4)
        MOV     &RAMSelfIP4,6(R4)
        MOV     &RAMSelfIP2,8(R4)

        MOV     #EthernetFrameData,R9
        MOV     #2AH,R8
        CALL    #WriteAX88796Frame
        BR      #Main_Loop
;----------------------------------------------------------------------------
TheDataError
        CALL    #RingPrepare
        BR      #Main_Loop
;-----------------------------------------------------------------------------
ProcessReceiveIP
        MOV     #28,R4                                         ;ICMP或UDP或TCP的前8个字节+IP首部20个字节或者是IP选项
        MOV     #18,R5
        ReadSomeByte

        MOV     #MACProtocolData,R4
        MOV     #28,R5
ReadIPFrameHeader
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R4)
        INC     R4
        DEC     R5
;---------------------------------------
;做校验和                   
;---------------------------------------
        JNZ     ReadIPFrameHeader
;------------------------------------------
;判断校验和
;------------------------------------------------------------------------    
        CMP.B   #45H,&ICMP_IP_VarAndLength
        JZ      IPHeadIs20Byte                                 
        MOV.B   &ICMP_IP_VarAndLength,R5                       ;这里的程序是为了防止出现IP带有选相域的情况              
        AND     #000FH,R5          
        RLA     R5
        RLA     R5  
        ADD     #18,R5
        MOV     #8,R4                                          ;ICMP或UDP或TCP的前8个字节
        ReadSomeByte
        
        MOV     #ICMP_MessageType,R4
        MOV     #8,R5
Header8Byte
        MOV     #10H,R15
        CALL    #ReadAX88796Register
        MOV.B   R14,0(R4)
        INC     R4
        DEC     R5                                    
        JNZ     Header8Byte
;---------------------------------------------------------------------------        
IPHeadIs20Byte        
        BIT     #EnrolBeNetGate
        JNC     NothingIP
        MOV     #ICMP_IP_DestinationIP,R5
        CMP     &RAMSelfIP4,0(R5)
        JNZ     TheDataError
        CMP     &RAMSelfIP2,2(R5)
        JNZ     TheDataError
NothingIP
        CMP.B   #Protocol_ICMP,&ICMP_IP_ProtocolType
        JNZ     IsUDPFrame
IsICMPFrame
        CMP.B   #08H,&ICMP_MessageType
        JNZ     TheDataError
        CMP.B   #00H,&ICMP_MessageCode
        JNZ     TheDataError
        CALL    #ProcessICMP_PingAnswer
        JMP     TestDataGood

IsUDPFrame
        CMP.B   #Protocol_UDP,&ICMP_IP_ProtocolType
        JNZ     IsTCPFrame 
        MOV     &ICMP_Data,R4
        SWPB    R4
        CMP     #09H,R4                                         ;等于8也作为错误处理因为没有数据                  
        JLO     TheDataError                      
        CMP     #(MaxTCP_UDPCounter+9),R4 
        JHS     TheDataError                                    ;程序中没有分报处理有一个最大报文长度的限制

⌨️ 快捷键说明

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