29#define SD_BLOCK_SIZE 512
37uint32_t _sd_uR3_CMD=0;
38uint32_t _sd_uR7_CMD=0;
39uint8_t
volatile _sd_SDDataReady =
FALSE;
41uint8_t *_sd_pSDHCBuffer;
42uint32_t _sd_ReferenceClock;
45#pragma data_alignment = 4
46static uint8_t _sd_ucSDHCBuffer[512];
48static uint8_t _sd_ucSDHCBuffer[512]
__attribute__((aligned(4)));
54uint8_t pSD0_offset = 0;
55uint8_t pSD1_offset = 0;
79int SD_SDCommand(
SD_INFO_T *pSD, uint8_t ucCmd, uint32_t uArg)
96int SD_SDCmdAndRsp(
SD_INFO_T *pSD, uint8_t ucCmd, uint32_t uArg,
int ntickCount)
108 if(ntickCount-- == 0)
136 if (((
SD->RESP1 & 0xff) != 0x55) && ((
SD->RESP0 & 0xf) != 0x01))
161int SD_Swap32(
int val)
168 val |= (buf<<8)&0xff0000;
169 val |= (buf>>8)&0xff00;
170 val |= (buf>>24)&0xff;
174 return ((val<<24) | ((val<<8)&0xff0000) | ((val>>8)&0xff00) | (val>>24));
179int SD_SDCmdAndRsp2(
SD_INFO_T *pSD, uint8_t ucCmd, uint32_t uArg, uint32_t *puR2ptr)
182 unsigned int tmpBuf[5];
202 tmpBuf[i] = SD_Swap32(*(
int*)(
SD_BASE+i*4));
205 *puR2ptr++ = ((tmpBuf[i] & 0x00ffffff)<<8) | ((tmpBuf[i+1] & 0xff000000)>>24);
213int SD_SDCmdAndRspDataIn(
SD_INFO_T *pSD, uint8_t ucCmd, uint32_t uArg)
218 buf = (
SD->CTL&(~SDH_CTL_CMDCODE_Msk))|(ucCmd << 8)|
256#define SD_CLK_DIV0_MAX 256
258void SD_Set_clock(uint32_t sd_clock_khz)
260 uint32_t rate, div1, i;
261 uint32_t u32SD_ClkSrc;
263 if(sd_clock_khz >= 24000)
265 sd_clock_khz = 24000;
273 _sd_ReferenceClock = (
__HIRC / 1000);
279 rate = _sd_ReferenceClock / sd_clock_khz;
282 if (_sd_ReferenceClock % sd_clock_khz != 0)
285 if(rate >= SD_CLK_DIV0_MAX)
287 rate = SD_CLK_DIV0_MAX;
291 div1 = ((rate -1) & 0xFF);
294 CLK->CLKDIV0 &= ~CLK_CLKDIV0_SDHDIV_Msk;
297 for(i=0; i<1000; i++);
301void SD_CardSelect(
int cardSel)
305 SD->CTL |= (
SD->CTL & ~SDH_CTL_SDPORT_Msk);
307 else if(cardSel == 1)
313uint32_t SD_CardDetection(uint32_t u32CardNum)
332 for(i= 0; i < 5000; i++);
342 SD->CTL &= ~SDH_CTL_CLKKEEP0_Msk;
361 for(i= 0; i < 5000; i++);
371 SD->CTL &= ~SDH_CTL_CLKKEEP1_Msk;
383 int volatile i, status;
385 uint32_t CIDBuffer[4];
386 unsigned int volatile u32CmdTimeOut;
401 SD_SDCommand(pSD, 0, 0);
402 for (i=0x1000; i>0; i--);
407 u32CmdTimeOut = 0xFFFFF;
410 i = SD_SDCmdAndRsp(pSD, 8, 0x00000155, u32CmdTimeOut);
414 SD_SDCmdAndRsp(pSD, 55, 0x00, u32CmdTimeOut);
416 SD_SDCmdAndRsp(pSD, 41, 0x40ff8000, u32CmdTimeOut);
419 while (!(resp & 0x00800000))
421 SD_SDCmdAndRsp(pSD, 55, 0x00, u32CmdTimeOut);
423 SD_SDCmdAndRsp(pSD, 41, 0x40ff8000, u32CmdTimeOut);
426 if (resp & 0x00400000)
434 SD_SDCommand(pSD, 0, 0);
435 for (i=0x100; i>0; i--);
437 i = SD_SDCmdAndRsp(pSD, 55, 0x00, u32CmdTimeOut);
441 SD_SDCommand(pSD, 0, 0);
442 for (i=0x100; i>0; i--);
446 if (SD_SDCmdAndRsp(pSD, 1, 0x40ff8000, u32CmdTimeOut) != 2)
449 while (!(resp & 0x00800000))
453 SD_SDCmdAndRsp(pSD, 1, 0x40ff8000, u32CmdTimeOut);
457 if(resp & 0x00400000)
471 SD_SDCmdAndRsp(pSD, 41, 0x00ff8000, u32CmdTimeOut);
473 while (!(resp & 0x00800000))
475 SD_SDCmdAndRsp(pSD, 55, 0x00,u32CmdTimeOut);
477 SD_SDCmdAndRsp(pSD, 41, 0x00ff8000, u32CmdTimeOut);
492 SD_SDCmdAndRsp2(pSD, 2, 0x00, CIDBuffer);
495 if ((status = SD_SDCmdAndRsp(pSD, 3, 0x10000, 0)) !=
Successful)
501 if ((status = SD_SDCmdAndRsp(pSD, 3, 0x00, 0)) !=
Successful)
504 pSD->
RCA = (
SD->RESP0 << 8) & 0xffff0000;
514 int volatile status=0;
515 uint16_t current_comsumption, busy_status0;
517 SD->DMASA = (uint32_t)_sd_pSDHCBuffer;
520 if ((status = SD_SDCmdAndRspDataIn(pSD, 6, 0x00ffff01)) !=
Successful)
523 current_comsumption = _sd_pSDHCBuffer[0]<<8 | _sd_pSDHCBuffer[1];
524 if (!current_comsumption)
527 busy_status0 = _sd_pSDHCBuffer[28]<<8 | _sd_pSDHCBuffer[29];
531 SD->DMASA = (uint32_t)_sd_pSDHCBuffer;
534 if ((status = SD_SDCmdAndRspDataIn(pSD, 6, 0x80ffff01)) !=
Successful)
547 current_comsumption = _sd_pSDHCBuffer[0]<<8 | _sd_pSDHCBuffer[1];
548 if (!current_comsumption)
560 int volatile status=0;
563 if ((status = SD_SDCmdAndRsp(pSD, 7, pSD->
RCA, 0)) !=
Successful)
571 _sd_pSDHCBuffer = (uint8_t *)((uint32_t)_sd_ucSDHCBuffer);
572 SD->DMASA = (uint32_t)_sd_pSDHCBuffer;
575 if ((status = SD_SDCmdAndRsp(pSD, 55, pSD->
RCA, 0)) !=
Successful)
577 if ((status = SD_SDCmdAndRspDataIn(pSD, 51, 0x00)) !=
Successful)
580 if ((_sd_ucSDHCBuffer[0] & 0xf) == 0x2)
582 status = SD_SwitchToHighSpeed(pSD);
590 if ((status = SD_SDCmdAndRsp(pSD, 55, pSD->
RCA, 0)) !=
Successful)
592 if ((status = SD_SDCmdAndRsp(pSD, 6, 0x02, 0)) !=
Successful)
599 _sd_pSDHCBuffer = (uint8_t *)((uint32_t)_sd_ucSDHCBuffer);
600 SD->DMASA = (uint32_t) _sd_pSDHCBuffer;
603 if ((status = SD_SDCmdAndRsp(pSD, 55, pSD->
RCA, 0)) !=
Successful)
605 if ((status = SD_SDCmdAndRspDataIn(pSD, 51, 0x00)) !=
Successful)
609 if ((status = SD_SDCmdAndRsp(pSD, 55, pSD->
RCA, 0)) !=
Successful)
612 if ((status = SD_SDCmdAndRsp(pSD, 6, 0x02, 0)) !=
Successful)
621 SD->CTL &= ~SDH_CTL_DBW_Msk;
625 arg = (3 << 24) | (183 << 16) | (1 << 8);
638 SD_SDCommand(pSD, 7, 0);
657 unsigned int R_LEN, C_Size, MULT, size;
661 SD_SDCmdAndRsp2(pSD, 9, pSD->
RCA, Buffer);
666 if ((Buffer[0] & 0xc0000000) == 0xc0000000)
670 SD_SDCmdAndRsp(pSD, 7, pSD->
RCA, 0);
672 ptr = (uint8_t *)((uint32_t)_sd_ucSDHCBuffer );
673 SD->DMASA = (uint32_t)ptr;
676 if (SD_SDCmdAndRspDataIn(pSD, 8, 0x00) !=
Successful)
679 SD_SDCommand(pSD, 7, 0);
695 R_LEN = (Buffer[1] & 0x000f0000) >> 16;
696 C_Size = ((Buffer[1] & 0x000003ff) << 2) | ((Buffer[2] & 0xc0000000) >> 30);
697 MULT = (Buffer[2] & 0x00038000) >> 15;
698 size = (C_Size+1) * (1<<(MULT+2)) * (1<<R_LEN);
706 if (Buffer[0] & 0xc0000000)
708 C_Size = ((Buffer[1] & 0x0000003f) << 16) | ((Buffer[2] & 0xffff0000) >> 16);
709 size = (C_Size+1) * 512;
716 R_LEN = (Buffer[1] & 0x000f0000) >> 16;
717 C_Size = ((Buffer[1] & 0x000003ff) << 2) | ((Buffer[2] & 0xc0000000) >> 30);
718 MULT = (Buffer[2] & 0x00038000) >> 15;
719 size = (C_Size+1) * (1<<(MULT+2)) * (1<<R_LEN);
733 status = SD_SDCmdAndRsp(pSD, 32, 512, 6000);
738 status = SD_SDCmdAndRsp(pSD, 33, _info->
totalSectorN*512, 6000);
743 status = SD_SDCmdAndRsp(pSD, 38, 0, 6000);
789 SD->CTL |= (
SD->CTL & ~SDH_CTL_SDPORT_Msk);
793 SD->INTEN &= ~SDH_INTEN_CDSRC0_Msk;
806 SD->INTEN &= ~SDH_INTEN_CDSRC1_Msk;
842 SD->CTL &= ~SDH_CTL_SDNWR_Msk;
844 SD->CTL &= ~SDH_CTL_BLKCNT_Msk;
846 SD->CTL &= ~SDH_CTL_DBW_Msk;
848 if(!(SD_CardDetection(u32CardNum)))
853 if (SD_Init(&SD0) < 0)
862 SD_Get_SD_info(&SD0, &SD_DiskInfo0);
864 if (SD_SelectCardType(&SD0))
871 if (SD_Init(&SD1) < 0)
880 SD_Get_SD_info(&SD1, &SD_DiskInfo1);
882 if (SD_SelectCardType(&SD1))
901uint32_t
SD_Read(uint32_t u32CardNum, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount)
903 char volatile bIsSendCmd =
FALSE, buf;
904 unsigned int volatile reg;
905 int volatile i, loop, status;
916 if (u32SecCount == 0)
921 if ((status = SD_SDCmdAndRsp(pSD, 7, pSD->
RCA, 0)) !=
Successful)
925 SD->BLEN = blksize - 1;
928 SD->CMDARG = u32StartSec;
930 SD->CMDARG = u32StartSec * blksize;
932 SD->DMASA = (uint32_t)pu8BufAddr;
934 loop = u32SecCount / 255;
935 for (i=0; i<loop; i++)
938 _sd_SDDataReady =
FALSE;
941 reg =
SD->CTL & ~SDH_CTL_CMDCODE_Msk;
942 reg = reg | 0xff0000;
943 if (bIsSendCmd ==
FALSE)
952 while(!_sd_SDDataReady)
957 if(_sd_SDDataReady)
break;
987 loop = u32SecCount % 255;
991 _sd_SDDataReady =
FALSE;
994 reg =
SD->CTL & (~SDH_CTL_CMDCODE_Msk);
995 reg = reg & (~SDH_CTL_BLKCNT_Msk);
998 if (bIsSendCmd ==
FALSE)
1007 while(!_sd_SDDataReady)
1042 if (SD_SDCmdAndRsp(pSD, 12, 0, 0))
1049 SD_SDCommand(pSD, 7, 0);
1077uint32_t
SD_Write(uint32_t u32CardNum, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount)
1079 char volatile bIsSendCmd =
FALSE;
1080 unsigned int volatile reg;
1081 int volatile i, loop, status;
1092 if (u32SecCount == 0)
1097 if ((status = SD_SDCmdAndRsp(pSD, 7, pSD->
RCA, 0)) !=
Successful)
1106 SD->CMDARG = u32StartSec;
1110 SD->DMASA = (uint32_t)pu8BufAddr;
1111 loop = u32SecCount / 255;
1112 for (i=0; i<loop; i++)
1115 _sd_SDDataReady =
FALSE;
1118 reg =
SD->CTL & 0xff00c080;
1119 reg = reg | 0xff0000;
1129 while(!_sd_SDDataReady)
1156 loop = u32SecCount % 255;
1160 _sd_SDDataReady =
FALSE;
1163 reg = (
SD->CTL & 0xff00c080) | (loop << 16);
1173 while(!_sd_SDDataReady)
1201 if (SD_SDCmdAndRsp(pSD, 12, 0, 0))
1207 SD_SDCommand(pSD, 7, 0);
void *__dso_handle __attribute__((weak))
NUC472/NUC442 peripheral access layer header file. This file contains all the peripheral register's d...
#define SDH_DMACTL_DMAEN_Msk
#define SDH_CTL_SDNWR_Pos
#define SDH_CTL_CLK8OEN_Msk
#define SDH_CTL_SDPORT_Pos
#define SDH_GCTL_GCTLRST_Msk
#define SDH_INTSTS_CDSTS0_Msk
#define SDH_INTSTS_BLKDIF_Msk
#define SDH_CTL_CLKKEEP1_Msk
#define SDH_INTSTS_CDSTS1_Msk
#define SDH_INTSTS_DAT0STS_Msk
#define SDH_CTL_CLK74OEN_Msk
#define SDH_INTEN_CDSRC1_Msk
#define SDH_DMACTL_DMARST_Msk
#define SDH_CTL_BLKCNT_Pos
#define SDH_GCTL_SDEN_Msk
#define SDH_INTSTS_CRC7_Msk
#define CLK_CLKDIV0_SDHDIV_Pos
#define SDH_CTL_CLKKEEP0_Msk
#define CLK_CLKSEL0_SDHSEL_Msk
#define SDH_INTSTS_CRC16_Msk
#define SDH_INTEN_BLKDIEN_Msk
#define SDH_INTSTS_CRCIF_Msk
#define SDH_INTEN_CDSRC0_Msk
#define SDH_CTL_CTLRST_Msk
#define CLK_CLKSEL0_SDHSEL_HXT
#define CLK_CLKSEL0_SDHSEL_HIRC
#define CLK_CLKSEL0_SDHSEL_PLL
#define CLK_CLKSEL0_SDHSEL_HCLK
uint32_t CLK_GetHCLKFreq(void)
Get HCLK frequency.
uint32_t CLK_GetPLLClockFreq(void)
This function get PLL frequency. The frequency unit is Hz.
uint32_t CLK_GetHXTFreq(void)
Get external high speed crystal clock frequency.
#define CardDetect_From_DAT3
uint32_t SD_Read(uint32_t u32CardNum, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount)
This function use to read data from SD card.
unsigned int totalSectorN
uint32_t SD_Write(uint32_t u32CardNum, uint8_t *pu8BufAddr, uint32_t u32StartSec, uint32_t u32SecCount)
This function use to write data to SD card.
void SD_Open(uint32_t u32CardDetSrc)
This function use to reset SD function and select card detection source and pin.
void SD_Probe(uint32_t u32CardNum)
This function use to initial SD card.
#define TRUE
Boolean true, define to use in API parameters or return value.
#define FALSE
Boolean false, define to use in API parameters or return value.