📄 at45db041.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E0138 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\教程\at45db041\at45db041.c
(0001) /**************************************
(0002) ** Filename: at45db041.c
(0003) ** Describe: Flash 存储器at45db041
(0004) ** Author : 古欣 www.avrvi.com
(0005) ** Time : 2007-2-14
(0006) **************************************/
(0007)
(0008) #include "config.h"
(0009)
(0010) /**************************************
(0011) ** 说明:初始化 at45db041
(0012) ** 除SO对应引脚为输入外,其余都设为输出,RESET高,CS低,芯片工作
(0013) **************************************/
(0014) void at4541_init(void)
(0015) {
(0016) DDR_RESET_SET();
_at4541_init:
004B 9AD0 SBI 0x1A,0
(0017) DDR_CS_SET();
004C 9AD1 SBI 0x1A,1
(0018) DDR_SCK_SET();
004D 9AD2 SBI 0x1A,2
(0019) DDR_SI_SET();
004E 9AD3 SBI 0x1A,3
(0020) DDR_SO_SET();
004F 98D4 CBI 0x1A,4
(0021)
(0022) CS_LOW();
0050 98D9 CBI 0x1B,1
(0023) RESET_HIGH();
0051 9AD8 SBI 0x1B,0
0052 9508 RET
(0024) }
(0025)
(0026) /**************************************
(0027) ** 说明:RDY/~BUSY引脚为高表示准备好
(0028) ** 低表示内部忙
(0029) **************************************/
(0030) unsigned char at4541_check_busy(void)
(0031) {
(0032) if((AT4541_PIN&CHEAK_BUSY)==CHEAK_BUSY)
_at4541_check_busy:
0053 B389 IN R24,0x19
0054 7280 ANDI R24,0x20
0055 3280 CPI R24,0x20
0056 F411 BNE 0x0059
(0033) {
(0034) return 1;
0057 E001 LDI R16,1
0058 C001 RJMP 0x005A
(0035) }
(0036) else
(0037) {
(0038) return 0;
0059 2700 CLR R16
005A 9508 RET
_at4541_commond_send:
i --> R20
address --> R22
commond --> R10
005B 940E01FB CALL push_gset3
005D 01B9 MOVW R22,R18
005E 0158 MOVW R10,R16
(0039) }
(0040) }
(0041)
(0042)
(0043) /**************************************
(0044) ** 说明:发送操作命令 (0xe800读)(0x8200写)
(0045) ** 数据格式:16位命令字,16位地址位,32位任意数
(0046) ** 输入:命令字,地址位
(0047) **************************************/
(0048) void at4541_commond_send(unsigned int commond,unsigned int address)
(0049) {
(0050) unsigned char i=0;
005F 2744 CLR R20
(0051) SCK_HIGH();
0060 9ADA SBI 0x1B,2
(0052) RESET_HIGH();
0061 9AD8 SBI 0x1B,0
(0053) CS_HIGH();
0062 9AD9 SBI 0x1B,1
(0054) delay_1ms();
0063 940E016F CALL _delay_1ms
(0055) CS_LOW();
0065 98D9 CBI 0x1B,1
(0056) delay_1ms();
0066 940E016F CALL _delay_1ms
(0057) //16位命令字
(0058) for(i=0;i<16;i++)
0068 C013 RJMP 0x007C
(0059) {
(0060) SCK_LOW();
0069 98DA CBI 0x1B,2
(0061) if((commond&0x8000)==0x8000)
006A 01C5 MOVW R24,R10
006B 7080 ANDI R24,0
006C 7890 ANDI R25,0x80
006D 3080 CPI R24,0
006E E8E0 LDI R30,0x80
006F 079E CPC R25,R30
0070 F411 BNE 0x0073
(0062) SI_HIGH();
0071 9ADB SBI 0x1B,3
0072 C001 RJMP 0x0074
(0063) else
(0064) SI_LOW();
0073 98DB CBI 0x1B,3
(0065) delay_1ms();
0074 940E016F CALL _delay_1ms
(0066) SCK_HIGH();
0076 9ADA SBI 0x1B,2
(0067) delay_1ms();
0077 940E016F CALL _delay_1ms
(0068) commond=commond<<1;
0079 0CAA LSL R10
007A 1CBB ROL R11
007B 9543 INC R20
007C 3140 CPI R20,0x10
007D F358 BCS 0x0069
(0069) }
(0070) //16位地址位
(0071) for(i=0;i<16;i++)
007E 2744 CLR R20
007F C013 RJMP 0x0093
(0072) {
(0073) SCK_LOW();
0080 98DA CBI 0x1B,2
(0074) if((address&0x8000)==0x8000)
0081 01CB MOVW R24,R22
0082 7080 ANDI R24,0
0083 7890 ANDI R25,0x80
0084 3080 CPI R24,0
0085 E8E0 LDI R30,0x80
0086 079E CPC R25,R30
0087 F411 BNE 0x008A
(0075) SI_HIGH();
0088 9ADB SBI 0x1B,3
0089 C001 RJMP 0x008B
(0076) else
(0077) SI_LOW();
008A 98DB CBI 0x1B,3
(0078) delay_1ms();
008B 940E016F CALL _delay_1ms
(0079) SCK_HIGH();
008D 9ADA SBI 0x1B,2
(0080) delay_1ms();
008E 940E016F CALL _delay_1ms
(0081) address=address<<1;
0090 0F66 LSL R22
0091 1F77 ROL R23
0092 9543 INC R20
0093 3140 CPI R20,0x10
0094 F358 BCS 0x0080
(0082) }
(0083) //32位任意位
(0084) for(i=0;i<32;i++)
0095 2744 CLR R20
0096 C007 RJMP 0x009E
(0085) {
(0086) SCK_LOW();
0097 98DA CBI 0x1B,2
(0087) delay_1ms();
0098 940E016F CALL _delay_1ms
(0088) SCK_HIGH();
009A 9ADA SBI 0x1B,2
(0089) delay_1ms();
009B 940E016F CALL _delay_1ms
009D 9543 INC R20
009E 3240 CPI R20,0x20
009F F3B8 BCS 0x0097
00A0 940E01F1 CALL pop_gset3
00A2 9508 RET
_at4541_read:
temp1 --> R20
temp2 --> R22
i --> R10
00A3 940E01FB CALL push_gset3
(0090) }
(0091) }
(0092)
(0093) /**************************************
(0094) ** 说明:读at45db41
(0095) ** 数据:在执行at4541_commond_send(发送读命令)之后,8位的数从SO输出
(0096) ** 输出:读出的一位数
(0097) **************************************/
(0098) unsigned char at4541_read(void)
(0099) {
(0100) unsigned char i=0,temp1=0,temp2=0;
00A5 24AA CLR R10
00A6 2744 CLR R20
00A7 2766 CLR R22
(0101) //读出8位,组合在temp2里
(0102) for(i=0;i<8;i++)
00A8 C014 RJMP 0x00BD
(0103) {
(0104) SCK_LOW();
00A9 98DA CBI 0x1B,2
(0105) delay_1ms();
00AA 940E016F CALL _delay_1ms
(0106) if(SO_PIN_HIGH)
00AC B389 IN R24,0x19
00AD 7180 ANDI R24,0x10
00AE 3180 CPI R24,0x10
00AF F411 BNE 0x00B2
(0107) temp1=1;
00B0 E041 LDI R20,1
00B1 C001 RJMP 0x00B3
(0108) else
(0109) temp1=0;
00B2 2744 CLR R20
(0110) temp2=temp2<<1+temp1;
00B3 2F14 MOV R17,R20
00B4 5F1F SUBI R17,0xFF
00B5 2F06 MOV R16,R22
00B6 940E0216 CALL lsl8
00B8 2F60 MOV R22,R16
(0111) SCK_HIGH();
00B9 9ADA SBI 0x1B,2
(0112) delay_1ms();
00BA 940E016F CALL _delay_1ms
00BC 94A3 INC R10
00BD 2D8A MOV R24,R10
00BE 3088 CPI R24,0x8
00BF F348 BCS 0x00A9
(0113) }
(0114) return temp2;
00C0 2F06 MOV R16,R22
00C1 940E01F1 CALL pop_gset3
00C3 9508 RET
_at4541_write:
i --> R20
data --> R22
00C4 940E01FD CALL push_gset2
00C6 2F60 MOV R22,R16
(0115) }
(0116)
(0117) /**************************************
(0118) ** 说明:写at45db41
(0119) ** 数据:在执行at4541_commond_send(发送写命令)之后,8位的数写入
(0120) ** 输出:写入的一位数
(0121) **************************************/
(0122) void at4541_write(unsigned char data)
(0123) {
(0124) unsigned char i=0;
00C7 2744 CLR R20
(0125) //生成写入时序
(0126) for(i=0;i<8;i++)
00C8 C00D RJMP 0x00D6
(0127) {
(0128) SCK_LOW();
00C9 98DA CBI 0x1B,2
(0129) if(data&0x80==0x80)
00CA FF60 SBRS R22,0
00CB C002 RJMP 0x00CE
(0130) SI_HIGH();
00CC 9ADB SBI 0x1B,3
00CD C001 RJMP 0x00CF
(0131) else
(0132) SI_LOW();
00CE 98DB CBI 0x1B,3
(0133) delay_1ms();
00CF 940E016F CALL _delay_1ms
(0134) SCK_HIGH();
00D1 9ADA SBI 0x1B,2
(0135) delay_1ms();
00D2 940E016F CALL _delay_1ms
(0136) data=data<<1;
00D4 0F66 LSL R22
00D5 9543 INC R20
00D6 3048 CPI R20,0x8
00D7 F388 BCS 0x00C9
00D8 940E01EE CALL pop_gset2
00DA 9508 RET
_at4541_read_status:
temp1 --> R20
temp2 --> R22
i --> R10
commond --> R12
00DB 940E01F9 CALL push_gset4
00DD 2EC0 MOV R12,R16
(0137) }
(0138) }
(0139)
(0140) /**************************************
(0141) ** 说明:读取寄存器状态
(0142) ** 操作流程:将57H或D7H操作代码传给at45db041
(0143) ** 随后芯片从SO输出8位寄存器信息,高位在前
(0144) **************************************/
(0145) unsigned char at4541_read_status(unsigned char commond)
(0146) {
(0147) unsigned char i=0,temp1=0,temp2=0;
00DE 24AA CLR R10
00DF 2744 CLR R20
00E0 2766 CLR R22
(0148) SCK_HIGH();
00E1 9ADA SBI 0x1B,2
(0149) RESET_HIGH();
00E2 9AD8 SBI 0x1B,0
(0150) CS_HIGH();
00E3 9AD9 SBI 0x1B,1
(0151) delay_1ms();
00E4 940E016F CALL _delay_1ms
(0152) CS_LOW();
00E6 98D9 CBI 0x1B,1
(0153) delay_1ms();
00E7 940E016F CALL _delay_1ms
(0154) //本循环把8位command传给at45db041
(0155) for(i=0;i<8;i++)
00E9 C00F RJMP 0x00F9
(0156) {
(0157) SCK_LOW();
00EA 98DA CBI 0x1B,2
(0158) if((commond&0x80)==0x80)
00EB 2D8C MOV R24,R12
00EC 7880 ANDI R24,0x80
00ED 3880 CPI R24,0x80
00EE F411 BNE 0x00F1
(0159) SI_HIGH();
00EF 9ADB SBI 0x1B,3
00F0 C001 RJMP 0x00F2
(0160) else
(0161) SI_LOW();
00F1 98DB CBI 0x1B,3
(0162) delay_1ms();
00F2 940E016F CALL _delay_1ms
(0163) SCK_HIGH();
00F4 9ADA SBI 0x1B,2
(0164) delay_1ms();
00F5 940E016F CALL _delay_1ms
(0165) commond=commond<<1;
00F7 0CCC LSL R12
00F8 94A3 INC R10
00F9 2D8A MOV R24,R10
00FA 3088 CPI R24,0x8
00FB F370 BCS 0x00EA
(0166) }
(0167) //本循环接收传回的八位数据
(0168) for(i=0;i<8;i++)
00FC 24AA CLR R10
00FD C014 RJMP 0x0112
(0169) {
(0170) SCK_LOW();
00FE 98DA CBI 0x1B,2
(0171) delay_1ms();
00FF 940E016F CALL _delay_1ms
(0172)
(0173) if(SO_PIN_HIGH)
0101 B389 IN R24,0x19
0102 7180 ANDI R24,0x10
0103 3180 CPI R24,0x10
0104 F411 BNE 0x0107
(0174) temp1 = 1;
0105 E041 LDI R20,1
0106 C001 RJMP 0x0108
(0175) else
(0176) temp1 = 0;
0107 2744 CLR R20
(0177)
(0178) temp2 = temp2<<1 + temp1;
0108 2F14 MOV R17,R20
0109 5F1F SUBI R17,0xFF
010A 2F06 MOV R16,R22
010B 940E0216 CALL lsl8
010D 2F60 MOV R22,R16
(0179) SCK_HIGH();
010E 9ADA SBI 0x1B,2
(0180) delay_1ms();
010F 940E016F CALL _delay_1ms
0111 94A3 INC R10
0112 2D8A MOV R24,R10
0113 3088 CPI R24,0x8
0114 F348 BCS 0x00FE
(0181) }
(0182) CS_HIGH(); //停止输出
0115 9AD9 SBI 0x1B,1
(0183)
(0184) delay_ms(500);
0116 EF04 LDI R16,0xF4
0117 E011 LDI R17,1
0118 940E01AF CALL _delay_ms
(0185)
(0186) return temp2;
011A 2F06 MOV R16,R22
011B 940E01F4 CALL pop_gset4
011D 9508 RET
(0187) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -