📄 at45db041d.lis
字号:
.module AT45DB041D.c
.area text(rom, con, rel)
0000 .dbfile E:\item\car\AT45DB041D\AT45DB041D.c
0000 .dbfunc e DF_Delay _DF_Delay fV
0000 ; i -> R20,R21
0000 ; j -> R22,R23
0000 ; n -> R16,R17
.even
0000 _DF_Delay::
0000 0E940000 xcall push_xgsetF000
0004 .dbline -1
0004 .dbline 27
0004 ; /************************************************************
0004 ; *本驱动只用于AT45DB041D默认页大小为264的情况
0004 ; *页改为256后可以有些不同
0004 ; *页的大小只能改一次(从264改为256),不能改回
0004 ; ************************************************************/
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ; #include "AT45DB041D.h"
0004 ; #include "eeprom.h"
0004 ;
0004 ; /************************************************************
0004 ; *SPI宏定义
0004 ; ************************************************************/
0004 ; #define SPI_DDR DDRB
0004 ; #define SPI_PORT PORTB
0004 ;
0004 ; #define RESET 3
0004 ; #define SS 4
0004 ; #define MOSI 5
0004 ; #define MISO 6
0004 ; #define SCK 7
0004 ;
0004 ; /************************************************************
0004 ; *延时函数
0004 ; ************************************************************/
0004 ; void DF_Delay(unsigned int n)
0004 ; {
0004 .dbline 30
0004 ; unsigned int i;
0004 ; unsigned int j;
0004 ; for(i=0;i<n;i++)
0004 4427 clr R20
0006 5527 clr R21
0008 0CC0 xjmp L5
000A L2:
000A .dbline 31
000A ; {
000A .dbline 32
000A ; for(j=0;j<255;j++)
000A 6627 clr R22
000C 7727 clr R23
000E 03C0 xjmp L9
0010 L6:
0010 .dbline 33
0010 ; {
0010 .dbline 34
0010 ; asm("nop");
0010 0000 nop
0012 .dbline 35
0012 ; }
0012 L7:
0012 .dbline 32
0012 6F5F subi R22,255 ; offset = 1
0014 7F4F sbci R23,255
0016 L9:
0016 .dbline 32
0016 6F3F cpi R22,255
0018 E0E0 ldi R30,0
001A 7E07 cpc R23,R30
001C C8F3 brlo L6
001E X0:
001E .dbline 36
001E ; }
001E L3:
001E .dbline 30
001E 4F5F subi R20,255 ; offset = 1
0020 5F4F sbci R21,255
0022 L5:
0022 .dbline 30
0022 4017 cp R20,R16
0024 5107 cpc R21,R17
0026 88F3 brlo L2
0028 X1:
0028 .dbline -2
0028 L1:
0028 .dbline 0 ; func end
0028 0C940000 xjmp pop_xgsetF000
002C .dbsym r i 20 i
002C .dbsym r j 22 i
002C .dbsym r n 16 i
002C .dbend
002C .dbfunc e SPI_Port_Init _SPI_Port_Init fV
.even
002C _SPI_Port_Init::
002C .dbline -1
002C .dbline 42
002C ; }
002C ; /************************************************************
002C ; *Init SPI Port
002C ; ************************************************************/
002C ; void SPI_Port_Init(void)
002C ; {
002C .dbline 43
002C ; SPI_DDR |= ((1<<SS)|(1<<SCK)|(1<<MOSI));//设为输出
002C 87B3 in R24,0x17
002E 806B ori R24,176
0030 87BB out 0x17,R24
0032 .dbline 44
0032 ; SPI_DDR &=~ (1<<MISO); //设为输入
0032 BE98 cbi 0x17,6
0034 .dbline 45
0034 ; SPI_PORT |= (1<<SS)|(1<<SCK)|(1<<MOSI); //输出高电平
0034 88B3 in R24,0x18
0036 806B ori R24,176
0038 88BB out 0x18,R24
003A .dbline 46
003A ; SPI_PORT |= (1<<MOSI); //上拉
003A C59A sbi 0x18,5
003C .dbline 48
003C ;
003C ; SPI_DDR|=(1<<RESET); //复位引脚设为输出
003C BB9A sbi 0x17,3
003E .dbline -2
003E L10:
003E .dbline 0 ; func end
003E 0895 ret
0040 .dbend
0040 .dbfunc e SPI_Init _SPI_Init fV
.even
0040 _SPI_Init::
0040 .dbline -1
0040 .dbline 54
0040 ; }
0040 ; /************************************************************
0040 ; *初始化SPI
0040 ; ************************************************************/
0040 ; void SPI_Init(void)//最高能到fOSC/16
0040 ; {
0040 .dbline 55
0040 ; SPI_Port_Init();
0040 F5DF xcall _SPI_Port_Init
0042 .dbline 58
0042 ;
0042 ; //SPI使能, master模式, MSB 前, SPI 模式 3, SCK频率Fcl/4 平时SCK为高电平
0042 ; SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<CPOL);
0042 8DB1 in R24,0xd
0044 8C65 ori R24,92
0046 8DB9 out 0xd,R24
0048 .dbline 60
0048 ; //频率加倍
0048 ; SPSR |= (1<<SPI2X);
0048 709A sbi 0xe,0
004A .dbline -2
004A L11:
004A .dbline 0 ; func end
004A 0895 ret
004C .dbend
004C .dbfunc e SPI_Start _SPI_Start fV
.even
004C _SPI_Start::
004C .dbline -1
004C .dbline 66
004C ; }
004C ; /************************************************************
004C ; *使能SPI
004C ; ************************************************************/
004C ; void SPI_Start(void)
004C ; {
004C .dbline 67
004C ; SPCR |= (1<<SPE);
004C 6E9A sbi 0xd,6
004E .dbline -2
004E L12:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbend
0050 .dbfunc e SPI_Stop _SPI_Stop fV
.even
0050 _SPI_Stop::
0050 .dbline -1
0050 .dbline 73
0050 ; }
0050 ; /************************************************************
0050 ; *禁止SPI
0050 ; ************************************************************/
0050 ; void SPI_Stop(void)
0050 ; {
0050 .dbline 74
0050 ; SPCR &=~ (1<<SPE);
0050 6E98 cbi 0xd,6
0052 .dbline -2
0052 L13:
0052 .dbline 0 ; func end
0052 0895 ret
0054 .dbend
0054 .dbfunc e SPI_Write_Byte _SPI_Write_Byte fV
0054 ; cData -> R16
.even
0054 _SPI_Write_Byte::
0054 .dbline -1
0054 .dbline 80
0054 ; }
0054 ; /************************************************************
0054 ; *SPI send a Byte
0054 ; ************************************************************/
0054 ; void SPI_Write_Byte(unsigned char cData)
0054 ; {
0054 .dbline 81
0054 ; SPDR = cData; //write data
0054 0FB9 out 0xf,R16
0056 L15:
0056 .dbline 82
0056 ; while(!(SPSR & (1<<SPIF))); //wait write ok
0056 L16:
0056 .dbline 82
0056 779B sbis 0xe,7
0058 FECF rjmp L15
005A X2:
005A .dbline -2
005A L14:
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r cData 16 c
005C .dbend
005C .dbfunc e SPI_Write_Bytes _SPI_Write_Bytes fV
005C ; i -> R20,R21
005C ; DataLen -> R18,R19
005C ; cData -> R16,R17
.even
005C _SPI_Write_Bytes::
005C 4A93 st -y,R20
005E 5A93 st -y,R21
0060 .dbline -1
0060 .dbline 88
0060 ; }
0060 ; /************************************************************
0060 ; *SPI send Bytes
0060 ; ************************************************************/
0060 ; void SPI_Write_Bytes(unsigned char *cData,unsigned int DataLen)
0060 ; {
0060 .dbline 90
0060 ; unsigned int i;
0060 ; for(i=0;i<DataLen;i++)
0060 4427 clr R20
0062 5527 clr R21
0064 09C0 xjmp L22
0066 L19:
0066 .dbline 91
0066 ; {
0066 .dbline 92
0066 ; SPDR = *(cData+i); //write data
0066 FA01 movw R30,R20
0068 E00F add R30,R16
006A F11F adc R31,R17
006C 2080 ldd R2,z+0
006E 2FB8 out 0xf,R2
0070 L23:
0070 .dbline 93
0070 ; while(!(SPSR & (1<<SPIF))); //wait write ok
0070 L24:
0070 .dbline 93
0070 779B sbis 0xe,7
0072 FECF rjmp L23
0074 X3:
0074 .dbline 94
0074 ; }
0074 L20:
0074 .dbline 90
0074 4F5F subi R20,255 ; offset = 1
0076 5F4F sbci R21,255
0078 L22:
0078 .dbline 90
0078 4217 cp R20,R18
007A 5307 cpc R21,R19
007C A0F3 brlo L19
007E X4:
007E .dbline -2
007E L18:
007E .dbline 0 ; func end
007E 5991 ld R21,y+
0080 4991 ld R20,y+
0082 0895 ret
0084 .dbsym r i 20 i
0084 .dbsym r DataLen 18 i
0084 .dbsym r cData 16 pc
0084 .dbend
0084 .dbfunc e SPI_Read_Byte _SPI_Read_Byte fc
0084 ; cData -> R16
.even
0084 _SPI_Read_Byte::
0084 .dbline -1
0084 .dbline 100
0084 ; }
0084 ; /************************************************************
0084 ; *SPI Read char
0084 ; ************************************************************/
0084 ; unsigned char SPI_Read_Byte(unsigned char cData)
0084 ; {
0084 .dbline 101
0084 ; SPDR = cData; //write data
0084 0FB9 out 0xf,R16
0086 L27:
0086 .dbline 102
0086 ; while(!(SPSR & (1<<SPIF))); //wait receive ok
0086 L28:
0086 .dbline 102
0086 779B sbis 0xe,7
0088 FECF rjmp L27
008A X5:
008A .dbline 103
008A ; return SPDR; //返回数据
008A 0FB1 in R16,0xf
008C .dbline -2
008C L26:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -