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

📄 at45db041d.lis

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