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

📄 sd.c

📁 Mp3 Player using ATmega128, VS1003B, Character LCD. Test OK.Good Sound.
💻 C
字号:
//***********************************************************************************************
//									SD Card Interface driver
//***********************************************************************************************

#include <avr/io.h>
#include "../global.h"
#include "../delay.h"
#include "../spi.h"
#include "sd.h"
#include "../usart.h"


// Command 屈侥
// 贸澜 1官捞飘   +   促澜 4官捞飘   +   付瘤阜 1官捞飘  =  48 bit
//    CMD蔼           32厚飘 牢荐             CRC
// 01[??????],    [0x?? 0x?? 0x?? 0x??],     [0x95]
//											 CRC绰 CMD0俊辑父 蜡瓤窃

void SD_Init(void)
{
	SPI_Init();

	SPI_Mode(3);	// spi mode3   AVR <----> SD card

	sbi(SD_CS_DDR, SD_CS);	// SD_CS 巧阑 免仿栏肺 汲沥
	sbi(SD_CS_PORT,SD_CS);	// SD_CS = High

	SD_Reset();
}


// SD墨靛 檬扁拳 风凭
void SD_Reset(void)
{
	U8 temp=0, i;
	U8 r1=0;

	sbi(SD_CS_PORT,SD_CS);	// SD_CS = High

	// SD墨靛甫 SPI葛靛甫 荤侩窍扁 困秦 努钒阑 80雀捞惑 牢啊
	for (i=0 ; i < 15 ; i++)
		temp = SPI_Transfer_Byte(0xFF);

	// SD 劝己拳(Active Low)
	cbi(SD_CS_PORT, SD_CS);

	// CMD0 傈价饶 r1蔼 0x01 荐脚
	SD_Command(SD_GO_IDLE_STATE, 0);
	while(1)
	{
		r1=SPI_Transfer_Byte(0xFF);
		hextoasc(r1);
		if(r1 == 0x01)
		{
			string("\nCMD0 Init ... OK\n");
			break;
		}
	}

	delay_ms(10);

	// CMD1 傈价饶 r1蔼 0x00 荐脚
	while(1)
	{
		SD_Command(SD_SEND_OP_COND, 0);
		for (i=0 ; i<5 ; i++)
		{
			r1=SPI_Transfer_Byte(0xFF);
			hextoasc(r1);
			if(r1 == 0x00)
			{
				string("\nCMD1 Init ... OK\n");
				break;
			}
		}

		if(r1 == 0x00)		
			break;		
	}
	// SD 厚劝己拳(Active Low)
	sbi(SD_CS_PORT, SD_CS);
}


void SD_Command(U8 command, U32 arg)
{
	// send command
	SPI_Transfer_Byte(0xFF);
	SPI_Transfer_Byte(0x40 | command);
	SPI_Transfer_Byte(arg>>24);
	SPI_Transfer_Byte(arg>>16);
	SPI_Transfer_Byte(arg>>8);
	SPI_Transfer_Byte(arg);
	SPI_Transfer_Byte(0x95);	// CMD0 傈价俊父 CRC蔼捞 蜡瓤窃
}


U8 SD_Read_Sector(U32 sector, U8* buffer)	// SD 墨靛俊 佬扁疙飞阑 焊郴绊, 荐脚茄 MP3 单捞磐甫 滚欺俊 历厘(512 官捞飘)
{
	U16 i;

	SPI_Mode(3);	// spi mode3   AVR <----> SD card

	// SD 劝己拳(Active Low)
	cbi(SD_CS_PORT, SD_CS);

	// CMD17 傈价
	SD_Command(SD_READ_SINGLE_BLOCK, sector<<9);

	while(SPI_Transfer_Byte(0xFF) != 0x00);
	while(SPI_Transfer_Byte(0xFF) != SD_STARTBLOCK_READ);
	// read in data
	for(i=0 ; i<512 ; i++)	
		buffer[i] = SPI_Transfer_Byte(0xFF);
	
	// CRC 荐脚
	SPI_Transfer_Byte(0xFF);
	SPI_Transfer_Byte(0xFF);

	// SD 厚劝己拳(Active Low)	
	sbi(SD_CS_PORT, SD_CS);
	// return success
	return 0;
}


U8 SD_Write_Sector(U32 sector, U8* buffer)
{
	U8 r1;
	U16 i;

	SPI_Mode(3);	// spi mode3   AVR <----> SD card

	// SD 劝己拳(Active Low)
	cbi(SD_CS_PORT, SD_CS);
	
	// CMD24 傈价
	SD_Command(SD_WRITE_BLOCK, sector<<9);

	while(SPI_Transfer_Byte(0xFF) != 0xFF);

	SPI_Transfer_Byte(SD_STARTBLOCK_WRITE);

	// write data
	for(i=0 ; i< 512 ; i++)	
		SPI_Transfer_Byte(buffer[i]);
	
	// write 16-bit CRC (dummy values)
	SPI_Transfer_Byte(0xFF);
	SPI_Transfer_Byte(0xFF);

	// read data response token
	r1 = SPI_Transfer_Byte(0xFF);
	if( (r1&SD_DR_MASK) != SD_DR_ACCEPT)
		return r1;

	// wait until card not busy
	while(!SPI_Transfer_Byte(0xFF));

	// SD 厚劝己拳(Active Low)	
	sbi(SD_CS_PORT, SD_CS);

	// return success
	return 0;
}


void SD_Read_CIDdata(void)
{
	U8 i;
	U8 CID[17];

	SPI_Mode(3);	// spi mode3   AVR <----> SD card

	// SD 劝己拳(Active Low)
	cbi(SD_CS_PORT, SD_CS);

	SD_Command(SD_SEND_CID, 0);

	while(SPI_Transfer_Byte(0xFF) != 0xFF);

	for(i=0;i<16;i++)
		CID[i]=SPI_Transfer_Byte(0xFF);
	
	CID[i]=0;

	SPI_Transfer_Byte(0xFF);
	SPI_Transfer_Byte(0xFF);

	// SD 厚劝己拳(Active Low)	
	sbi(SD_CS_PORT, SD_CS);

}

void SD_Read_CSDdata(void)
{
	U8 i;
	U8 CSD[16];

	SPI_Mode(3);	// spi mode3   AVR <----> SD card

	// SD 劝己拳(Active Low)
	cbi(SD_CS_PORT, SD_CS);
	SD_Command(SD_SEND_CSD, 0);
	while(SPI_Transfer_Byte(0xFF) != 0xFF);

	for(i=0;i<16;i++)
		CSD[i]=SPI_Transfer_Byte(0xFF);

	SPI_Transfer_Byte(0xFF);
	SPI_Transfer_Byte(0xFF);

	// SD 厚劝己拳(Active Low)	
	sbi(SD_CS_PORT, SD_CS);

}

⌨️ 快捷键说明

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