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

📄 at45db041d.lis

📁 用ATMEGA16的硬件SPI驱动AT45DB041D
💻 LIS
📖 第 1 页 / 共 5 页
字号:
 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 + -