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