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