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

📄 enc28j60.lis

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