sd_hal.lis

来自「Atmega64单片机程序(完整工程)」· LIS 代码 · 共 307 行

LIS
307
字号
                        .module SD_Hal.c
                        .area text(rom, con, rel)
                ;              i -> R16,R17
                        .even
 0000           _SD_Power::
 0000           ; /*--------------File Info-------------------------------------------------------
 0000           ; ** 文   件   名:    SD_Hal.c
 0000           ; ** 最后修改日期:    2008.3.28
 0000           ; ** 版        本:    V1.0
 0000           ; ** 描        述:    硬件抽象层					
 0000           ; **------------------------------------------------------------------------------
 0000           ; ** Created   by:    		
 0000           ; ** Created date:			
 0000           ; *******************************************************************************/
 0000           ; 
 0000           ; #include "SYS_Config.h" 
 0000           ; #include "SD_Config.h" 
 0000           ; #include "SD_Hal.h" 
 0000           ; 
 0000           ; /**************************************************************
 0000           ; 		
 0000           ; 读写SD卡的SPI接口函数: SPI接口设置,发送/接收字节函数	
 0000           ; 	
 0000           ; 
 0000           ; /*******************************************************************************
 0000           ; ** 函数名称: void SD_Power()	Name:	  void SD_Power()
 0000           ; ** 功能描述: 对卡先下电,再上电	Function: turn off the card's power, and turn on
 0000           ; ** 输   入: 无			Input:	  NULL
 0000           ; ** 输   出: 无			Output:	  NULL
 0000           ; *******************************************************************************/
 0000           ; void SD_Power(void)
 0000           ; {    
 0000           ;     INT16U i;
 0000           ;     
 0000           ;     SD_POWER_OUT();
 0000 BD9A              sbi 0x17,5
 0002           ;     SD_POWER_OFF();
 0002 C598              cbi 0x18,5
 0004           ;     
 0004           ;     SD_BUSY_LED_OUT();
 0004 B89A              sbi 0x17,0
 0006           ;     SD_BUSY_LED_OFF();
 0006 C09A              sbi 0x18,0
 0008           ;     
 0008           ;     SPI_SCK_OUT();
 0008 B99A              sbi 0x17,1
 000A           ;     SPI_SCK_CLR();
 000A C198              cbi 0x18,1
 000C           ;     
 000C           ;     SPI_MISO_OUT();
 000C BB9A              sbi 0x17,3
 000E           ;     SPI_MISO_CLR();
 000E C398              cbi 0x18,3
 0010           ;     
 0010           ;     SPI_MOSI_OUT();
 0010 BA9A              sbi 0x17,2
 0012           ;     SPI_MOSI_CLR();
 0012 C298              cbi 0x18,2
 0014           ;     
 0014           ;     SPI_CS_OUT();
 0014 BC9A              sbi 0x17,4
 0016           ;     SPI_CS_CLR();
 0016 C498              cbi 0x18,4
 0018 0027              clr R16
 001A 1127              clr R17
 001C 02C0              xjmp L5
 001E           L2:
 001E           L3:
 001E 0F5F              subi R16,255  ; offset = 1
 0020 1F4F              sbci R17,255
 0022           L5:
 0022           ;         
 0022           ;     for(i=0;i<0x2000;i++);//延时一段时间
 0022 0030              cpi R16,0
 0024 E0E2              ldi R30,32
 0026 1E07              cpc R17,R30
 0028 D0F3              brlo L2
 002A           ;     
 002A           ;     SD_POWER_ON();                                                                                                     
 002A C59A              sbi 0x18,5
 002C           L1:
 002C                   .dbline 0 ; func end
 002C 0895              ret
                        .even
 002E           _SPI_INIT::
 002E           ; }
 002E           ; 
 002E           ; //**************************************************************************
 002E           ; //** 函数名称: SPI_INIT()
 002E           ; //** 功能描述: SPI初始化
 002E           ; //** 输   入: 无
 002E           ; //** 输   出: 无
 002E           ; //** 全局变量: 无
 002E           ; //** 调用模块: 无
 002E           ; //** 作   者: jjx
 002E           ; //** 日   期: 2008年2月25日
 002E           ; //**************************************************************************
 002E           ; void SPI_INIT(void)
 002E           ; {
 002E           ;     SPI_MISO_IN();
 002E BB98              cbi 0x17,3
 0030           ;     SPI_MOSI_OUT();
 0030 BA9A              sbi 0x17,2
 0032           ;     SPI_SCK_OUT();
 0032 B99A              sbi 0x17,1
 0034           ;     //设置spi通信模式,SPIE=0,SPE=1,DORD=0,MSTR=1,CPOL=1,CPHA=1,SPR1=1,SPR0=1;
 0034           ;     SPCR=(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0); 
 0034 8FE5              ldi R24,95
 0036 8DB9              out 0xd,R24
 0038           ;     SPI_Clk_MIN();   
 0038 8DB1              in R24,0xd
 003A 8360              ori R24,3
 003C 8DB9              out 0xd,R24
 003E 7098              cbi 0xe,0
 0040           L6:
 0040                   .dbline 0 ; func end
 0040 0895              ret
                        .even
 0042           _SD_HardWareInit::
 0042           ; }
 0042           ; 
 0042           ; /*******************************************************************************
 0042           ; ** 函数名称: void SD_HardWareInit()
 0042           ; ** 功能描述: 初始化访问SD卡的硬件条件
 0042           ; ** 输   入: 无
 0042           ; ** 输   出: 无
 0042           ; *******************************************************************************/
 0042           ; void SD_HardWareInit(void)
 0042           ; {
 0042           ;     SD_Power();
 0042 DEDF              xcall _SD_Power
 0044           ;     
 0044           ;     SD_INSERT_IN();
 0044 1798              cbi 0x2,7
 0046           ;     SD_WP_IN();
 0046 1698              cbi 0x2,6
 0048           ;     
 0048           ;     SPI_CS_OUT();
 0048 BC9A              sbi 0x17,4
 004A           ;     SPI_CS_SET();     //cs置高
 004A C49A              sbi 0x18,4
 004C           ;     
 004C           ;     SPI_INIT();       //设置spi接口模式
 004C F0DF              xcall _SPI_INIT
 004E           ;     SPI_Clk_MIN();    //设置spi频率最小
 004E 8DB1              in R24,0xd
 0050 8360              ori R24,3
 0052 8DB9              out 0xd,R24
 0054 7098              cbi 0xe,0
 0056           L7:
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058           ;           byte -> R16
                        .even
 0058           _SPI_SendByte::
 0058           ; }
 0058           ; 
 0058           ; /*******************************************************************************
 0058           ; ** 函数名称: void SPI_SendByte()
 0058           ; ** 功能描述: 通过SPI接口发送一个字节
 0058           ; ** 输   入: INT8U byte: 发送的字节
 0058           ; ** 输   出: 无
 0058           ; *******************************************************************************/
 0058           ; void SPI_SendByte(INT8U byte)
 0058           ; {
 0058           ;     SD_BUSY_LED_ON();
 0058 C098              cbi 0x18,0
 005A           ;     
 005A           ;     SPDR=byte;                 //启动数据传输
 005A 0FB9              out 0xf,R16
 005C           L9:
 005C           L10:
 005C           ;     while(!(SPSR&(1<<SPIF)));  //等待传输结束
 005C 779B              sbis 0xe,7
 005E FECF              rjmp L9
 0060           ;     
 0060           ;     SD_BUSY_LED_OFF();
 0060 C09A              sbi 0x18,0
 0062           L8:
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064           ;           temp -> R16
                        .even
 0064           _SPI_RecByte::
 0064           ; }
 0064           ; 
 0064           ; 
 0064           ; /*******************************************************************************
 0064           ; ** 函数名称: INT8U SPI_RecByte()
 0064           ; ** 功能描述: 从SPI接口接收一个字节
 0064           ; ** 输   入: 无
 0064           ; ** 输   出: 收到的字节
 0064           ; *******************************************************************************/
 0064           ; INT8U SPI_RecByte(void)
 0064           ; {
 0064           ;     INT8U temp; 
 0064           ;     
 0064           ;     SD_BUSY_LED_ON();
 0064 C098              cbi 0x18,0
 0066           ;     
 0066           ;     SPDR=0xFF;                 //启动数据传输
 0066 8FEF              ldi R24,255
 0068 8FB9              out 0xf,R24
 006A           L13:
 006A           L14:
 006A           ;     while(!(SPSR&(1<<SPIF)));  //等待传输结束
 006A 779B              sbis 0xe,7
 006C FECF              rjmp L13
 006E           ;     temp = SPSR;//清空SPIF
 006E 0EB1              in R16,0xe
 0070           ;     
 0070           ;     SD_BUSY_LED_OFF();
 0070 C09A              sbi 0x18,0
 0072           ;     
 0072           ;     return SPDR;
 0072 0FB1              in R16,0xf
 0074           L12:
 0074                   .dbline 0 ; func end
 0074 0895              ret
                        .even
 0076           _SPI_CS_Assert::
 0076           ; }
 0076           ; 
 0076           ; /*******************************************************************************
 0076           ; ** 函数名称: void SPI_CS_Assert()
 0076           ; ** 功能描述: 片选SPI从机
 0076           ; ** 输   入: 无
 0076           ; ** 输   出: 无
 0076           ; *******************************************************************************/
 0076           ; void SPI_CS_Assert(void)
 0076           ; {
 0076           ;     SPI_CS_CLR();
 0076 C498              cbi 0x18,4
 0078           L16:
 0078                   .dbline 0 ; func end
 0078 0895              ret
                        .even
 007A           _SPI_CS_Deassert::
 007A           ;     /* 片选SPI从机  select the SPI slave */
 007A           ; }
 007A           ; 
 007A           ; 
 007A           ; /*******************************************************************************
 007A           ; ** 函数名称: void SPI_CS_Deassert()
 007A           ; ** 功能描述: 不片选SPI从机
 007A           ; ** 输   入: 无
 007A           ; ** 输   出: 无
 007A           ; *******************************************************************************/
 007A           ; void SPI_CS_Deassert(void)
 007A           ; {
 007A           ;     SPI_CS_SET();
 007A C49A              sbi 0x18,4
 007C           L17:
 007C                   .dbline 0 ; func end
 007C 0895              ret
                        .even
 007E           _SD_ChkCard::
 007E           ;     /* 不片选SPI从机  not select the SPI slave */
 007E           ; }
 007E           ; 
 007E           ; /*******************************************************************************
 007E           ; ** 函数名称: void SD_ChkCard()
 007E           ; ** 功能描述: 检测卡是否完全插入
 007E           ; ** 输   入: 无
 007E           ; ** 输   出: 1: 卡完全插入	0: 卡没有完全插入
 007E           ; *******************************************************************************/
 007E           ; INT8U SD_ChkCard(void)
 007E           ; {
 007E           ;     if(SD_INSERT_STATUS()!=0)
 007E 0F9B              sbis 0x1,7
 0080 02C0              rjmp L19
 0082           ;         return 0x00 ;/* 未完全插入 not insert entirely */
 0082 0027              clr R16
 0084 01C0              xjmp L18
 0086           L19:
 0086           ;     else 
 0086           ;         return 0x01 ;/* 完全插入 insert entirely */
 0086 01E0              ldi R16,1
 0088           L18:
 0088                   .dbline 0 ; func end
 0088 0895              ret
                        .even
 008A           _SD_ChkCardWP::
 008A           ; }
 008A           ; 
 008A           ; /*******************************************************************************
 008A           ; ** 函数名称: void SD_ChkCardWP()
 008A           ; ** 功能描述: 检测卡写保护
 008A           ; ** 输   入: 无
 008A           ; ** 输   出: 0: 卡已写保护	1: 卡未写保护
 008A           ; *******************************************************************************/
 008A           ; INT8U SD_ChkCardWP(void)
 008A           ; {
 008A           ;     if(SD_WP_STATUS()!=0x00)
 008A 0E9B              sbis 0x1,6
 008C 02C0              rjmp L22
 008E           ;         return 0x01 ; /* 卡未写保护 */
 008E 01E0              ldi R16,1
 0090 01C0              xjmp L21
 0092           L22:
 0092           ;     else 
 0092           ;         return 0x00 ; /* 卡写保护 */
 0092 0027              clr R16
 0094           L21:
 0094                   .dbline 0 ; func end
 0094 0895              ret

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?