📄 at45db041d.lis
字号:
008C .dbline 0 ; func end
008C 0895 ret
008E .dbsym r cData 16 c
008E .dbend
008E .dbfunc e Enable_DFLASH _Enable_DFLASH fV
008E ; i -> R16
.even
008E _Enable_DFLASH::
008E .dbline -1
008E .dbline 109
008E ; }
008E ; /************************************************************
008E ; *使能FLASH(低电平使能)
008E ; ************************************************************/
008E ; void Enable_DFLASH(void)
008E ; {
008E .dbline 110
008E ; unsigned char i=255;
008E 0FEF ldi R16,255
0090 L31:
0090 .dbline 111
0090 ; while(i--); //延长上一次高电平时间
0090 L32:
0090 .dbline 111
0090 202E mov R2,R16
0092 3324 clr R3
0094 0150 subi R16,1
0096 2220 tst R2
0098 D9F7 brne L31
009A X6:
009A .dbline 112
009A ; SPI_PORT&=~(1<<SS);
009A C498 cbi 0x18,4
009C .dbline -2
009C L30:
009C .dbline 0 ; func end
009C 0895 ret
009E .dbsym r i 16 c
009E .dbend
009E .dbfunc e Disable_DFLASH _Disable_DFLASH fV
009E ; i -> R16
.even
009E _Disable_DFLASH::
009E .dbline -1
009E .dbline 118
009E ; }
009E ; /************************************************************
009E ; *禁止FLASH(高电平禁止)
009E ; ************************************************************/
009E ; void Disable_DFLASH(void)
009E ; {
009E .dbline 119
009E ; unsigned char i=255;
009E 0FEF ldi R16,255
00A0 .dbline 120
00A0 ; SPI_PORT|=(1<<SS);
00A0 C49A sbi 0x18,4
00A2 L35:
00A2 .dbline 121
00A2 ; while(i--); //延长高电平时间
00A2 L36:
00A2 .dbline 121
00A2 202E mov R2,R16
00A4 3324 clr R3
00A6 0150 subi R16,1
00A8 2220 tst R2
00AA D9F7 brne L35
00AC X7:
00AC .dbline -2
00AC L34:
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r i 16 c
00AE .dbend
00AE .dbfunc e DF_Read_status_Register _DF_Read_status_Register fc
00AE ; rData -> R10
.even
00AE _DF_Read_status_Register::
00AE AA92 st -y,R10
00B0 .dbline -1
00B0 .dbline 130
00B0 ; }
00B0 ; /************************************************************
00B0 ; *读取FLASH内部状态寄存器
00B0 ; *Bit 7:Ready/busy status (1:no busy ; 0:busy)
00B0 ; *Bit 6:Compare (1: no matche ; 0:matche) 最近的一次比较结果
00B0 ; *Bit 0:PAGE SIZE (1:256 bytes ; 0:264 bytes)
00B0 ; ************************************************************/
00B0 ; unsigned char DF_Read_status_Register(void)
00B0 ; {
00B0 .dbline 131
00B0 ; unsigned char rData=0;
00B0 .dbline 132
00B0 ; Enable_DFLASH();
00B0 EEDF xcall _Enable_DFLASH
00B2 .dbline 134
00B2 ;
00B2 ; SPI_Write_Byte(Status_Register_Opcode);//write opcode
00B2 07ED ldi R16,215
00B4 CFDF xcall _SPI_Write_Byte
00B6 .dbline 136
00B6 ;
00B6 ; rData = SPI_Read_Byte(0x00);//read device's status
00B6 0027 clr R16
00B8 E5DF xcall _SPI_Read_Byte
00BA A02E mov R10,R16
00BC .dbline 138
00BC ;
00BC ; Disable_DFLASH();
00BC F0DF xcall _Disable_DFLASH
00BE .dbline 140
00BE ;
00BE ; return rData;
00BE 0A2D mov R16,R10
00C0 .dbline -2
00C0 L38:
00C0 .dbline 0 ; func end
00C0 A990 ld R10,y+
00C2 0895 ret
00C4 .dbsym r rData 10 c
00C4 .dbend
00C4 .dbfunc e DF_Check_Page_Size _DF_Check_Page_Size fc
00C4 ; Page_Size -> R10
.even
00C4 _DF_Check_Page_Size::
00C4 AA92 st -y,R10
00C6 .dbline -1
00C6 .dbline 147
00C6 ; }
00C6 ; /************************************************************
00C6 ; *读取FLASH的页大小
00C6 ; *返回1表示每一页的大小为264 bytes,否则为256 bytes
00C6 ; ************************************************************/
00C6 ; unsigned char DF_Check_Page_Size(void)
00C6 ; {
00C6 .dbline 149
00C6 ; unsigned char Page_Size;
00C6 ; Page_Size=DF_Read_status_Register();
00C6 F3DF xcall _DF_Read_status_Register
00C8 A02E mov R10,R16
00CA .dbline 150
00CA ; if(Page_Size&0x01) return 0;
00CA 00FF sbrs R16,0
00CC 02C0 rjmp L40
00CE X8:
00CE .dbline 150
00CE 0027 clr R16
00D0 01C0 xjmp L39
00D2 L40:
00D2 .dbline 151
00D2 ; return 1;
00D2 01E0 ldi R16,1
00D4 .dbline -2
00D4 L39:
00D4 .dbline 0 ; func end
00D4 A990 ld R10,y+
00D6 0895 ret
00D8 .dbsym r Page_Size 10 c
00D8 .dbend
00D8 .dbfunc e DF_Check_Busy_State _DF_Check_Busy_State fc
00D8 ; state -> R10
00D8 ; i -> R20
.even
00D8 _DF_Check_Busy_State::
00D8 AA92 st -y,R10
00DA 4A93 st -y,R20
00DC .dbline -1
00DC .dbline 157
00DC ; }
00DC ; /************************************************************
00DC ; *读取FLASH忙标志位(最多判断255次,不行还是返回且返回0)
00DC ; ************************************************************/
00DC ; unsigned char DF_Check_Busy_State(void)
00DC ; {
00DC .dbline 159
00DC ; unsigned char state;
00DC ; unsigned char i=255;
00DC 4FEF ldi R20,255
00DE 06C0 xjmp L44
00E0 L43:
00E0 .dbline 161
00E0 ; while(i)
00E0 ; {
00E0 .dbline 162
00E0 ; state=DF_Read_status_Register();
00E0 E6DF xcall _DF_Read_status_Register
00E2 A02E mov R10,R16
00E4 .dbline 163
00E4 ; if(state & 0x80) break; //读取的最高位0时器件忙
00E4 07FF sbrs R16,7
00E6 01C0 rjmp L46
00E8 X9:
00E8 .dbline 163
00E8 03C0 xjmp L45
00EA L46:
00EA .dbline 164
00EA ; --i;
00EA 4A95 dec R20
00EC .dbline 165
00EC ; }
00EC L44:
00EC .dbline 160
00EC 4423 tst R20
00EE C1F7 brne L43
00F0 X10:
00F0 L45:
00F0 .dbline 166
00F0 ; return i;
00F0 042F mov R16,R20
00F2 .dbline -2
00F2 L42:
00F2 .dbline 0 ; func end
00F2 4991 ld R20,y+
00F4 A990 ld R10,y+
00F6 0895 ret
00F8 .dbsym r state 10 c
00F8 .dbsym r i 20 c
00F8 .dbend
00F8 .dbfunc e DF_Manufacturer_and_Device_ID _DF_Manufacturer_and_Device_ID fV
00F8 ; i -> R20
00F8 ; ID -> R10,R11
.even
00F8 _DF_Manufacturer_and_Device_ID::
00F8 0E940000 xcall push_xgset300C
00FC 5801 movw R10,R16
00FE .dbline -1
00FE .dbline 175
00FE ; }
00FE ; /************************************************************
00FE ; *读取FLASH的产家ID的芯片ID等内容;
00FE ; *以下函数会返回四个值,第一个数对AT45DB041D来说为0x1F;
00FE ; *第四个数为 0x00;
00FE ; *用此函数可以判断芯片的好坏,是否正常;
00FE ; ************************************************************/
00FE ; void DF_Manufacturer_and_Device_ID(unsigned char *ID)
00FE ; {
00FE .dbline 178
00FE ; unsigned char i;
00FE ;
00FE ; DF_Check_Busy_State();
00FE ECDF xcall _DF_Check_Busy_State
0100 .dbline 180
0100 ;
0100 ; Enable_DFLASH();
0100 C6DF xcall _Enable_DFLASH
0102 .dbline 182
0102 ;
0102 ; SPI_Write_Byte(Device_ID_Opcode);
0102 0FE9 ldi R16,159
0104 A7DF xcall _SPI_Write_Byte
0106 .dbline 184
0106 ;
0106 ; for(i=0;i<4;i++)
0106 4427 clr R20
0108 08C0 xjmp L52
010A L49:
010A .dbline 185
010A ; {
010A .dbline 186
010A ; ID[i] = SPI_Read_Byte(0);
010A 0027 clr R16
010C BBDF xcall _SPI_Read_Byte
010E E42F mov R30,R20
0110 FF27 clr R31
0112 EA0D add R30,R10
0114 FB1D adc R31,R11
0116 0083 std z+0,R16
0118 .dbline 187
0118 ; }
0118 L50:
0118 .dbline 184
0118 4395 inc R20
011A L52:
011A .dbline 184
011A 4430 cpi R20,4
011C B0F3 brlo L49
011E X11:
011E .dbline 189
011E ;
011E ; Disable_DFLASH();
011E BFDF xcall _Disable_DFLASH
0120 .dbline -2
0120 L48:
0120 .dbline 0 ; func end
0120 0C940000 xjmp pop_xgset300C
0124 .dbsym r i 20 c
0124 .dbsym r ID 10 pc
0124 .dbend
0124 .dbfunc e Test_Manufacturer_ID _Test_Manufacturer_ID fc
0124 ; Test_Buf -> y+0
.even
0124 _Test_Manufacturer_ID::
0124 2497 sbiw R28,4
0126 .dbline -1
0126 .dbline 195
0126 ; }
0126 ; /************************************************************
0126 ; *测试FLASH产家ID,正常返回1,否则返回0
0126 ; ************************************************************/
0126 ; unsigned char Test_Manufacturer_ID(void)
0126 ; {
0126 .dbline 197
0126 ; unsigned char Test_Buf[4];
0126 ; DF_Manufacturer_and_Device_ID(Test_Buf);
0126 8E01 movw R16,R28
0128 E7DF xcall _DF_Manufacturer_and_Device_ID
012A .dbline 198
012A ; if(Test_Buf[0]!=0x1F) return 0; //产家ID不为0x1F则返回0
012A 8881 ldd R24,y+0
012C 8F31 cpi R24,31
012E 11F0 breq L54
0130 X12:
0130 .dbline 198
0130 0027 clr R16
0132 01C0 xjmp L53
0134 L54:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -