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

📄 main.lis

📁 网卡控制器ENC28J60的AVR单片机ATmega16程序源代码(c),实现232toUDP功能,有非常详细的注释.
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 042E 0E940000          xcall _Bit_Field_Set
 0432                   .dbline 164
 0432           ;  //只能通过将ECON2中的PKTDEC置1时才能清PKTIF
 0432           ;   Write_Control_Register(0x00,Receive_Status[0]);//ERDPTL
 0432 20910100          lds R18,_Receive_Status
 0436 0027              clr R16
 0438 0E940000          xcall _Write_Control_Register
 043C                   .dbline 165
 043C           ;   Write_Control_Register(0x01,Receive_Status[1]);//ERDPTH,读数据包指针起始位置,准备处理下一数据帧
 043C 20910200          lds R18,_Receive_Status+1
 0440 01E0              ldi R16,1
 0442 0E940000          xcall _Write_Control_Register
 0446                   .dbline 167
 0446           ;  
 0446           ;  enc28j60SetBank(0x01);//因为EPKTCNT寄存器在Bank1.
 0446 01E0              ldi R16,1
 0448 0E940000          xcall _enc28j60SetBank
 044C                   .dbline 168
 044C           ;  EPKTCNT=Read_Control_Register(ETH,0x19);//读取EPKTCNT值
 044C 29E1              ldi R18,25
 044E 0027              clr R16
 0450 0E940000          xcall _Read_Control_Register
 0454 00930700          sts _EPKTCNT,R16
 0458                   .dbline -2
 0458                   .dbline 169
 0458           ;  }
 0458           L83:
 0458 0E940000          xcall pop_gset2
 045C                   .dbline 0 ; func end
 045C 0895              ret
 045E                   .dbsym r Receive_Byte_Number 20 i
 045E                   .dbsym r i 22 c
 045E                   .dbend
 045E                   .dbfunc e ENC28J60_Initialize _ENC28J60_Initialize fV
 045E           ;          state -> R20
                        .even
 045E           _ENC28J60_Initialize::
 045E 0E940000          xcall push_gset1
 0462 2197              sbiw R28,1
 0464                   .dbline -1
 0464                   .dbline 174
 0464           ; 
 0464           ; 
 0464           ; //##############################28J60初始化程序###########################//
 0464           ; void ENC28J60_Initialize(void)
 0464           ; {uchar state=0;
 0464                   .dbline 174
 0464 4427              clr R20
 0466                   .dbline 175
 0466           ;  Reset_28J60();//软复位
 0466 0E940000          xcall _Reset_28J60
 046A                   .dbline 176
 046A           ;  delay(2);//28J60复位要一定的时间
 046A 02E0              ldi R16,2
 046C 0E940000          xcall _delay
 0470 05C0              xjmp L104
 0472           L103:
 0472                   .dbline 177
 0472 2DE1              ldi R18,29
 0474 0027              clr R16
 0476 0E940000          xcall _Read_Control_Register
 047A 402F              mov R20,R16
 047C           L104:
 047C                   .dbline 177
 047C           ;  while((state&0x01)==0)state=Read_Control_Register(ETH,0x1D);
 047C 40FF              sbrs R20,0
 047E F9CF              rjmp L103
 0480                   .dbline 180
 0480           ;  //读状态寄存器ESTAT,确认CLKRDY时钟就绪位置1,确保已稳定,才能进行对MAC和PHY修改
 0480           ;  
 0480           ;  Write_Control_Register(0x08,0x00);//ERXSTL
 0480 2227              clr R18
 0482 08E0              ldi R16,8
 0484 0E940000          xcall _Write_Control_Register
 0488                   .dbline 181
 0488           ;  Write_Control_Register(0x09,0x08);//ERXSTH,ERXST指针指定接收数据包放在RAM中的开始位置
 0488 28E0              ldi R18,8
 048A 09E0              ldi R16,9
 048C 0E940000          xcall _Write_Control_Register
 0490                   .dbline 182
 0490           ;  Write_Control_Register(0x0C,0x00);//ERXRDPTL
 0490 2227              clr R18
 0492 0CE0              ldi R16,12
 0494 0E940000          xcall _Write_Control_Register
 0498                   .dbline 183
 0498           ;  Write_Control_Register(0x0D,0x08);//ERXRDPTH,与ERXST值要保持相同
 0498 28E0              ldi R18,8
 049A 0DE0              ldi R16,13
 049C 0E940000          xcall _Write_Control_Register
 04A0                   .dbline 184
 04A0           ;  Write_Control_Register(0x00,0x00);//ERDPTL
 04A0 2227              clr R18
 04A2 0027              clr R16
 04A4 0E940000          xcall _Write_Control_Register
 04A8                   .dbline 185
 04A8           ;  Write_Control_Register(0x01,0x08);//ERDPTH,读数据包指针起始位置
 04A8 28E0              ldi R18,8
 04AA 01E0              ldi R16,1
 04AC 0E940000          xcall _Write_Control_Register
 04B0                   .dbline 187
 04B0           ;   
 04B0           ;  Write_Control_Register(0x0A,0xff);//ERXNDL
 04B0 2FEF              ldi R18,255
 04B2 0AE0              ldi R16,10
 04B4 0E940000          xcall _Write_Control_Register
 04B8                   .dbline 188
 04B8           ;  Write_Control_Register(0x0B,0x1f);//ERXNDH,ERXND指针指定接收数据包放在RAM中的结束位置
 04B8 2FE1              ldi R18,31
 04BA 0BE0              ldi R16,11
 04BC 0E940000          xcall _Write_Control_Register
 04C0                   .dbline 191
 04C0           ;  //指定接收缓冲区,起始处接收缓冲区要预留至少7个字节,将接收到的数据包放入0x0800-0x1fff
 04C0           ;  
 04C0           ;  Write_Control_Register(0x04,0x00);//ETXSTL
 04C0 2227              clr R18
 04C2 04E0              ldi R16,4
 04C4 0E940000          xcall _Write_Control_Register
 04C8                   .dbline 192
 04C8           ;  Write_Control_Register(0x05,0x00);//ETXSTH  
 04C8 2227              clr R18
 04CA 05E0              ldi R16,5
 04CC 0E940000          xcall _Write_Control_Register
 04D0                   .dbline 194
 04D0           ;   
 04D0           ;  enc28j60SetBank(0x01);//通过ECON1先选中当前控制寄存器组是Bank1,因为ERXFCON寄存器在Bank1。
 04D0 01E0              ldi R16,1
 04D2 0E940000          xcall _enc28j60SetBank
 04D6                   .dbline 195
 04D6           ;  Write_Control_Register(0x18,0x83);//将ERXFCON设定接收单播,广播的帧,丢掉CRC无效的数据包
 04D6 23E8              ldi R18,131
 04D8 08E1              ldi R16,24
 04DA 0E940000          xcall _Write_Control_Register
 04DE                   .dbline 197
 04DE           ;   
 04DE           ;  enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为MAC相关寄存器在Bank2。
 04DE 02E0              ldi R16,2
 04E0 0E940000          xcall _enc28j60SetBank
 04E4                   .dbline 198
 04E4           ;  Bit_Field_Clear(0x01,0x80);//将MACON2中的MARST位清零,使MAC退出复位状态。
 04E4 20E8              ldi R18,128
 04E6 01E0              ldi R16,1
 04E8 0E940000          xcall _Bit_Field_Clear
 04EC                   .dbline 199
 04EC           ;  Write_Control_Register(0x00,0x0d);
 04EC 2DE0              ldi R18,13
 04EE 0027              clr R16
 04F0 0E940000          xcall _Write_Control_Register
 04F4                   .dbline 201
 04F4           ;  //对MACON1进行配置,使能接收数据帧,如果是双工模式的话还要将TXPAUS和RXPAUS置1
 04F4           ;  Write_Control_Register(0x02,0x33);//对MACON3进行配置,配置MACON3中的PADCFG、TXCRCEN、FRMLNEN.
 04F4 23E3              ldi R18,51
 04F6 02E0              ldi R16,2
 04F8 0E940000          xcall _Write_Control_Register
 04FC                   .dbline 204
 04FC           ; //大多数应用应使能自动填充(达到至少60字节),并始终追加一个有效的CRC.为了方便起见,许多应用可能还希望将FRMLNEN位置1
 04FC           ; //使能帧长度状态报告.如果应用连接到全双工远程节点,则应将FULDPX置1,否则应保持该位清零。
 04FC           ;  Write_Control_Register(0x06,0x12);//配置非背对背包间间隔寄存器的低字节MAIPGL.大多数应用使用12h编程该寄存器。
 04FC 22E1              ldi R18,18
 04FE 06E0              ldi R16,6
 0500 0E940000          xcall _Write_Control_Register
 0504                   .dbline 207
 0504           ;  //Write_Control_Register(0x07,0x0c);//如果使用半双工模式,应编程非背对背包间间隔寄存器的高字节MAIPGH.
 0504           ;  //大多数应用使用0Ch编程该寄存器.
 0504           ;  Write_Control_Register(0x04,0x15);//配置背对背包间间隔寄存器MABBIPG.
 0504 25E1              ldi R18,21
 0506 04E0              ldi R16,4
 0508 0E940000          xcall _Write_Control_Register
 050C                   .dbline 209
 050C           ;  //当使用全双工模式时,大多数应用使用15h编程该寄存器,而使用半双工模式时则使用12h进行编程.
 050C           ;  Write_Control_Register(0x0a,0xf0);//MAMXFLL
 050C 20EF              ldi R18,240
 050E 0AE0              ldi R16,10
 0510 0E940000          xcall _Write_Control_Register
 0514                   .dbline 210
 0514           ;  Write_Control_Register(0x0b,0x00);//MAMXFLH
 0514 2227              clr R18
 0516 0BE0              ldi R16,11
 0518 0E940000          xcall _Write_Control_Register
 051C                   .dbline 216
 051C           ;  //用允许接收或发送的最大帧长度编程MAMXFL寄存器.网络节点一般被设计为处理不大于1518字节的数据包.这里最大240
 051C           ;    
 051C           ;  //如果使用半双工模式,还需编程重发和冲突窗口寄存器MACLCON1 和MACLCON2。
 051C           ;  //大多数应用不需要更改默认的复位值。在网络线缆特别长的情况下,需要增加MACLCON2的默认值
 051C           ;  
 051C           ;  enc28j60SetBank(0x03);//通过ECON1先选中当前控制寄存器组是Bank3,因为MAADR相关寄存器在Bank3.
 051C 03E0              ldi R16,3
 051E 0E940000          xcall _enc28j60SetBank
 0522                   .dbline 218
 0522           ;  
 0522           ;  Write_Control_Register(0x01,MACHead[6]);//MAADR0,将本地MAC地址写入MAADR0:MAADR5寄存器.
 0522 20910F00          lds R18,_MACHead+6
 0526 01E0              ldi R16,1
 0528 0E940000          xcall _Write_Control_Register
 052C                   .dbline 219
 052C           ;  Write_Control_Register(0x00,MACHead[7]);//MAADR1
 052C 20911000          lds R18,_MACHead+7
 0530 0027              clr R16
 0532 0E940000          xcall _Write_Control_Register
 0536                   .dbline 220
 0536           ;  Write_Control_Register(0x03,MACHead[8]);//MAADR2
 0536 20911100          lds R18,_MACHead+8
 053A 03E0              ldi R16,3
 053C 0E940000          xcall _Write_Control_Register
 0540                   .dbline 221
 0540           ;  Write_Control_Register(0x02,MACHead[9]);//MAADR3
 0540 20911200          lds R18,_MACHead+9
 0544 02E0              ldi R16,2
 0546 0E940000          xcall _Write_Control_Register
 054A                   .dbline 222
 054A           ;  Write_Control_Register(0x05,MACHead[10]);//MAADR4
 054A 20911300          lds R18,_MACHead+10
 054E 05E0              ldi R16,5
 0550 0E940000          xcall _Write_Control_Register
 0554                   .dbline 223
 0554           ;  Write_Control_Register(0x04,MACHead[11]);//MAADR5
 0554 20911400          lds R18,_MACHead+11
 0558 04E0              ldi R16,4
 055A 0E940000          xcall _Write_Control_Register
 055E                   .dbline 225
 055E           ; //接下去对PHY进行初始化//
 055E           ; Write_PHY_Register(0x00,0x01,0x00);//将PHCON1.PDPXMD置1,工作在全双工模式.
 055E 2224              clr R2
 0560 2882              std y+0,R2
 0562 21E0              ldi R18,1
 0564 0027              clr R16
 0566 0E940000          xcall _Write_PHY_Register
 056A                   .dbline 226
 056A           ; Write_PHY_Register(0x10,0x01,0x00);//将PHCON2.HDLDIS置1,禁止发送数据的自动环回。 
 056A 2224              clr R2
 056C 2882              std y+0,R2
 056E 21E0              ldi R18,1
 0570 00E1              ldi R16,16
 0572 0E940000          xcall _Write_PHY_Register
 0576                   .dbline 227
 0576           ; Write_PHY_Register(0x14,0x04,0x72);//PHLCON寄存器配置LEDA,LEDB;LEDA显示链接状态,LEDB显示发送和接收活动
 0576 82E7              ldi R24,114
 0578 8883              std y+0,R24
 057A 24E0              ldi R18,4
 057C 04E1              ldi R16,20
 057E 0E940000          xcall _Write_PHY_Register
 0582                   .dbline 229
 0582           ; 
 0582           ; Bit_Field_Set(0x1e,0x80);//ECON2寄存器中的AUTOINC位置1,写缓冲器命令时自动指向下一个地址
 0582 20E8              ldi R18,128
 0584 0EE1              ldi R16,30
 0586 0E940000          xcall _Bit_Field_Set
 058A                   .dbline 230
 058A           ; Bit_Field_Set(0x1B,0xc0);//将EIE.INTIE位和EIE.PKTIE置1允许接收产生中断。
 058A 20EC              ldi R18,192
 058C 0BE1              ldi R16,27
 058E 0E940000          xcall _Bit_Field_Set
 0592                   .dbline 231
 0592           ; Write_Control_Register(0x1f,0x04);//接收使能
 0592 24E0              ldi R18,4
 0594 0FE1              ldi R16,31
 0596 0E940000          xcall _Write_Control_Register
 059A                   .dbline -2
 059A                   .dbline 232
 059A           ; }
 059A           L102:
 059A 2196              adiw R28,1
 059C 0E940000          xcall pop_gset1
 05A0                   .dbline 0 ; func end
 05A0 0895              ret
 05A2                   .dbsym r state 20 c
 05A2                   .dbend
 05A2                   .dbfunc e INT1_17 _INT1_17 fV
 05A2           ;              i -> R16
                        .even
 05A2           _INT1_17::
 05A2 0A93              st -y,R16
 05A4 8A93              st -y,R24
 05A6 0FB7              in R16,0x3f
 05A8 0A93              st -y,R16
 05AA                   .dbline -1
 05AA                   .dbline 235
 05AA           ; //#####

⌨️ 快捷键说明

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