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

📄 sd_hal.s

📁 Atmega64单片机程序(完整工程)
💻 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 + -