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

📄 232toudp.lst

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -