📄 avr_mmc.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 + -