📄 供暖控制_以太网接口.s43
字号:
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 + -