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

📄 enc28j60.s

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