📄 enc28j60.lis
字号:
017C .dbline 146
017C L71:
017C .dbline 146
017C ; while(!(SPSR&0x80));
017C 779B sbis 0xe,7
017E FECF rjmp L70
0180 .dbline 147
0180 ; clear=SPSR;
0180 4EB1 in R20,0xe
0182 .dbline 148
0182 ; clear=SPDR; //接收到控制寄存器里的数据
0182 4FB1 in R20,0xf
0184 .dbline 150
0184 ;
0184 ; Set_CS(1); //关SPI器件
0184 01E0 ldi R16,1
0186 56DF xcall _Set_CS
0188 .dbline -2
0188 .dbline 151
0188 ; }
0188 L66:
0188 0E940000 xcall pop_gset2
018C .dbline 0 ; func end
018C 0895 ret
018E .dbsym r clear 20 c
018E .dbsym r date 22 c
018E .dbsym r Address 20 c
018E .dbend
018E .dbfunc e Bit_Field_Clear _Bit_Field_Clear fV
018E ; clear -> R20
018E ; date -> R22
018E ; Address -> R20
.even
018E _Bit_Field_Clear::
018E 0E940000 xcall push_gset2
0192 622F mov R22,R18
0194 402F mov R20,R16
0196 .dbline -1
0196 .dbline 155
0196 ; //#################################位域置清0命令#################################
0196 ; void Bit_Field_Clear(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑非与操作
0196 ; //将所提供数据取反,并接着与指定寄存器的内容进行D0位的逻辑与运算
0196 ; {uchar clear;
0196 .dbline 156
0196 ; Address=Address+0xa0;
0196 4056 subi R20,96 ; addi 160
0198 .dbline 157
0198 ; Set_CS(0); //使能SPI器件
0198 0027 clr R16
019A 4CDF xcall _Set_CS
019C .dbline 159
019C ;
019C ; SPDR=Address; //送命令,28J60中位域置1命令前3位为101后5位为地址
019C 4FB9 out 0xf,R20
019E L74:
019E .dbline 160
019E L75:
019E .dbline 160
019E ; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
019E 779B sbis 0xe,7
01A0 FECF rjmp L74
01A2 .dbline 161
01A2 ; clear=SPSR;
01A2 4EB1 in R20,0xe
01A4 .dbline 162
01A4 ; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
01A4 4FB1 in R20,0xf
01A6 .dbline 164
01A6 ;
01A6 ; SPDR=date; //送数据
01A6 6FB9 out 0xf,R22
01A8 L77:
01A8 .dbline 165
01A8 L78:
01A8 .dbline 165
01A8 ; while(!(SPSR&0x80));
01A8 779B sbis 0xe,7
01AA FECF rjmp L77
01AC .dbline 166
01AC ; clear=SPSR;
01AC 4EB1 in R20,0xe
01AE .dbline 167
01AE ; clear=SPDR; //接收到控制寄存器里的数据
01AE 4FB1 in R20,0xf
01B0 .dbline 169
01B0 ;
01B0 ; Set_CS(1); //关SPI器件
01B0 01E0 ldi R16,1
01B2 40DF xcall _Set_CS
01B4 .dbline -2
01B4 .dbline 170
01B4 ; }
01B4 L73:
01B4 0E940000 xcall pop_gset2
01B8 .dbline 0 ; func end
01B8 0895 ret
01BA .dbsym r clear 20 c
01BA .dbsym r date 22 c
01BA .dbsym r Address 20 c
01BA .dbend
01BA .dbfunc e enc28j60SetBank _enc28j60SetBank fV
01BA ; group -> R20
.even
01BA _enc28j60SetBank::
01BA 0E940000 xcall push_gset1
01BE 402F mov R20,R16
01C0 .dbline -1
01C0 .dbline 173
01C0 ; //#################################寄存器组选择#################################
01C0 ; void enc28j60SetBank(uchar group)//0,1,2,3
01C0 ; {
01C0 .dbline 174
01C0 ; Bit_Field_Clear(0x1f,0x03);//先将BSEL1,BSEL0清0
01C0 23E0 ldi R18,3
01C2 0FE1 ldi R16,31
01C4 E4DF xcall _Bit_Field_Clear
01C6 .dbline 175
01C6 5527 clr R21
01C8 4030 cpi R20,0
01CA 4507 cpc R20,R21
01CC C1F0 breq L82
01CE X0:
01CE 4130 cpi R20,1
01D0 E0E0 ldi R30,0
01D2 5E07 cpc R21,R30
01D4 49F0 breq L85
01D6 4230 cpi R20,2
01D8 E0E0 ldi R30,0
01DA 5E07 cpc R21,R30
01DC 49F0 breq L86
01DE 4330 cpi R20,3
01E0 E0E0 ldi R30,0
01E2 5E07 cpc R21,R30
01E4 49F0 breq L87
01E6 0BC0 xjmp L81
01E8 X1:
01E8 .dbline 175
01E8 ; switch(group){
01E8 .dbline 176
01E8 ; case 0:break;
01E8 L85:
01E8 .dbline 177
01E8 ; case 1:Bit_Field_Set(0x1f,0x01);break;
01E8 21E0 ldi R18,1
01EA 0FE1 ldi R16,31
01EC BADF xcall _Bit_Field_Set
01EE .dbline 177
01EE 07C0 xjmp L82
01F0 L86:
01F0 .dbline 178
01F0 ; case 2:Bit_Field_Set(0x1f,0x02);break;
01F0 22E0 ldi R18,2
01F2 0FE1 ldi R16,31
01F4 B6DF xcall _Bit_Field_Set
01F6 .dbline 178
01F6 03C0 xjmp L82
01F8 L87:
01F8 .dbline 179
01F8 ; case 3:Bit_Field_Set(0x1f,0x03);break;
01F8 23E0 ldi R18,3
01FA 0FE1 ldi R16,31
01FC B2DF xcall _Bit_Field_Set
01FE .dbline 179
01FE L81:
01FE L82:
01FE .dbline -2
01FE .dbline 181
01FE ; }
01FE ; }
01FE L80:
01FE 0E940000 xcall pop_gset1
0202 .dbline 0 ; func end
0202 0895 ret
0204 .dbsym r group 20 c
0204 .dbend
0204 .dbfunc e Write_PHY_Register _Write_PHY_Register fV
0204 ; flag -> R20
0204 ; dateL -> y+6
0204 ; dateH -> R22
0204 ; Address -> R10
.even
0204 _Write_PHY_Register::
0204 0E940000 xcall push_gset3
0208 622F mov R22,R18
020A A02E mov R10,R16
020C .dbline -1
020C .dbline 184
020C ; //#################################写PHY寄存器#################################
020C ; void Write_PHY_Register(uchar Address,uchar dateH,uchar dateL)
020C ; {uchar flag=0x01;
020C .dbline 184
020C 41E0 ldi R20,1
020E .dbline 185
020E ; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
020E 02E0 ldi R16,2
0210 D4DF xcall _enc28j60SetBank
0212 .dbline 186
0212 ; Write_Control_Register(0x14,Address);//将PHY地址写入MIREGADR寄存器0x14
0212 2A2D mov R18,R10
0214 04E1 ldi R16,20
0216 44DF xcall _Write_Control_Register
0218 .dbline 187
0218 ; Write_Control_Register(0x16,dateL);//将dateL写入MIWRL
0218 2E81 ldd R18,y+6
021A 06E1 ldi R16,22
021C 41DF xcall _Write_Control_Register
021E .dbline 188
021E ; Write_Control_Register(0x17,dateH);//将dateH写入MIWRH
021E 262F mov R18,R22
0220 07E1 ldi R16,23
0222 3EDF xcall _Write_Control_Register
0224 .dbline 189
0224 ; enc28j60SetBank(0x03);//通过ECON1先选中当前控制寄存器组是Bank3,因为接下来的MISTAT寄存器在Bank3。
0224 03E0 ldi R16,3
0226 C9DF xcall _enc28j60SetBank
0228 04C0 xjmp L90
022A L89:
022A .dbline 190
022A 2AE0 ldi R18,10
022C 01E0 ldi R16,1
022E 19DF xcall _Read_Control_Register
0230 402F mov R20,R16
0232 L90:
0232 .dbline 190
0232 ; while((flag&0x01)!=0)flag=Read_Control_Register(MII,0x0a);//查询MISTAT.BUSY,等待它清0
0232 40FD sbrc R20,0
0234 FACF rjmp L89
0236 .dbline -2
0236 .dbline 191
0236 ; }
0236 L88:
0236 0E940000 xcall pop_gset3
023A .dbline 0 ; func end
023A 0895 ret
023C .dbsym r flag 20 c
023C .dbsym l dateL 6 c
023C .dbsym r dateH 22 c
023C .dbsym r Address 10 c
023C .dbend
023C .dbfunc e Read_PHY_Register _Read_PHY_Register fV
023C ; flag -> R20
023C ; Address -> R22
.even
023C _Read_PHY_Register::
023C 0E940000 xcall push_gset2
0240 602F mov R22,R16
0242 .dbline -1
0242 .dbline 194
0242 ; //#################################读PHY寄存器#################################
0242 ; void Read_PHY_Register(uchar Address)
0242 ; {uchar flag=0x01;
0242 .dbline 194
0242 41E0 ldi R20,1
0244 .dbline 195
0244 ; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
0244 02E0 ldi R16,2
0246 B9DF xcall _enc28j60SetBank
0248 .dbline 196
0248 ; Write_Control_Register(0x14,Address);//将PHY地址写入MIREGADR寄存器0x14
0248 262F mov R18,R22
024A 04E1 ldi R16,20
024C 29DF xcall _Write_Control_Register
024E .dbline 197
024E ; Write_Control_Register(0x12,0x01);//将MICMD.MIIRD置1
024E 21E0 ldi R18,1
0250 02E1 ldi R16,18
0252 26DF xcall _Write_Control_Register
0254 .dbline 198
0254 ; enc28j60SetBank(0x03);//通过ECON1先选中当前控制寄存器组是Bank3,因为接下来的MISTAT寄存器在Bank3。
0254 03E0 ldi R16,3
0256 B1DF xcall _enc28j60SetBank
0258 .dbline 199
0258 ; Write_Control_Register(0x0a,0x01);//将MISTAT.BUSY置1
0258 21E0 ldi R18,1
025A 0AE0 ldi R16,10
025C 21DF xcall _Write_Control_Register
025E 04C0 xjmp L94
0260 L93:
0260 .dbline 200
0260 2AE0 ldi R18,10
0262 01E0 ldi R16,1
0264 FEDE xcall _Read_Control_Register
0266 402F mov R20,R16
0268 L94:
0268 .dbline 200
0268 ; while((flag&0x01)!=0)flag=Read_Control_Register(MII,0x0a);//查询MISTAT.BUSY,等待它清0
0268 40FD sbrc R20,0
026A FACF rjmp L93
026C .dbline 201
026C ; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
026C 02E0 ldi R16,2
026E A5DF xcall _enc28j60SetBank
0270 .dbline 202
0270 ; Write_Control_Register(0x12,0x00);//将MICMD.MIIRD清0
0270 2227 clr R18
0272 02E1 ldi R16,18
0274 15DF xcall _Write_Control_Register
0276 .dbline 203
0276 ; PHY_H=Read_Control_Register(MII,0x19);//从MIRDH中读取PHY中的高8位数据
0276 29E1 ldi R18,25
0278 01E0 ldi R16,1
027A F3DE xcall _Read_Control_Register
027C 00930000 sts _PHY_H,R16
0280 .dbline 204
0280 ; PHY_L=Read_Control_Register(MII,0x18);//从MIRDL中读取PHY中的低8位数据
0280 28E1 ldi R18,24
0282 01E0 ldi R16,1
0284 EEDE xcall _Read_Control_Register
0286 00930100 sts _PHY_L,R16
028A .dbline -2
028A .dbline 205
028A ; }
028A L92:
028A 0E940000 xcall pop_gset2
028E .dbline 0 ; func end
028E 0895 ret
0290 .dbsym r flag 20 c
0290 .dbsym r Address 22 c
0290 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -