📄 232toudp.lst
字号:
0635 B388 IN R24,0x18
0636 7E8F ANDI R24,0xEF
0637 BB88 OUT 0x18,R24
(0017) }
0638 9508 RET
_Reset_28J60:
clear --> R20
0639 940E0768 CALL push_gset1
(0018) //################################28J60复位#####################################
(0019) void Reset_28J60(void)
(0020) {uchar clear;
(0021) Set_CS(0); //使能SPI器件
063B 2700 CLR R16
063C DFF4 RCALL _Set_CS
(0022) SPDR=0xFF; //复位指令
063D EF8F LDI R24,0xFF
063E B98F OUT 0x0F,R24
(0023) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
063F 9B77 SBIS 0x0E,7
0640 CFFE RJMP 0x063F
(0024) clear=SPSR;
0641 B14E IN R20,0x0E
(0025) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
0642 B14F IN R20,0x0F
(0026) Set_CS(1); //关SPI器件
0643 E001 LDI R16,1
0644 DFEC RCALL _Set_CS
(0027) }
0645 940E076B CALL pop_gset1
0647 9508 RET
_Read_Control_Register:
clear --> R20
address --> R10
EM --> R22
0648 940E0783 CALL push_gset3
064A 2EA2 MOV R10,R18
064B 2F60 MOV R22,R16
(0028) //#########################读28J60控制寄存器#################################
(0029) uchar Read_Control_Register(uchar EM,uchar address)
(0030) //EM=0表示读的是ETH,EM=1表示读的是MAC和MII控制寄存器
(0031) {uchar clear;
(0032) Set_CS(0); //使能SPI器件
064C 2700 CLR R16
064D DFE3 RCALL _Set_CS
(0033)
(0034) SPDR=address; //送地址,28J60中控制寄存器读操作前3位为0后5位为地址
064E B8AF OUT 0x0F,R10
(0035) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
064F 9B77 SBIS 0x0E,7
0650 CFFE RJMP 0x064F
(0036) clear=SPSR;
0651 B14E IN R20,0x0E
(0037) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
0652 B14F IN R20,0x0F
(0038)
(0039) SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据,
0653 EC80 LDI R24,0xC0
0654 B98F OUT 0x0F,R24
(0040) //这里因为28J60中没有用到0xc0指令固先用0xc0作为随便一个数
(0041) while(!(SPSR&0x80));
0655 9B77 SBIS 0x0E,7
0656 CFFE RJMP 0x0655
(0042) clear=SPSR;
0657 B14E IN R20,0x0E
(0043) clear=SPDR; //接收到控制寄存器里的数据
0658 B14F IN R20,0x0F
(0044) if(EM==1){
0659 3061 CPI R22,1
065A F431 BNE 0x0661
(0045) SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
065B EC80 LDI R24,0xC0
065C B98F OUT 0x0F,R24
(0046) while(!(SPSR&0x80));
065D 9B77 SBIS 0x0E,7
065E CFFE RJMP 0x065D
(0047) clear=SPSR;
065F B14E IN R20,0x0E
(0048) clear=SPDR; //接收到控制寄存器里的数据
0660 B14F IN R20,0x0F
(0049) }//因为读MAC和MII寄存器时读出来的第一个字节是无效的,因此要读两次
(0050) Set_CS(1); //关SPI器件
0661 E001 LDI R16,1
0662 DFCE RCALL _Set_CS
(0051) return clear;
0663 2F04 MOV R16,R20
0664 940E0762 CALL pop_gset3
0666 9508 RET
_Write_Control_Register:
clear --> R20
date --> R22
address --> R20
0667 940E077F CALL push_gset2
0669 2F62 MOV R22,R18
066A 2F40 MOV R20,R16
(0052) }
(0053) //###########################写28J60控制寄存器##################################
(0054) void Write_Control_Register(uchar address,uchar date)
(0055) {uchar clear;
(0056) address=address+0x40;//28J60中控制寄存器写操作前3位为010后5位为地址
066B 5C40 SUBI R20,0xC0
(0057) Set_CS(0); //使能SPI器件
066C 2700 CLR R16
066D DFC3 RCALL _Set_CS
(0058)
(0059) SPDR=address; //送地址,28J60中控制寄存器写操作前3位为010后5位为地址
066E B94F OUT 0x0F,R20
(0060) while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
066F 9B77 SBIS 0x0E,7
0670 CFFE RJMP 0x066F
(0061) clear=SPSR;
0671 B14E IN R20,0x0E
(0062) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
0672 B14F IN R20,0x0F
(0063)
(0064) SPDR=date;
0673 B96F OUT 0x0F,R22
(0065) while(!(SPSR&0x80));
0674 9B77 SBIS 0x0E,7
0675 CFFE RJMP 0x0674
(0066) clear=SPSR;
0676 B14E IN R20,0x0E
(0067) clear=SPDR;
0677 B14F IN R20,0x0F
(0068)
(0069) Set_CS(1); //关SPI器件
0678 E001 LDI R16,1
0679 DFB7 RCALL _Set_CS
(0070) }
067A 940E075F CALL pop_gset2
067C 9508 RET
_Read_Buffer_Memory_order:
clear --> R20
067D 940E0768 CALL push_gset1
(0071) //#########################读缓冲存储器#################################
(0072) void Read_Buffer_Memory_order(void)//送读缓冲存储器命令,连续读时用到
(0073) {uchar clear;
(0074) Set_CS(0); //使能SPI器件
067F 2700 CLR R16
0680 DFB0 RCALL _Set_CS
(0075)
(0076) SPDR=0x3A; //送命令,28J60中读缓冲存储器操作前3位为001后5位为常量11010
0681 E38A LDI R24,0x3A
0682 B98F OUT 0x0F,R24
(0077) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
0683 9B77 SBIS 0x0E,7
0684 CFFE RJMP 0x0683
(0078) clear=SPSR;
0685 B14E IN R20,0x0E
(0079) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
0686 B14F IN R20,0x0F
(0080) }
0687 940E076B CALL pop_gset1
0689 9508 RET
(0081) uchar Read_Buffer_Memory_date(void)//收到读到的数据,连续读时用到此函数
(0082) {uchar clear;
(0083) SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
_Read_Buffer_Memory_date:
clear --> R16
068A EC80 LDI R24,0xC0
068B B98F OUT 0x0F,R24
(0084) while(!(SPSR&0x80));
068C 9B77 SBIS 0x0E,7
068D CFFE RJMP 0x068C
(0085) clear=SPSR;
068E B10E IN R16,0x0E
(0086) clear=SPDR; //接收到控制寄存器里的数据
068F B10F IN R16,0x0F
(0087) return clear;//返回读到的数据
0690 9508 RET
(0088) }
(0089) void Read_Buffer_Memory_END(void)//读结束
(0090) {Set_CS(1); //关SPI器件
_Read_Buffer_Memory_END:
0691 E001 LDI R16,1
(0091) }
0692 CF9E RJMP _Set_CS
_Read_Buffer_Memory:
clear --> R20
0693 940E0768 CALL push_gset1
(0092) //#########################读缓冲存储器#################################
(0093) uchar Read_Buffer_Memory(void)//只读一次,地址是由ERDPT指向的存储器中的数据将从SO脚移出
(0094) {uchar clear;
(0095) Set_CS(0); //使能SPI器件
0695 2700 CLR R16
0696 DF9A RCALL _Set_CS
(0096)
(0097) SPDR=0x3A; //送命令,28J60中读缓冲存储器操作前3位为001后5位为常量11010
0697 E38A LDI R24,0x3A
0698 B98F OUT 0x0F,R24
(0098) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
0699 9B77 SBIS 0x0E,7
069A CFFE RJMP 0x0699
(0099) clear=SPSR;
069B B14E IN R20,0x0E
(0100) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
069C B14F IN R20,0x0F
(0101)
(0102) SPDR=0xc0;//随便送个数以起动时钟以接收从28J60控制寄存器里传来的数据
069D EC80 LDI R24,0xC0
069E B98F OUT 0x0F,R24
(0103) while(!(SPSR&0x80));
069F 9B77 SBIS 0x0E,7
06A0 CFFE RJMP 0x069F
(0104) clear=SPSR;
06A1 B14E IN R20,0x0E
(0105) clear=SPDR; //接收到控制寄存器里的数据
06A2 B14F IN R20,0x0F
(0106)
(0107) Set_CS(1); //关SPI器件
06A3 E001 LDI R16,1
06A4 DF8C RCALL _Set_CS
(0108) return clear;
06A5 2F04 MOV R16,R20
06A6 940E076B CALL pop_gset1
06A8 9508 RET
_Write_Buffer_Memory_date:
clear --> R20
date --> R16
06A9 940E0768 CALL push_gset1
(0109) }
(0110) //#########################写缓冲存储器#################################
(0111) void Write_Buffer_Memory_date(uchar date)//写入缓冲存储器数据
(0112) {uchar clear;
(0113) SPDR=date;
06AB B90F OUT 0x0F,R16
(0114) while(!(SPSR&0x80));
06AC 9B77 SBIS 0x0E,7
06AD CFFE RJMP 0x06AC
(0115) clear=SPSR;
06AE B14E IN R20,0x0E
(0116) clear=SPDR;
06AF B14F IN R20,0x0F
(0117) }
06B0 940E076B CALL pop_gset1
06B2 9508 RET
_Write_Buffer_Memory_once:
clear --> R20
date --> R22
06B3 940E077F CALL push_gset2
06B5 2F60 MOV R22,R16
(0118) void Write_Buffer_Memory_once(uchar date)//只写一次,地址是由EWRPT指向的存储器
(0119) {uchar clear;
(0120) Set_CS(0); //使能SPI器件
06B6 2700 CLR R16
06B7 DF79 RCALL _Set_CS
(0121)
(0122) SPDR=0x7A; //送命令,28J60中写缓冲存储器操作前3位为011后5位为常量11010
06B8 E78A LDI R24,0x7A
06B9 B98F OUT 0x0F,R24
(0123) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
06BA 9B77 SBIS 0x0E,7
06BB CFFE RJMP 0x06BA
(0124) clear=SPSR;
06BC B14E IN R20,0x0E
(0125) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
06BD B14F IN R20,0x0F
(0126)
(0127) SPDR=date;
06BE B96F OUT 0x0F,R22
(0128) while(!(SPSR&0x80));
06BF 9B77 SBIS 0x0E,7
06C0 CFFE RJMP 0x06BF
(0129) clear=SPSR;
06C1 B14E IN R20,0x0E
(0130) clear=SPDR;
06C2 B14F IN R20,0x0F
(0131)
(0132) Set_CS(1); //关SPI器件
06C3 E001 LDI R16,1
06C4 DF6C RCALL _Set_CS
(0133) }
06C5 940E075F CALL pop_gset2
06C7 9508 RET
_Bit_Field_Set:
clear --> R20
date --> R22
Address --> R20
06C8 940E077F CALL push_gset2
06CA 2F62 MOV R22,R18
06CB 2F40 MOV R20,R16
(0134) //#################################位域置1命令#################################
(0135) void Bit_Field_Set(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑或操作
(0136) {uchar clear;
(0137) Address=Address+0x80;
06CC 5840 SUBI R20,0x80
(0138) Set_CS(0); //使能SPI器件
06CD 2700 CLR R16
06CE DF62 RCALL _Set_CS
(0139)
(0140) SPDR=Address; //送命令,28J60中位域置1命令前3位为100后5位为地址
06CF B94F OUT 0x0F,R20
(0141) while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
06D0 9B77 SBIS 0x0E,7
06D1 CFFE RJMP 0x06D0
(0142) clear=SPSR;
06D2 B14E IN R20,0x0E
(0143) clear=SPDR; //通过先读SPSR,紧接着访问SPDR来对SPIF清零
06D3 B14F IN R20,0x0F
(0144)
(0145) SPDR=date; //送数据
06D4 B96F OUT 0x0F,R22
(0146) while(!(SPSR&0x80));
06D5 9B77 SBIS 0x0E,7
06D6 CFFE RJMP 0x06D5
(0147) clear=SPSR;
06D7 B14E IN R20,0x0E
(0148) clear=SPDR; //接收到控制寄存器里的数据
06D8 B14F IN R20,0x0F
(0149)
(0150) Set_CS(1); //关SPI器件
06D9 E001 LDI R16,1
06DA DF56 RCALL _Set_CS
(0151) }
06DB 940E075F CALL pop_gset2
06DD 9508 RET
_Bit_Field_Clear:
clear --> R20
date --> R22
Address --> R20
06DE 940E077F CALL push_gset2
06E0 2F62 MOV R22,R18
06E1 2F40 MOV R20,R16
(0152) //#################################位域置清0命令#################################
(0153) void Bit_Field_Clear(uchar Address,uchar date)//指定地址的ETH控制寄存器的内容与date进行位逻辑非与操作
(0154) //将所提供数据取反,并接着与指定寄存器的内容进行D0位的逻辑与运算
(0155) {uchar clear;
(0156) Address=Address+0xa0;
06E2 5640 SUBI R20,0x60
(0157) Set_CS(0); //使能SPI器件
06E3 2700 CLR R16
06E4 DF4C RCALL _Set_CS
(0158)
(0159) SPDR=Address; //送命令,28J60中位域置1命令前3位为101后5位为地址
06E5 B94F OUT 0x0F,R20
(0160) while(!(SPSR&0x80));/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -