📄 drvsdcard.c
字号:
MMC_Command_Exec(SD_SEND_OP_COND,0x00,EMPTY,&response);
if (response <= 1)
{
loopguard=0;
do
{
MMC_Command_Exec(SD_SEND_OP_COND,0x00,EMPTY,&response);
if(!++loopguard) break;
DrvSYS_Delay(50);
}while(response!=0);
if(!loopguard) return;
SDtype=SDv1; /* SDv1 */
DBG_PRINTF("SDv1\n");
} else
{
loopguard=0;
do
{
MMC_Command_Exec(SEND_OP_COND,0x00,EMPTY,&response);
if(!++loopguard) break;
DrvSYS_Delay(50);
}while(response!=0);
if(!loopguard) return;
SDtype=MMCv3; /* MMCv3 */
DBG_PRINTF("MMCv3\n");
}
MMC_Command_Exec(SET_BLOCKLEN,(uint32_t)PHYSICAL_BLOCK_SIZE,EMPTY,&response);
}
if(MMC_Command_Exec(SEND_CSD,EMPTY,pchar,&response)==FALSE)
return;
if(response==0)
{
DBG_PRINTF("Change speed:");
for(i=0;i<16;i++) { DBG_PRINTF("0x%X ",pchar[i]);}
} else {
DBG_PRINTF("CARD STATUS 0x%X:\n",response);
for(i=0;i<16;i++) { DBG_PRINTF("0x%X ",pchar[i]);}
LogicSector=0;
return;
}
if(SDtype&SDBlock)// Determine the number of MMC sectors;
{
bl_len = 1 << (pchar[5] & 0x0f) ;
c_size = ((pchar[7] & 0x3F) << 16) |(pchar[8] << 8) | (pchar[9]);
LogicSector=c_size*((512*1024)/bl_len);
}else
{
bl_len = 1 << (pchar[5] & 0x0f) ;
c_size = ((pchar[6] & 0x03) << 10) |(pchar[7] << 2) | ((pchar[8] &0xc0) >> 6);
c_mult = (((pchar[9] & 0x03) << 1) | ((pchar[10] & 0x80) >> 7));
LogicSector=(c_size+1)*(1 << (c_mult+2))*(bl_len/512);
}
DBG_PRINTF("\nLogicSector:%d, PHYSICAL_SIZE:%dMB\n",LogicSector,(LogicSector/2/1024));
loopguard = 0;
while((MMC_Command_Exec(READ_SINGLE_BLOCK,0,0,&response)==FALSE)) {
if(!++loopguard) break;
}
Is_Initialized = 1;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSDCARD_Open */
/* */
/* Parameters: */
/* None */
/* */
/* Returns: */
/* E_DRVSDCARD_INITIAL_FAIL Intial SDCARD Failed */
/* E_SUCCESS Success */
/* */
/* Side effects: */
/* Description: */
/* This function is used to Open GPIO function and intial SDCARD */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_Open(void)
{
uint32_t Temp[2];
Temp[0]=0xFFFFFFFF;
Temp[1]=Temp[0];
DrvSYS_SetIPClock(E_SYS_SPI1_CLK,1);
DrvGPIO_InitFunction(E_FUNC_SPI1); // enable SPI funztion and pin
DrvSPI_Open(eDRVSPI_PORT1,eDRVSPI_MASTER,eDRVSPI_TYPE1,8);
DrvSPI_DisableAutoSS(eDRVSPI_PORT1);
DrvSPI_SetSlaveSelectActiveLevel(eDRVSPI_PORT1, eDRVSPI_ACTIVE_LOW_FALLING);
DrvSPI_SetEndian(eDRVSPI_PORT1, eDRVSPI_MSB_FIRST);
DrvSPI_SetTxRegister(eDRVSPI_PORT1,Temp,2);
DrvSPI_SetClockFreq(eDRVSPI_PORT1,300000,300000);
MMC_FLASH_Init();
DrvSYS_Delay(1000);
DrvSPI_SetClockFreq(eDRVSPI_PORT1,12000000,12000000);
if (Is_Initialized)
{
DBG_PRINTF("SDCARD INIT OK\n\n");
return E_SUCCESS;
}
else
return E_DRVSDCARD_INITIAL_FAIL;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSDCARD_Close */
/* */
/* Parameters: */
/* None */
/* */
/* Returns: */
/* None */
/* */
/* */
/* Side effects: */
/* Description: */
/* This function is used to close SDCARD */
/*---------------------------------------------------------------------------------------------------------*/
void DrvSDCARD_Close(void)
{
DrvSPI_Close(eDRVSPI_PORT1);
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSDCARD_GetCardSize */
/* */
/* Parameters: */
/* PUINT32 pu32TotSecCnt */
/* */
/* Returns: */
/* TRUE The size is already saved in arg1 */
/* FALSE The size is zero */
/* */
/* Side effects: */
/* Description: */
/* This function is used to get card total sector after SDCARD is opened */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_GetCardSize(uint32_t* pu32TotSecCnt)
{
if (LogicSector == 0)
return FALSE;
else
*pu32TotSecCnt = LogicSector;
return TRUE;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: GetLogicSector */
/* */
/* Parameters: */
/* None */
/* */
/* Returns: */
/* The Logic Sector size */
/* */
/* Side effects: */
/* Description: */
/* This function is used to get card total sector after SDCARD is opened */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t GetLogicSector(void)
{
return LogicSector;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: DrvSDCARD_GetVersion */
/* */
/* Parameters: */
/* None */
/* */
/* Returns: */
/* SDCARD Library Version */
/* */
/* */
/* Side effects: */
/* Description: */
/* This function is used to Get SD driver version */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvSDCARD_GetVersion(void)
{
return (DRVSDCARD_MAJOR_NUM << 16) | (DRVSDCARD_MINOR_NUM << 8) | DRVSDCARD_BUILD_NUM;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: SpiRead */
/* */
/* Parameters: */
/* uint32_t addr Set start address for LBA */
/* uint32_t size Set data size (byte) */
/* uint32_t buffer Set buffer pointer */
/* */
/* Returns: */
/* SDCARD Library Version */
/* */
/* */
/* Side effects: */
/* Description: */
/* This function is used to Get data from SD card */
/*---------------------------------------------------------------------------------------------------------*/
void SpiRead(uint32_t addr, uint32_t size, uint8_t* buffer)
{
/* This is low level read function of USB Mass Storage */
uint32_t response;
if(SDtype&SDBlock)
{
while(size >= PHYSICAL_BLOCK_SIZE)
{
while(MMC_Command_Exec(READ_SINGLE_BLOCK,addr,buffer,&response)==FALSE);
addr ++;
buffer += PHYSICAL_BLOCK_SIZE;
size -= PHYSICAL_BLOCK_SIZE;
}
}else
{
addr*=PHYSICAL_BLOCK_SIZE;
while(size >= PHYSICAL_BLOCK_SIZE)
{
while(MMC_Command_Exec(READ_SINGLE_BLOCK,addr,buffer,&response)==FALSE);
addr += PHYSICAL_BLOCK_SIZE;
buffer += PHYSICAL_BLOCK_SIZE;
size -= PHYSICAL_BLOCK_SIZE;
}
}
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function: SpiWrite */
/* */
/* Parameters: */
/* uint32_t addr Set start address LBA */
/* uint32_t size Set data size (byte) */
/* uint32_t buffer Set buffer pointer */
/* */
/* Returns: */
/* SDCARD Library Version */
/* */
/* */
/* Side effects: */
/* Description: */
/* This function is used to store data into SD card */
/*---------------------------------------------------------------------------------------------------------*/
void SpiWrite(uint32_t addr, uint32_t size, uint8_t* buffer)
{
uint32_t response;
if(SDtype&SDBlock)
{
while(size >= PHYSICAL_BLOCK_SIZE)
{
while(MMC_Command_Exec(WRITE_BLOCK,addr,buffer,&response)==FALSE);
addr ++;
buffer += PHYSICAL_BLOCK_SIZE;
size -= PHYSICAL_BLOCK_SIZE;
}
}else
{
addr*=PHYSICAL_BLOCK_SIZE;
while(size >= PHYSICAL_BLOCK_SIZE)
{
while(MMC_Command_Exec(WRITE_BLOCK,addr,buffer,&response)==FALSE);
addr += (PHYSICAL_BLOCK_SIZE);
buffer += PHYSICAL_BLOCK_SIZE;
size -= PHYSICAL_BLOCK_SIZE;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -