📄 sd_hal.s
字号:
.module SD_Hal.c
.area text(rom, con, rel)
; i -> R16,R17
.even
_SD_Power::
; /*--------------File Info-------------------------------------------------------
; ** 文 件 名: SD_Hal.c
; ** 最后修改日期: 2008.3.28
; ** 版 本: V1.0
; ** 描 述: 硬件抽象层
; **------------------------------------------------------------------------------
; ** Created by:
; ** Created date:
; *******************************************************************************/
;
; #include "SYS_Config.h"
; #include "SD_Config.h"
; #include "SD_Hal.h"
;
; /**************************************************************
;
; 读写SD卡的SPI接口函数: SPI接口设置,发送/接收字节函数
;
;
; /*******************************************************************************
; ** 函数名称: void SD_Power() Name: void SD_Power()
; ** 功能描述: 对卡先下电,再上电 Function: turn off the card's power, and turn on
; ** 输 入: 无 Input: NULL
; ** 输 出: 无 Output: NULL
; *******************************************************************************/
; void SD_Power(void)
; {
; INT16U i;
;
; SD_POWER_OUT();
sbi 0x17,5
; SD_POWER_OFF();
cbi 0x18,5
;
; SD_BUSY_LED_OUT();
sbi 0x17,0
; SD_BUSY_LED_OFF();
sbi 0x18,0
;
; SPI_SCK_OUT();
sbi 0x17,1
; SPI_SCK_CLR();
cbi 0x18,1
;
; SPI_MISO_OUT();
sbi 0x17,3
; SPI_MISO_CLR();
cbi 0x18,3
;
; SPI_MOSI_OUT();
sbi 0x17,2
; SPI_MOSI_CLR();
cbi 0x18,2
;
; SPI_CS_OUT();
sbi 0x17,4
; SPI_CS_CLR();
cbi 0x18,4
clr R16
clr R17
xjmp L5
L2:
L3:
subi R16,255 ; offset = 1
sbci R17,255
L5:
;
; for(i=0;i<0x2000;i++);//延时一段时间
cpi R16,0
ldi R30,32
cpc R17,R30
brlo L2
;
; SD_POWER_ON();
sbi 0x18,5
L1:
.dbline 0 ; func end
ret
.even
_SPI_INIT::
; }
;
; //**************************************************************************
; //** 函数名称: SPI_INIT()
; //** 功能描述: SPI初始化
; //** 输 入: 无
; //** 输 出: 无
; //** 全局变量: 无
; //** 调用模块: 无
; //** 作 者: jjx
; //** 日 期: 2008年2月25日
; //**************************************************************************
; void SPI_INIT(void)
; {
; SPI_MISO_IN();
cbi 0x17,3
; SPI_MOSI_OUT();
sbi 0x17,2
; SPI_SCK_OUT();
sbi 0x17,1
; //设置spi通信模式,SPIE=0,SPE=1,DORD=0,MSTR=1,CPOL=1,CPHA=1,SPR1=1,SPR0=1;
; SPCR=(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
ldi R24,95
out 0xd,R24
; SPI_Clk_MIN();
in R24,0xd
ori R24,3
out 0xd,R24
cbi 0xe,0
L6:
.dbline 0 ; func end
ret
.even
_SD_HardWareInit::
; }
;
; /*******************************************************************************
; ** 函数名称: void SD_HardWareInit()
; ** 功能描述: 初始化访问SD卡的硬件条件
; ** 输 入: 无
; ** 输 出: 无
; *******************************************************************************/
; void SD_HardWareInit(void)
; {
; SD_Power();
xcall _SD_Power
;
; SD_INSERT_IN();
cbi 0x2,7
; SD_WP_IN();
cbi 0x2,6
;
; SPI_CS_OUT();
sbi 0x17,4
; SPI_CS_SET(); //cs置高
sbi 0x18,4
;
; SPI_INIT(); //设置spi接口模式
xcall _SPI_INIT
; SPI_Clk_MIN(); //设置spi频率最小
in R24,0xd
ori R24,3
out 0xd,R24
cbi 0xe,0
L7:
.dbline 0 ; func end
ret
; byte -> R16
.even
_SPI_SendByte::
; }
;
; /*******************************************************************************
; ** 函数名称: void SPI_SendByte()
; ** 功能描述: 通过SPI接口发送一个字节
; ** 输 入: INT8U byte: 发送的字节
; ** 输 出: 无
; *******************************************************************************/
; void SPI_SendByte(INT8U byte)
; {
; SD_BUSY_LED_ON();
cbi 0x18,0
;
; SPDR=byte; //启动数据传输
out 0xf,R16
L9:
L10:
; while(!(SPSR&(1<<SPIF))); //等待传输结束
sbis 0xe,7
rjmp L9
;
; SD_BUSY_LED_OFF();
sbi 0x18,0
L8:
.dbline 0 ; func end
ret
; temp -> R16
.even
_SPI_RecByte::
; }
;
;
; /*******************************************************************************
; ** 函数名称: INT8U SPI_RecByte()
; ** 功能描述: 从SPI接口接收一个字节
; ** 输 入: 无
; ** 输 出: 收到的字节
; *******************************************************************************/
; INT8U SPI_RecByte(void)
; {
; INT8U temp;
;
; SD_BUSY_LED_ON();
cbi 0x18,0
;
; SPDR=0xFF; //启动数据传输
ldi R24,255
out 0xf,R24
L13:
L14:
; while(!(SPSR&(1<<SPIF))); //等待传输结束
sbis 0xe,7
rjmp L13
; temp = SPSR;//清空SPIF
in R16,0xe
;
; SD_BUSY_LED_OFF();
sbi 0x18,0
;
; return SPDR;
in R16,0xf
L12:
.dbline 0 ; func end
ret
.even
_SPI_CS_Assert::
; }
;
; /*******************************************************************************
; ** 函数名称: void SPI_CS_Assert()
; ** 功能描述: 片选SPI从机
; ** 输 入: 无
; ** 输 出: 无
; *******************************************************************************/
; void SPI_CS_Assert(void)
; {
; SPI_CS_CLR();
cbi 0x18,4
L16:
.dbline 0 ; func end
ret
.even
_SPI_CS_Deassert::
; /* 片选SPI从机 select the SPI slave */
; }
;
;
; /*******************************************************************************
; ** 函数名称: void SPI_CS_Deassert()
; ** 功能描述: 不片选SPI从机
; ** 输 入: 无
; ** 输 出: 无
; *******************************************************************************/
; void SPI_CS_Deassert(void)
; {
; SPI_CS_SET();
sbi 0x18,4
L17:
.dbline 0 ; func end
ret
.even
_SD_ChkCard::
; /* 不片选SPI从机 not select the SPI slave */
; }
;
; /*******************************************************************************
; ** 函数名称: void SD_ChkCard()
; ** 功能描述: 检测卡是否完全插入
; ** 输 入: 无
; ** 输 出: 1: 卡完全插入 0: 卡没有完全插入
; *******************************************************************************/
; INT8U SD_ChkCard(void)
; {
; if(SD_INSERT_STATUS()!=0)
sbis 0x1,7
rjmp L19
; return 0x00 ;/* 未完全插入 not insert entirely */
clr R16
xjmp L18
L19:
; else
; return 0x01 ;/* 完全插入 insert entirely */
ldi R16,1
L18:
.dbline 0 ; func end
ret
.even
_SD_ChkCardWP::
; }
;
; /*******************************************************************************
; ** 函数名称: void SD_ChkCardWP()
; ** 功能描述: 检测卡写保护
; ** 输 入: 无
; ** 输 出: 0: 卡已写保护 1: 卡未写保护
; *******************************************************************************/
; INT8U SD_ChkCardWP(void)
; {
; if(SD_WP_STATUS()!=0x00)
sbis 0x1,6
rjmp L22
; return 0x01 ; /* 卡未写保护 */
ldi R16,1
xjmp L21
L22:
; else
; return 0x00 ; /* 卡写保护 */
clr R16
L21:
.dbline 0 ; func end
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -