📄 main.lis
字号:
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 + -