📄 232toudp.lst
字号:
(0088)
(0089) Set_CS(1);//写缓冲寄存器结束
02C2 E001 LDI R16,1
02C3 940E0631 CALL _Set_CS
(0090)
(0091) Write_Control_Register(0x06,DateLen+42);//ETXNDL,6+6+2+20+8+DateLen
02C5 91200068 LDS R18,0x68
02C7 5D26 SUBI R18,0xD6
02C8 E006 LDI R16,6
02C9 940E0667 CALL _Write_Control_Register
(0092) Write_Control_Register(0x07,0x00);//ETXNDH,即从0x0000开始写入数据
02CB 2722 CLR R18
02CC E007 LDI R16,7
02CD 940E0667 CALL _Write_Control_Register
(0093)
(0094) Bit_Field_Clear(0x1c,0x08);//将EIR.TXIF位清零
02CF E028 LDI R18,0x8
02D0 E10C LDI R16,0x1C
02D1 940E06DE CALL _Bit_Field_Clear
(0095) //Bit_Field_Set(0x1b,0x88);//将EIE.TXIE位和EIE.INTIE位置1允许在发送完成后产生中断。
(0096) Bit_Field_Set(0x1f,0x08);//将ECON1.TXRTS 位置1开始发送
02D3 E028 LDI R18,0x8
02D4 E10F LDI R16,0x1F
02D5 940E06C8 CALL _Bit_Field_Set
(0097) }
02D7 9623 ADIW R28,3
02D8 940E076B CALL pop_gset1
02DA 9508 RET
(0098) //########从当前接收到的数据包中判断是不是本地ARP请求帧,是则返回1,否返回0#########//
(0099) uchar ARP_request_or_answer(void)
(0100) {uchar ARPflag=0;//
_ARP_request_or_answer:
ARPflag --> R16
02DB 2700 CLR R16
(0101) if(Rec_packet[12]==0x08 && Rec_packet[13]==0x06)//如果符合则表示当前数据包是ARP帧
02DC 91800196 LDS R24,0x196
02DE 3088 CPI R24,0x8
02DF F539 BNE 0x0307
02E0 91800197 LDS R24,0x197
02E2 3086 CPI R24,6
02E3 F519 BNE 0x0307
(0102) if(Rec_packet[20]==0x00 && Rec_packet[21]==0x01)//如果符合则表示当前数据包是ARP请求帧
02E4 9020019E LDS R2,0x19E
02E6 2022 TST R2
02E7 F4F9 BNE 0x0307
02E8 9180019F LDS R24,0x19F
02EA 3081 CPI R24,1
02EB F4D9 BNE 0x0307
(0103) if(Rec_packet[38]==IpHead[12] && Rec_packet[39]==IpHead[13] && Rec_packet[40]==IpHead[14]&& Rec_packet[41]==IpHead[15])ARPflag=0x01;
02EC 90200083 LDS R2,0x83
02EE 903001B0 LDS R3,0x1B0
02F0 1432 CP R3,R2
02F1 F4A1 BNE 0x0306
02F2 90200084 LDS R2,0x84
02F4 903001B1 LDS R3,0x1B1
02F6 1432 CP R3,R2
02F7 F471 BNE 0x0306
02F8 90200085 LDS R2,0x85
02FA 903001B2 LDS R3,0x1B2
02FC 1432 CP R3,R2
02FD F441 BNE 0x0306
02FE 90200086 LDS R2,0x86
0300 903001B3 LDS R3,0x1B3
0302 1432 CP R3,R2
0303 F411 BNE 0x0306
0304 E001 LDI R16,1
0305 C001 RJMP 0x0307
(0104) //请求方希望获得MAC地址的IP地址是不是和本地IP地址一致,如果一致,则说明是要本地回答
(0105) else ARPflag=0x00;
0306 2700 CLR R16
(0106) return ARPflag;
0307 9508 RET
_Transmit_ARP_Packets:
i --> R20
0308 940E0768 CALL push_gset1
(0107) }
(0108) //##########################发送ARP数据包##########################//
(0109) void Transmit_ARP_Packets(void)
(0110) {uchar i=0;
030A 2744 CLR R20
(0111) enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
030B 2700 CLR R16
030C 940E06F4 CALL _enc28j60SetBank
(0112) Write_Control_Register(0x02,0x00);//EWRPTL
030E 2722 CLR R18
030F E002 LDI R16,2
0310 940E0667 CALL _Write_Control_Register
(0113) Write_Control_Register(0x03,0x00);//EWRPTH
0312 2722 CLR R18
0313 E003 LDI R16,3
0314 940E0667 CALL _Write_Control_Register
(0114) Write_Control_Register(0x04,0x00);//ETXSTL
0316 2722 CLR R18
0317 E004 LDI R16,4
0318 940E0667 CALL _Write_Control_Register
(0115) Write_Control_Register(0x05,0x00);//ETXSTH
031A 2722 CLR R18
031B E005 LDI R16,5
031C 940E0667 CALL _Write_Control_Register
(0116) Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,
031E E820 LDI R18,0x80
031F E10E LDI R16,0x1E
0320 940E06C8 CALL _Bit_Field_Set
(0117) Set_CS(0);//使能SPI器件
0322 2700 CLR R16
0323 940E0631 CALL _Set_CS
(0118) Write_Buffer_Memory_date(0x7A);//送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
0325 E70A LDI R16,0x7A
0326 940E06A9 CALL _Write_Buffer_Memory_date
(0119) Write_Buffer_Memory_date(0x0e);//28J60要求在待发送的数据包前添加一个包控制字节
0328 E00E LDI R16,0xE
0329 940E06A9 CALL _Write_Buffer_Memory_date
(0120)
(0121) for(i=6;i<12;i++)Write_Buffer_Memory_date(Rec_packet[i]);//目标MAC地址6字节
032B E046 LDI R20,6
032C C00A RJMP 0x0337
032D E88A LDI R24,0x8A
032E E091 LDI R25,1
032F 2FE4 MOV R30,R20
0330 27FF CLR R31
0331 0FE8 ADD R30,R24
0332 1FF9 ADC R31,R25
0333 8100 LDD R16,Z+0
0334 940E06A9 CALL _Write_Buffer_Memory_date
0336 9543 INC R20
0337 304C CPI R20,0xC
0338 F3A0 BCS 0x032D
(0122) for(i=6;i<12;i++)Write_Buffer_Memory_date(MACHead[i]); //源MAC地址6字节
0339 E046 LDI R20,6
033A C00A RJMP 0x0345
033B E689 LDI R24,0x69
033C E090 LDI R25,0
033D 2FE4 MOV R30,R20
033E 27FF CLR R31
033F 0FE8 ADD R30,R24
0340 1FF9 ADC R31,R25
0341 8100 LDD R16,Z+0
0342 940E06A9 CALL _Write_Buffer_Memory_date
0344 9543 INC R20
0345 304C CPI R20,0xC
0346 F3A0 BCS 0x033B
(0123) for(i=12;i<20;i++)Write_Buffer_Memory_date(Rec_packet[i]);//0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04
0347 E04C LDI R20,0xC
0348 C00A RJMP 0x0353
0349 E88A LDI R24,0x8A
034A E091 LDI R25,1
034B 2FE4 MOV R30,R20
034C 27FF CLR R31
034D 0FE8 ADD R30,R24
034E 1FF9 ADC R31,R25
034F 8100 LDD R16,Z+0
0350 940E06A9 CALL _Write_Buffer_Memory_date
0352 9543 INC R20
0353 3144 CPI R20,0x14
0354 F3A0 BCS 0x0349
(0124) Write_Buffer_Memory_date(0x00);
0355 2700 CLR R16
0356 940E06A9 CALL _Write_Buffer_Memory_date
(0125) Write_Buffer_Memory_date(0x02);//0x0002表示是应答帧
0358 E002 LDI R16,2
0359 940E06A9 CALL _Write_Buffer_Memory_date
(0126) for(i=6;i<12;i++)Write_Buffer_Memory_date(MACHead[i]); //源MAC地址6字节
035B E046 LDI R20,6
035C C00A RJMP 0x0367
035D E689 LDI R24,0x69
035E E090 LDI R25,0
035F 2FE4 MOV R30,R20
0360 27FF CLR R31
0361 0FE8 ADD R30,R24
0362 1FF9 ADC R31,R25
0363 8100 LDD R16,Z+0
0364 940E06A9 CALL _Write_Buffer_Memory_date
0366 9543 INC R20
0367 304C CPI R20,0xC
0368 F3A0 BCS 0x035D
(0127) for(i=38;i<42;i++)Write_Buffer_Memory_date(Rec_packet[i]);//源IP地址
0369 E246 LDI R20,0x26
036A C00A RJMP 0x0375
036B E88A LDI R24,0x8A
036C E091 LDI R25,1
036D 2FE4 MOV R30,R20
036E 27FF CLR R31
036F 0FE8 ADD R30,R24
0370 1FF9 ADC R31,R25
0371 8100 LDD R16,Z+0
0372 940E06A9 CALL _Write_Buffer_Memory_date
0374 9543 INC R20
0375 324A CPI R20,0x2A
0376 F3A0 BCS 0x036B
(0128) for(i=22;i<32;i++)Write_Buffer_Memory_date(Rec_packet[i]);//目标MAC地址6字节,目标IP地址
0377 E146 LDI R20,0x16
0378 C00A RJMP 0x0383
0379 E88A LDI R24,0x8A
037A E091 LDI R25,1
037B 2FE4 MOV R30,R20
037C 27FF CLR R31
037D 0FE8 ADD R30,R24
037E 1FF9 ADC R31,R25
037F 8100 LDD R16,Z+0
0380 940E06A9 CALL _Write_Buffer_Memory_date
0382 9543 INC R20
0383 3240 CPI R20,0x20
0384 F3A0 BCS 0x0379
(0129) Set_CS(1);//写缓冲寄存器结束
0385 E001 LDI R16,1
0386 940E0631 CALL _Set_CS
(0130) Write_Control_Register(0x06,42);//ETXNDL,6+6+2+20+8
0388 E22A LDI R18,0x2A
0389 E006 LDI R16,6
038A 940E0667 CALL _Write_Control_Register
(0131) Write_Control_Register(0x07,0x00);//ETXNDH,即从0x0000开始写入数据
038C 2722 CLR R18
038D E007 LDI R16,7
038E 940E0667 CALL _Write_Control_Register
(0132)
(0133) Bit_Field_Clear(0x1c,0x08);//将EIR.TXIF位清零
0390 E028 LDI R18,0x8
0391 E10C LDI R16,0x1C
0392 940E06DE CALL _Bit_Field_Clear
(0134) Bit_Field_Set(0x1f,0x08);//将ECON1.TXRTS 位置1开始发送
0394 E028 LDI R18,0x8
0395 E10F LDI R16,0x1F
0396 940E06C8 CALL _Bit_Field_Set
(0135) }
0398 940E076B CALL pop_gset1
039A 9508 RET
_Receive_Packets:
Receive_Byte_Number --> R20
i --> R22
039B 940E077F CALL push_gset2
(0136) //##########################接收数据包处理##########################//
(0137) void Receive_Packets(void)//
(0138) {uchar i=0;
039D 2766 CLR R22
(0139) uint Receive_Byte_Number=0;
039E 2744 CLR R20
039F 2755 CLR R21
(0140) enc28j60SetBank(0x00);//通过ECON1先选中当前控制寄存器组是Bank0
03A0 2700 CLR R16
03A1 940E06F4 CALL _enc28j60SetBank
(0141) Receive_Status[0]=Read_Buffer_Memory();//存放下一个数据包的起始位置低8位
03A3 940E0693 CALL _Read_Buffer_Memory
03A5 93000061 STS 0x61,R16
(0142) Receive_Status[1]=Read_Buffer_Memory();//存放下一个数据包的起始位置高8位
03A7 940E0693 CALL _Read_Buffer_Memory
03A9 93000062 STS 0x62,R16
(0143) Receive_Status[2]=Read_Buffer_Memory();//存放当前接收到的数据包的字节数低8位
03AB 940E0693 CALL _Read_Buffer_Memory
03AD 93000063 STS 0x63,R16
(0144) Receive_Status[3]=Read_Buffer_Memory();//存放当前接收到的数据包的字节数高8位
03AF 940E0693 CALL _Read_Buffer_Memory
03B1 93000064 STS 0x64,R16
(0145) Receive_Status[4]=Read_Buffer_Memory();//其它,参看数据手册
03B3 940E0693 CALL _Read_Buffer_Memory
03B5 93000065 STS 0x65,R16
(0146) Receive_Status[5]=Read_Buffer_Memory();//其它,参看数据手册
03B7 940E0693 CALL _Read_Buffer_Memory
03B9 93000066 STS 0x66,R16
(0147)
(0148) Receive_Byte_Number +=Receive_Status[3];
03BB 90200064 LDS R2,0x64
03BD 2433 CLR R3
03BE 0D42 ADD R20,R2
03BF 1D53 ADC R21,R3
(0149) Receive_Byte_Number =Receive_Byte_Number<<8;
03C0 2F54 MOV R21,R20
03C1 2744 CLR R20
(0150) Receive_Byte_Number +=Receive_Status[2];
03C2 90200063 LDS R2,0x63
03C4 2433 CLR R3
03C5 0D42 ADD R20,R2
03C6 1D53 ADC R21,R3
(0151) //得到接收到的数据包长度包括目标地址,源地址,类型/长度,数据,填充,CRC字段
(0152) for(i=0;i<Receive_Byte_Number;i++)Rec_packet[i]=Read_Buffer_Memory();//将接收到的当前数据包存放在Rec_packet[255]中等待处理
03C7 C00A RJMP 0x03D2
03C8 940E0693 CALL _Read_Buffer_Memory
03CA E88A LDI R24,0x8A
03CB E091 LDI R25,1
03CC 2FE6 MOV R30,R22
03CD 27FF CLR R31
03CE 0FE8 ADD R30,R24
03CF 1FF9 ADC R31,R25
03D0 8300 STD Z+0,R16
03D1 9563 INC R22
03D2 2E26 MOV R2,R22
03D3 2433 CLR R3
03D4 1624 CP R2,R20
03D5 0635 CPC R3,R21
03D6 F388 BCS 0x03C8
(0153) i=ARP_request_or_answer();
03D7 DF03 RCALL _ARP_request_or_answer
03D8 2F60 MOV R22,R16
(0154) if(i==0x01)Transmit_ARP_Packets();//如果是本地ARP请求帧,则响应请求,发送ARP应答帧
03D9 3001 CPI R16,1
03DA F409 BNE 0x03DC
03DB DF2C RCALL _Transmit_ARP_Packets
(0155)
(0156) putchar(0x4C);
03DC E40C LDI R16,0x4C
03DD 940E062D CALL _putchar
(0157) putchar(0x48);
03DF E408 LDI R16,0x48
03E0 940E062D CALL _putchar
(0158) putchar(0x46);//发送"LHF"通知上位机,紧接着要发送刚接收到的数据帧给上位机
03E2 E406 LDI R16,0x46
03E3 940E062D CALL _putchar
(0159) for(i=0;i<Receive_Byte_Number;i++)putchar(Rec_packet[i]);
03E5 2766 CLR R22
03E6 C00A RJMP 0x03F1
03E7 E88A LDI R24,0x8A
03E8 E091 LDI R25,1
03E9 2FE6 MOV R30,R22
03EA 27FF CLR R31
03EB 0FE8 ADD R30,R24
03EC 1FF9 ADC R31,R25
03ED 8100 LDD R16,Z+0
03EE 940E062D CALL _putchar
03F0 9563 INC R22
03F1 2E26 MOV R2,R22
03F2 2433 CLR R3
03F3 1624 CP R2,R20
03F4 0635 CPC R3,R21
03F5 F388 BCS 0x03E7
(0160) //将接收到的数据发送到上位机软件,包括目标地址,源地址,类型/长度,数据,填充,CRC字段。
(0161)
(0162) Bit_Field_Set(0x1e,0x40);//数据处理完后,然后清零待处理中断标志位PKTIF
03F6 E420 LDI R18,0x40
03F7 E10E LDI R16,0x1E
03F8 940E06C8 CALL _Bit_Field_Set
(0163) //只能通过将ECON2中的PKTDEC置1时才能清PKTIF
(0164) Write_Control_Register(0x00,Receive_Status[0]);//ERDPTL
03FA 91200061 LDS R18,0x61
03FC 2700 CLR R16
03FD 940E0667 CALL _Write_Control_Register
(0165) Write_Control_Register(0x01,Receive_Status[1]);//ERDPTH,读数据包指针起始位置,准备处理下一数据帧
03FF 91200062 LDS R18,0x62
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -