📄 enc28j60.s
字号:
.dbline 107
;
; Set_CS(1); //关SPI器件
ldi R16,1
xcall _Set_CS
.dbline 108
; return clear;
mov R16,R20
.dbline -2
L48:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbend
.dbfunc e Write_Buffer_Memory_date _Write_Buffer_Memory_date fV
; clear -> R20
; date -> R16
.even
_Write_Buffer_Memory_date::
xcall push_gset1
.dbline -1
.dbline 112
; }
; //#########################写缓冲存储器#################################
; void Write_Buffer_Memory_date(uchar date)//写入缓冲存储器数据
; {uchar clear;
.dbline 113
; SPDR=date;
out 0xf,R16
L56:
.dbline 114
L57:
.dbline 114
; while(!(SPSR&0x80));
sbis 0xe,7
rjmp L56
.dbline 115
; clear=SPSR;
in R20,0xe
.dbline 116
; clear=SPDR;
in R20,0xf
.dbline -2
.dbline 117
; }
L55:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbsym r date 16 c
.dbend
.dbfunc e Write_Buffer_Memory_once _Write_Buffer_Memory_once fV
; clear -> R20
; date -> R22
.even
_Write_Buffer_Memory_once::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 119
; void Write_Buffer_Memory_once(uchar date)//只写一次,地址是由EWRPT指向的存储器
; {uchar clear;
.dbline 120
; Set_CS(0); //使能SPI器件
clr R16
xcall _Set_CS
.dbline 122
;
; SPDR=0x7A; //送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
ldi R24,122
out 0xf,R24
L60:
.dbline 123
L61:
.dbline 123
; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
sbis 0xe,7
rjmp L60
.dbline 124
; clear=SPSR;
in R20,0xe
.dbline 125
; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
in R20,0xf
.dbline 127
;
; SPDR=date;
out 0xf,R22
L63:
.dbline 128
L64:
.dbline 128
; while(!(SPSR&0x80));
sbis 0xe,7
rjmp L63
.dbline 129
; clear=SPSR;
in R20,0xe
.dbline 130
; clear=SPDR;
in R20,0xf
.dbline 132
;
; Set_CS(1); //关SPI器件
ldi R16,1
xcall _Set_CS
.dbline -2
.dbline 133
; }
L59:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbsym r date 22 c
.dbend
.dbfunc e Bit_Field_Set _Bit_Field_Set fV
; clear -> R20
; date -> R22
; Address -> R20
.even
_Bit_Field_Set::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 136
; //#################################位域置1命令#################################
; void Bit_Field_Set(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑或操作
; {uchar clear;
.dbline 137
; Address=Address+0x80;
subi R20,128 ; addi 128
.dbline 138
; Set_CS(0); //使能SPI器件
clr R16
xcall _Set_CS
.dbline 140
;
; SPDR=Address; //送命令,28J60中位域置1命令前3位为100后5位为地址
out 0xf,R20
L67:
.dbline 141
L68:
.dbline 141
; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
sbis 0xe,7
rjmp L67
.dbline 142
; clear=SPSR;
in R20,0xe
.dbline 143
; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
in R20,0xf
.dbline 145
;
; SPDR=date; //送数据
out 0xf,R22
L70:
.dbline 146
L71:
.dbline 146
; while(!(SPSR&0x80));
sbis 0xe,7
rjmp L70
.dbline 147
; clear=SPSR;
in R20,0xe
.dbline 148
; clear=SPDR; //接收到控制寄存器里的数据
in R20,0xf
.dbline 150
;
; Set_CS(1); //关SPI器件
ldi R16,1
xcall _Set_CS
.dbline -2
.dbline 151
; }
L66:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbsym r date 22 c
.dbsym r Address 20 c
.dbend
.dbfunc e Bit_Field_Clear _Bit_Field_Clear fV
; clear -> R20
; date -> R22
; Address -> R20
.even
_Bit_Field_Clear::
xcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 155
; //#################################位域置清0命令#################################
; void Bit_Field_Clear(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑非与操作
; //将所提供数据取反,并接着与指定寄存器的内容进行D0位的逻辑与运算
; {uchar clear;
.dbline 156
; Address=Address+0xa0;
subi R20,96 ; addi 160
.dbline 157
; Set_CS(0); //使能SPI器件
clr R16
xcall _Set_CS
.dbline 159
;
; SPDR=Address; //送命令,28J60中位域置1命令前3位为101后5位为地址
out 0xf,R20
L74:
.dbline 160
L75:
.dbline 160
; while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
sbis 0xe,7
rjmp L74
.dbline 161
; clear=SPSR;
in R20,0xe
.dbline 162
; clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
in R20,0xf
.dbline 164
;
; SPDR=date; //送数据
out 0xf,R22
L77:
.dbline 165
L78:
.dbline 165
; while(!(SPSR&0x80));
sbis 0xe,7
rjmp L77
.dbline 166
; clear=SPSR;
in R20,0xe
.dbline 167
; clear=SPDR; //接收到控制寄存器里的数据
in R20,0xf
.dbline 169
;
; Set_CS(1); //关SPI器件
ldi R16,1
xcall _Set_CS
.dbline -2
.dbline 170
; }
L73:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r clear 20 c
.dbsym r date 22 c
.dbsym r Address 20 c
.dbend
.dbfunc e enc28j60SetBank _enc28j60SetBank fV
; group -> R20
.even
_enc28j60SetBank::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 173
; //#################################寄存器组选择#################################
; void enc28j60SetBank(uchar group)//0,1,2,3
; {
.dbline 174
; Bit_Field_Clear(0x1f,0x03);//先将BSEL1,BSEL0清0
ldi R18,3
ldi R16,31
xcall _Bit_Field_Clear
.dbline 175
clr R21
cpi R20,0
cpc R20,R21
breq L82
X0:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L85
cpi R20,2
ldi R30,0
cpc R21,R30
breq L86
cpi R20,3
ldi R30,0
cpc R21,R30
breq L87
xjmp L81
X1:
.dbline 175
; switch(group){
.dbline 176
; case 0:break;
L85:
.dbline 177
; case 1:Bit_Field_Set(0x1f,0x01);break;
ldi R18,1
ldi R16,31
xcall _Bit_Field_Set
.dbline 177
xjmp L82
L86:
.dbline 178
; case 2:Bit_Field_Set(0x1f,0x02);break;
ldi R18,2
ldi R16,31
xcall _Bit_Field_Set
.dbline 178
xjmp L82
L87:
.dbline 179
; case 3:Bit_Field_Set(0x1f,0x03);break;
ldi R18,3
ldi R16,31
xcall _Bit_Field_Set
.dbline 179
L81:
L82:
.dbline -2
.dbline 181
; }
; }
L80:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r group 20 c
.dbend
.dbfunc e Write_PHY_Register _Write_PHY_Register fV
; flag -> R20
; dateL -> y+6
; dateH -> R22
; Address -> R10
.even
_Write_PHY_Register::
xcall push_gset3
mov R22,R18
mov R10,R16
.dbline -1
.dbline 184
; //#################################写PHY寄存器#################################
; void Write_PHY_Register(uchar Address,uchar dateH,uchar dateL)
; {uchar flag=0x01;
.dbline 184
ldi R20,1
.dbline 185
; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
ldi R16,2
xcall _enc28j60SetBank
.dbline 186
; Write_Control_Register(0x14,Address);//将PHY地址写入MIREGADR寄存器0x14
mov R18,R10
ldi R16,20
xcall _Write_Control_Register
.dbline 187
; Write_Control_Register(0x16,dateL);//将dateL写入MIWRL
ldd R18,y+6
ldi R16,22
xcall _Write_Control_Register
.dbline 188
; Write_Control_Register(0x17,dateH);//将dateH写入MIWRH
mov R18,R22
ldi R16,23
xcall _Write_Control_Register
.dbline 189
; enc28j60SetBank(0x03);//通过ECON1先选中当前控制寄存器组是Bank3,因为接下来的MISTAT寄存器在Bank3。
ldi R16,3
xcall _enc28j60SetBank
xjmp L90
L89:
.dbline 190
ldi R18,10
ldi R16,1
xcall _Read_Control_Register
mov R20,R16
L90:
.dbline 190
; while((flag&0x01)!=0)flag=Read_Control_Register(MII,0x0a);//查询MISTAT.BUSY,等待它清0
sbrc R20,0
rjmp L89
.dbline -2
.dbline 191
; }
L88:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r flag 20 c
.dbsym l dateL 6 c
.dbsym r dateH 22 c
.dbsym r Address 10 c
.dbend
.dbfunc e Read_PHY_Register _Read_PHY_Register fV
; flag -> R20
; Address -> R22
.even
_Read_PHY_Register::
xcall push_gset2
mov R22,R16
.dbline -1
.dbline 194
; //#################################读PHY寄存器#################################
; void Read_PHY_Register(uchar Address)
; {uchar flag=0x01;
.dbline 194
ldi R20,1
.dbline 195
; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
ldi R16,2
xcall _enc28j60SetBank
.dbline 196
; Write_Control_Register(0x14,Address);//将PHY地址写入MIREGADR寄存器0x14
mov R18,R22
ldi R16,20
xcall _Write_Control_Register
.dbline 197
; Write_Control_Register(0x12,0x01);//将MICMD.MIIRD置1
ldi R18,1
ldi R16,18
xcall _Write_Control_Register
.dbline 198
; enc28j60SetBank(0x03);//通过ECON1先选中当前控制寄存器组是Bank3,因为接下来的MISTAT寄存器在Bank3。
ldi R16,3
xcall _enc28j60SetBank
.dbline 199
; Write_Control_Register(0x0a,0x01);//将MISTAT.BUSY置1
ldi R18,1
ldi R16,10
xcall _Write_Control_Register
xjmp L94
L93:
.dbline 200
ldi R18,10
ldi R16,1
xcall _Read_Control_Register
mov R20,R16
L94:
.dbline 200
; while((flag&0x01)!=0)flag=Read_Control_Register(MII,0x0a);//查询MISTAT.BUSY,等待它清0
sbrc R20,0
rjmp L93
.dbline 201
; enc28j60SetBank(0x02);//通过ECON1先选中当前控制寄存器组是Bank2,因为接下来的MIREGADR寄存器在Bank2。
ldi R16,2
xcall _enc28j60SetBank
.dbline 202
; Write_Control_Register(0x12,0x00);//将MICMD.MIIRD清0
clr R18
ldi R16,18
xcall _Write_Control_Register
.dbline 203
; PHY_H=Read_Control_Register(MII,0x19);//从MIRDH中读取PHY中的高8位数据
ldi R18,25
ldi R16,1
xcall _Read_Control_Register
sts _PHY_H,R16
.dbline 204
; PHY_L=Read_Control_Register(MII,0x18);//从MIRDL中读取PHY中的低8位数据
ldi R18,24
ldi R16,1
xcall _Read_Control_Register
sts _PHY_L,R16
.dbline -2
.dbline 205
; }
L92:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r flag 20 c
.dbsym r Address 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -