📄 main.c
字号:
SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6 配置传输模式为单线模式
SendCmdWaitResp(0x24e,0,0X0,0x0200,0x4,0Xfff); //CMD18 多块读命令 1bit mode
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12 多块传输需要发送stop命令以停止传输
complete = *(RP)SDC_INTERRUPT_STATUS;
while((complete |0xfffffffd) != 0xfffffffd)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
CompareMem(MEM_BLOCK_BEGIN,END(4),0x200);
for (i=0;i<5000;i++);
}
/*************************************************************
* FUNCTION
*
* void SdMultiW1r4(U32 rca)
*
* DESCRIPTION
* 多块一位写四位读
*
* AUTHOR
*
* yao
*
* INPUTS
*
* rca SD卡的rca地址号
*
* OUTPUTS
*
* 无
*
*************************************************/
void SdMultiW1r4(U32 rca)
{
U32 i,complete;
erase();//擦除
//***********************配置DMA1进行一位写*************************
*(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
*(RP)DMAC_C2CONTROL = 0x80149b; //0x1e149b
*(RP)DMAC_C2CONFIGURATION = 0x380b;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6
SendCmdWaitResp(0x32e,0,0X2,0x0200,0x4,0Xfff); // CMD25 1bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
while((complete |0xfffffffe) != 0xfffffffe)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
for (i=0;i<5000;i++);
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
*(RP)DMAC_C2SRCADDR = SDC_READ_BUFER_ACCESS;
*(RP)DMAC_C2DESTADDR = END(5);
*(RP)DMAC_C2CONTROL = 0x80249b;//0x2024ad;//
*(RP)DMAC_C2CONFIGURATION = 0x38d;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca, 0x2,0xfff); //ACMD6
//***********************配置DMA1进行四位读*************************
SendCmdWaitResp(0x24e,0,0X1,0x0200,0x4,0Xfff); // CMD18 4bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
complete = *(RP)SDC_INTERRUPT_STATUS;
while((complete |0xfffffffd) != 0xfffffffd)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
CompareMem(MEM_BLOCK_BEGIN,END(5),0x200);
for (i=0;i<5000;i++);
}
/*************************************************************
* FUNCTION
*
* void SdMultiW4r1(U32 rca)
*
* DESCRIPTION
*
* 多块四位写一位读
*
* AUTHOR
*
* yao
*
* INPUTS
*
* rca SD卡的rca地址号
*
* OUTPUTS
*
* 无
*
*************************************************/
void SdMultiW4r1(U32 rca)
{
U32 i,complete;
erase();//擦除
//***********************配置DMA1进行一位写*************************
*(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
*(RP)DMAC_C2CONTROL = 0x80149b; //0x1e149b
*(RP)DMAC_C2CONFIGURATION = 0x380b;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca,0x2,0xfff); //ACMD6
SendCmdWaitResp(0x32e,0X0,0X3,0x0200,0x4,0Xfff); // CMD25 4bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
while((complete |0xfffffffe) != 0xfffffffe)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
for (i=0;i<5000;i++);
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
*(RP)DMAC_C2SRCADDR = SDC_READ_BUFER_ACCESS;
*(RP)DMAC_C2DESTADDR = END(6);
*(RP)DMAC_C2CONTROL = 0x80249b;//0x2024ad;//
*(RP)DMAC_C2CONFIGURATION = 0x38d;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca,0x0,0xfff); //ACMD6
//***********************配置DMA1进行一位读*************************
SendCmdWaitResp(0x24e,0X0,0X0,0x0200,0x4,0Xfff); //CMD18 1bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
while((complete |0xfffffffd) != 0xfffffffd)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
CompareMem(MEM_BLOCK_BEGIN,END(6),0x200);
for (i=0;i<5000;i++);
}
/*************************************************************
* FUNCTION
*
* void SdMultiW4r4(U32 rca)
*
* DESCRIPTION
*
* 多块四位写四位读
*
* AUTHOR
*
* yao
*
* INPUTS
*
* rca SD卡的rca地址号
*
* OUTPUTS
*
* 无
*
*************************************************/
void SdMultiW4r4(U32 rca)
{
U32 i,complete;
erase();//擦除
//***********************配置DMA1进行一位写*************************
*(RP)DMAC_C2SRCADDR = MEM_BLOCK_BEGIN;
*(RP)DMAC_C2DESTADDR = SDC_WRITE_BUFER_ACCESS;
*(RP)DMAC_C2CONTROL = 0x80149b; //0x1e149b
*(RP)DMAC_C2CONFIGURATION = 0x380b;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca,0x2,0xfff); //ACMD6
SendCmdWaitResp(0x32e,0X0,0X3,0x0200,0x4,0Xfff); // CMD25 4bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
complete = *(RP)SDC_INTERRUPT_STATUS;
while((complete |0xfffffffe) != 0xfffffffe)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
for (i=0;i<5000;i++);
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
*(RP)DMAC_C2SRCADDR = SDC_READ_BUFER_ACCESS;
*(RP)DMAC_C2DESTADDR = END(7);
*(RP)DMAC_C2CONTROL = 0x80249b;//0x2024ad;//
*(RP)DMAC_C2CONFIGURATION = 0x38d;
SendCmdWaitIdle(0x6ea,rca,0xfff);//CMD55
SendCmdWaitIdle(0xca, 0x2,0xfff); //ACMD6
//***********************配置DMA1进行四位读*************************
SendCmdWaitResp(0x24e,0,0X1,0x0200,0x4,0Xfff); // CMD18 4bit mode
complete = *(RP)SDC_INTERRUPT_STATUS;;
while ((complete & 0x00000040) != 0x00000040)
{
complete = *(RP)SDC_INTERRUPT_STATUS;
}
while((complete |0xfffffffd) != 0xfffffffd)
{
printf("CRC ERROR");
complete = *(RP)SDC_INTERRUPT_STATUS;
}
SendCmdWaitIdle(0x18a,0x0,0xfff); //stop CMD12
CompareMem(MEM_BLOCK_BEGIN,END(7),0x200);
for (i=0;i<5000;i++);
}
/*************************************************************
* FUNCTION
*
* void FifoReset()
*
* DESCRIPTION
*
* FIFO初始化
*
* AUTHOR
*
* yao
*
* INPUTS
*
* 无
*
* OUTPUTS
*
* 无
*
*************************************************/
void FifoReset()
{
U32 i,tmp;
*(RP)SDC_CLOCK_CONTROL=0X0000; //配置SD时钟
for (i=0;i<10;i++);
*(RP)SDC_CLOCK_CONTROL=0X0004; //打开SD时钟
for (i=0;i<2;i++);
while((*(RP)SDC_INTERRUPT_STATUS & 0x200)!=0x200) //复位RXFIFO
{
tmp = *(RP)SDC_READ_BUFER_ACCESS;
for (i=0;i<10;i++);
}
while((*(RP)SDC_INTERRUPT_STATUS & 0x800)!=0x800) //复位TXFIFO
{
*(RP)SDC_WRITE_BUFER_ACCESS = tmp;
for (i=0;i<10;i++);
}
}
int main()
{
int i;
U32 head;
U32 rca;
//**************************初始化一段数据************************************
head = MEM_BLOCK_BEGIN;
for(i=0; i<BLOCK_SIZE; i++)
{
*(RP)head = i;
head = head + 4;
}
//********************************初始化SD卡**************************************
//得到SD卡的rca地址号,进行下面操作的时候都要给卡发送地址号
rca = InitialSd();
//********************************初始化FIFO**************************************
FifoReset();
//********************************读写测试开始************************************
SdSingleW1r1(rca); //单块 一位写一位读
SdSingleW1r4(rca); //单块 一位写四位读
SdSingleW4r1(rca); //单块 四位写一位读
SdSingleW4r4(rca); //单块 四位写四位读
SdMultiW1r1(rca); //多块 一位写一位读
SdMultiW1r4(rca); //多块 一位写四位读
SdMultiW4r1(rca); //多块 四位写一位读
SdMultiW4r4(rca); //多块 四位写四位读
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -