📄 at45db161d.lis
字号:
.module at45db161d.c
.area text(rom, con, rel)
0000 .dbfile E:\ICC128\2008控制台\2008console0TEST\flashTest\at45db161d.c
0000 .dbfunc e df_init _df_init fV
.even
0000 _df_init::
0000 .dbline -1
0000 .dbline 42
0000 ; /************************************************
0000 ; flash 读写程序
0000 ;
0000 ; 2008年6月20日
0000 ;
0000 ; *************************************************/
0000 ; #include "2008.h"
0000 ;
0000 ; #define DF_PAGE_SIZE 528
0000 ; #define DF_READ_BUFFER 0
0000 ; #define DF_WRITE_BUFFER 1
0000 ;
0000 ; #define MM_PAGE_TO_B1_XFER 0x53 //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
0000 ; // main memory page to buffer 2 transfer
0000 ; #define MM_PAGE_TO_B2_XFER 0x55 //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
0000 ; // buffer 1 to main memory page program with built-in erase
0000 ; #define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
0000 ; // buffer 2 to main memory page program with built-in erase
0000 ; #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
0000 ; // buffer 1 read
0000 ; #define BUFFER_1_READ 0xd1 //0xD4
0000 ; // buffer 2 read
0000 ; #define BUFFER_2_READ 0xd3 //0xD6
0000 ; // buffer 1 write
0000 ; #define BUFFER_1_WRITE 0x84
0000 ; // buffer 2 write
0000 ; #define BUFFER_2_WRITE 0x87
0000 ;
0000 ;
0000 ; #define STATUS_REGISTER 0xD7
0000 ;
0000 ;
0000 ; #define UNSELECT_CHIP PORTB |= 0x10;
0000 ; #define SELECT_CHIP PORTB &= 0xef;
0000 ;
0000 ; uint g_CurReadPage;//当前读的页地址
0000 ; uint g_CurReadByte;//当前读的字节(页中地址)
0000 ; uint g_CurWritePage;//当前写的页地址
0000 ; uint g_CurWriteByte;//当前写的字节地址(页中地址)
0000 ; //====================================================================
0000 ; void df_init(void)
0000 ; {
0000 .dbline 46
0000 ; //MISO设置为输入,上拉电阻关闭,其它默认为1
0000 ; //PORTB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(PB2);
0000 ; //PORTB |= 1 2 4 0
0000 ; PORTB |= 0x17;
0000 88B3 in R24,0x18
0002 8761 ori R24,23
0004 88BB out 0x18,R24
0006 .dbline 53
0006 ; /*
0006 ; 注:使用AVR单片机SPI口,并用作主器件时SS引脚(ATMEGA8中PB2)要拉高或设置成输出!
0006 ; */
0006 ; //SCK,MOSI和CS端口对应脚设置为输出
0006 ; //DDRB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS);
0006 ; //DDRB |= 1 2 4
0006 ; DDRB |= 0X16; //配置为输出
0006 87B3 in R24,0x17
0008 8661 ori R24,22
000A 87BB out 0x17,R24
000C .dbline 56
000C ; // SPI中断禁止, SPI使能, master模式, MSB 前, SPI 模式 3, SCK频率Fcl/4
000C ; //SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPHA)|_BV(CPOL);//|_BV(SPR1)|_BV(SPR0);
000C ; SPCR = 0x5c; //SPI控制寄存器
000C 8CE5 ldi R24,92
000E 8DB9 out 0xd,R24
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbend
0012 .dbfunc e df_write_open _df_write_open fV
0012 ; addr -> R20,R21
.even
0012 _df_write_open::
0012 0E940000 xcall push_gset1
0016 A801 movw R20,R16
0018 .dbline -1
0018 .dbline 62
0018 ;
0018 ; }
0018 ; //======================================================================
0018 ; //写初始化功能函数,addr为打开后读到的初始地址
0018 ; void df_write_open(uint addr)
0018 ; {
0018 .dbline 63
0018 ; g_CurWritePage=addr/DF_PAGE_SIZE;
0018 20E1 ldi R18,528
001A 32E0 ldi R19,2
001C 8A01 movw R16,R20
001E 0E940000 xcall div16u
0022 10930300 sts _g_CurWritePage+1,R17
0026 00930200 sts _g_CurWritePage,R16
002A .dbline 64
002A ; g_CurWriteByte=addr%DF_PAGE_SIZE;
002A 20E1 ldi R18,528
002C 32E0 ldi R19,2
002E 8A01 movw R16,R20
0030 0E940000 xcall mod16u
0034 10930100 sts _g_CurWriteByte+1,R17
0038 00930000 sts _g_CurWriteByte,R16
003C .dbline 65
003C ; load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
003C 21E0 ldi R18,1
003E 30E0 ldi R19,0
0040 00910200 lds R16,_g_CurWritePage
0044 10910300 lds R17,_g_CurWritePage+1
0048 22D0 xcall _load_page_to_buffer
004A .dbline -2
004A L2:
004A 0E940000 xcall pop_gset1
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbsym r addr 20 i
0050 .dbend
0050 .dbfunc e df_read_open _df_read_open fV
0050 ; addr -> R20,R21
.even
0050 _df_read_open::
0050 0E940000 xcall push_gset1
0054 A801 movw R20,R16
0056 .dbline -1
0056 .dbline 70
0056 ; }
0056 ; //======================================================================
0056 ; //读初始化功能函数,addr为打开后读到的初始地址
0056 ; void df_read_open(uint addr)
0056 ; {
0056 .dbline 71
0056 ; g_CurReadPage=addr/DF_PAGE_SIZE;
0056 20E1 ldi R18,528
0058 32E0 ldi R19,2
005A 8A01 movw R16,R20
005C 0E940000 xcall div16u
0060 10930700 sts _g_CurReadPage+1,R17
0064 00930600 sts _g_CurReadPage,R16
0068 .dbline 72
0068 ; g_CurReadByte=addr%DF_PAGE_SIZE;
0068 20E1 ldi R18,528
006A 32E0 ldi R19,2
006C 8A01 movw R16,R20
006E 0E940000 xcall mod16u
0072 10930500 sts _g_CurReadByte+1,R17
0076 00930400 sts _g_CurReadByte,R16
007A .dbline 73
007A ; load_page_to_buffer(g_CurReadPage,DF_READ_BUFFER);
007A 2227 clr R18
007C 3327 clr R19
007E 00910600 lds R16,_g_CurReadPage
0082 10910700 lds R17,_g_CurReadPage+1
0086 03D0 xcall _load_page_to_buffer
0088 .dbline -2
0088 L3:
0088 0E940000 xcall pop_gset1
008C .dbline 0 ; func end
008C 0895 ret
008E .dbsym r addr 20 i
008E .dbend
008E .dbfunc e load_page_to_buffer _load_page_to_buffer fV
008E ; buffer -> R22,R23
008E ; page -> R20,R21
.even
008E _load_page_to_buffer::
008E 0E940000 xcall push_gset2
0092 B901 movw R22,R18
0094 A801 movw R20,R16
0096 .dbline -1
0096 .dbline 78
0096 ; }
0096 ; //=======================================================================
0096 ; //读主存储器指定页到读缓冲区(BUFFER1)
0096 ; void load_page_to_buffer(uint page,uint buffer)
0096 ; {
0096 .dbline 79
0096 ; SELECT_CHIP;
0096 88B3 in R24,0x18
0098 8F7E andi R24,239
009A 88BB out 0x18,R24
009C .dbline 79
009C .dbline 81
009C ;
009C ; if(buffer == DF_READ_BUFFER) //=0
009C 6030 cpi R22,0
009E 6707 cpc R22,R23
00A0 21F4 brne L5
00A2 X0:
00A2 .dbline 82
00A2 ; spi_write(MM_PAGE_TO_B1_XFER); //0x53
00A2 03E5 ldi R16,83
00A4 10E0 ldi R17,0
00A6 18D0 xcall _spi_write
00A8 03C0 xjmp L6
00AA L5:
00AA .dbline 84
00AA ; else
00AA ; spi_write(MM_PAGE_TO_B2_XFER); //0x55
00AA 05E5 ldi R16,85
00AC 10E0 ldi R17,0
00AE 14D0 xcall _spi_write
00B0 L6:
00B0 .dbline 85
00B0 ; spi_write((uint)(page >> 6));
00B0 26E0 ldi R18,6
00B2 30E0 ldi R19,0
00B4 8A01 movw R16,R20
00B6 0E940000 xcall lsr16
00BA 0ED0 xcall _spi_write
00BC .dbline 86
00BC ; spi_write((uint)(page << 2));
00BC 8A01 movw R16,R20
00BE 000F lsl R16
00C0 111F rol R17
00C2 000F lsl R16
00C4 111F rol R17
00C6 08D0 xcall _spi_write
00C8 .dbline 87
00C8 ; spi_write(0x00);
00C8 0027 clr R16
00CA 1127 clr R17
00CC 05D0 xcall _spi_write
00CE .dbline 89
00CE ;
00CE ; UNSELECT_CHIP;
00CE C49A sbi 0x18,4
00D0 .dbline 89
00D0 .dbline 91
00D0 ;
00D0 ; df_wait_busy();
00D0 09D0 xcall _df_wait_busy
00D2 .dbline -2
00D2 L4:
00D2 0E940000 xcall pop_gset2
00D6 .dbline 0 ; func end
00D6 0895 ret
00D8 .dbsym r buffer 22 i
00D8 .dbsym r page 20 i
00D8 .dbend
00D8 .dbfunc e spi_write _spi_write fi
00D8 ; data -> R16,R17
.even
00D8 _spi_write::
00D8 .dbline -1
00D8 .dbline 96
00D8 ; }
00D8 ; //=======================================================================
00D8 ; //从SPI口输出一字节数据
00D8 ; uint spi_write(uint data)
00D8 ; {
00D8 .dbline 97
00D8 ; SPDR = data;
00D8 0FB9 out 0xf,R16
00DA L8:
00DA .dbline 98
00DA L9:
00DA .dbline 98
00DA ; while(!(SPSR & 0x80)); //判断 SPIF
00DA 779B sbis 0xe,7
00DC FECF rjmp L8
00DE .dbline 99
00DE ; return SPDR;
00DE 0FB1 in R16,0xf
00E0 1127 clr R17
00E2 .dbline -2
00E2 L7:
00E2 .dbline 0 ; func end
00E2 0895 ret
00E4 .dbsym r data 16 i
00E4 .dbend
00E4 .dbfunc e df_wait_busy _df_wait_busy fV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -