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 + -
显示快捷键?