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

📄 avr_mmc.c

📁 AT89C51 MP3源程序AT89C51 MP3源程序 SD AT89C51 MP3源程序AT89C51 MP3源程序 SD
💻 C
字号:
/*
;*****************************************************************************************************
;*									Copyright (c) 2006 by JiaoJinXing. 
;*											All rights reserved.
;*
;*---- 文件信息 --------------------------------------------------------------------------------------
;* 文   件   名 : AVR_MMC.c
;* 创   建   人 : 焦进星
;* 描        述 : MMC卡驱动文件文件
;*
;*---- 历史版本信息 ----------------------------------------------------------------------------------
;* 日   期  : 2008年 12 月 15 日
;* 创 建 人  : 焦进星
;* 描   述  : 建立版本 V1.0.0
;*
;*---- 联系方式 --------------------------------------------------------------------------------------
;* Email    : wyoujtg@163.com
;* Web      : http://wyoujtg.blog.163.com  
;*****************************************************************************************************
;*/

#include "minifs.h"

#ifdef  AVR_MMC

/*
;*****************************************************************************************************
;* 函数名称 : SPI_Init
;* 描    述 : SPI初始化
;* 输 	 入 : 无
;*        
;* 输 	 出 : 无
;*****************************************************************************************************
;*/
void DelayMs(uint32 time)
{
	uint32 temp;
	uint32 count;
	
	count = 2663;
	while (count-- > 0)
	{
	   for (temp = 0; temp < 512; temp++);
	   {
		   __asm__ __volatile__("nop");
	   }
	}
}

/*
;*****************************************************************************************************
;* 函数名称 : SPI_Init
;* 描    述 : SPI初始化
;* 输 	 入 : 无
;*        
;* 输 	 出 : 无
;*****************************************************************************************************
;*/
void SPI_Init(void)
{
    DDRB |= (1 << PB0);									/* SS端口设置为输出 */
    DDRB |= (1 << PB2);									/* MOSI端口设置为输出 */
    DDRB &= ~(1 << PB3);									/* MISO端口设置为输入 */
    DDRB |= (1 << PB1);									/* SCK端口设置为输出 */
	/* SPI ENABLE, MASTER MODE, Fsoc/16 */	
    SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); 
	PORTB |= (1 << PB0);									/* SS=1 */
}

/*
;*****************************************************************************************************
;* 函数名称 : SPI_HiSPD
;* 描    述 : SPI转入高速模式
;* 输 	 入 : 无
;*        
;* 输 	 出 : 无
;*****************************************************************************************************
;*/
void SPI_HiSPD(void)
{
    SPCR |= (0 << SPR1) | (0 << SPR0);				/* SPI ENABLE, MASTER MODE, Fsoc/16 */
	SPSR |= (1 << SPI2X); 
}

/*
;*****************************************************************************************************
;* 函数名称 : SPI_SendData
;* 描    述 : SPI发送数据
;* 输 	 入 : data: 数据
;*        
;* 输 	 出 : SPDR
;*****************************************************************************************************
;*/
uint8 SPI_SendData(uint8 data)
{
	uint8 temp;

	SPDR = data;

    while ( !(SPSR & (1 << SPIF)) )
	{
		__asm__ __volatile__("nop");
	}
	temp = SPDR;
	return temp;
}
 
/*
;*****************************************************************************************************
;* 函数名称 : MMC_CS
;* 描    述 : MMC片选
;* 输 	 入 : cs: 0不片选 1片选
;*        
;* 输 	 出 : 无
;*****************************************************************************************************
;*/
void MMC_CS(uint8 cs)
{
	if (cs == 0)
	{
		PORTB |= (1 << PB0);			/* SS=1 */
	}
	else
	{
		PORTB &= ~(1 << PB0);			/* SS=0 */
	}
}

/*
;*****************************************************************************************************
;* 函数名称 : MMC_SendCMD
;* 描    述 : MMC发送命令
;* 输 	 入 : cmd: 命令
;*        
;* 输 	 出 : 超时时间
;*****************************************************************************************************
;*/
uint8 MMC_SendCMD(uint8 *cmd)
{
	uint8 i = 0, k = 0;
	uint8 temp = 0XFF;

    MMC_CS(0);		   			/* 片选无效 */

	SPI_SendData(0XFF);			/* 发送8个时钟 */

	MMC_CS(1);		   			/* 片选有效 */

	__asm__ __volatile__("nop");

	for (i = 0; i < 6; i++)
	{
	    SPI_SendData(*(cmd++));	/* 发送命令 */   
	}

	while (temp == 0XFF)
	{
	    temp = SPI_SendData(0XFF);  /* 等待回复 */
		if (k++ > 200)				/* 超时返回 */
		{
		    return temp;
		}
	}
    return temp;
}

#endif

/*
;*****************************************************************************************************
;*											End of File
;*****************************************************************************************************
;*/	

⌨️ 快捷键说明

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