1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003 |
- #include "stm32f4xx_sdio.h"
- #include "stm32f4xx_rcc.h"
-
- #define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE)
- #define CLKCR_OFFSET (SDIO_OFFSET + 0x04)
- #define CLKEN_BitNumber 0x08
- #define CLKCR_CLKEN_BB (PERIPH_BB_BASE + (CLKCR_OFFSET * 32) + (CLKEN_BitNumber * 4))
- #define CMD_OFFSET (SDIO_OFFSET + 0x0C)
- #define SDIOSUSPEND_BitNumber 0x0B
- #define CMD_SDIOSUSPEND_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSUSPEND_BitNumber * 4))
- #define ENCMDCOMPL_BitNumber 0x0C
- #define CMD_ENCMDCOMPL_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ENCMDCOMPL_BitNumber * 4))
- #define NIEN_BitNumber 0x0D
- #define CMD_NIEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (NIEN_BitNumber * 4))
- #define ATACMD_BitNumber 0x0E
- #define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4))
- #define DCTRL_OFFSET (SDIO_OFFSET + 0x2C)
- #define DMAEN_BitNumber 0x03
- #define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4))
- #define RWSTART_BitNumber 0x08
- #define DCTRL_RWSTART_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTART_BitNumber * 4))
- #define RWSTOP_BitNumber 0x09
- #define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4))
- #define RWMOD_BitNumber 0x0A
- #define DCTRL_RWMOD_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWMOD_BitNumber * 4))
- #define SDIOEN_BitNumber 0x0B
- #define DCTRL_SDIOEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOEN_BitNumber * 4))
- #define CLKCR_CLEAR_MASK ((uint32_t)0xFFFF8100)
- #define PWR_PWRCTRL_MASK ((uint32_t)0xFFFFFFFC)
- #define DCTRL_CLEAR_MASK ((uint32_t)0xFFFFFF08)
- #define CMD_CLEAR_MASK ((uint32_t)0xFFFFF800)
- #define SDIO_RESP_ADDR ((uint32_t)(SDIO_BASE + 0x14))
- void SDIO_DeInit(void)
- {
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE);
- RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE);
- }
- void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct)
- {
- uint32_t tmpreg = 0;
-
-
- assert_param(IS_SDIO_CLOCK_EDGE(SDIO_InitStruct->SDIO_ClockEdge));
- assert_param(IS_SDIO_CLOCK_BYPASS(SDIO_InitStruct->SDIO_ClockBypass));
- assert_param(IS_SDIO_CLOCK_POWER_SAVE(SDIO_InitStruct->SDIO_ClockPowerSave));
- assert_param(IS_SDIO_BUS_WIDE(SDIO_InitStruct->SDIO_BusWide));
- assert_param(IS_SDIO_HARDWARE_FLOW_CONTROL(SDIO_InitStruct->SDIO_HardwareFlowControl));
-
-
-
- tmpreg = SDIO->CLKCR;
-
-
- tmpreg &= CLKCR_CLEAR_MASK;
-
-
-
-
-
-
-
- tmpreg |= (SDIO_InitStruct->SDIO_ClockDiv | SDIO_InitStruct->SDIO_ClockPowerSave |
- SDIO_InitStruct->SDIO_ClockBypass | SDIO_InitStruct->SDIO_BusWide |
- SDIO_InitStruct->SDIO_ClockEdge | SDIO_InitStruct->SDIO_HardwareFlowControl);
-
-
- SDIO->CLKCR = tmpreg;
- }
- void SDIO_StructInit(SDIO_InitTypeDef* SDIO_InitStruct)
- {
-
- SDIO_InitStruct->SDIO_ClockDiv = 0x00;
- SDIO_InitStruct->SDIO_ClockEdge = SDIO_ClockEdge_Rising;
- SDIO_InitStruct->SDIO_ClockBypass = SDIO_ClockBypass_Disable;
- SDIO_InitStruct->SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
- SDIO_InitStruct->SDIO_BusWide = SDIO_BusWide_1b;
- SDIO_InitStruct->SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
- }
- void SDIO_ClockCmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) CLKCR_CLKEN_BB = (uint32_t)NewState;
- }
- void SDIO_SetPowerState(uint32_t SDIO_PowerState)
- {
-
- assert_param(IS_SDIO_POWER_STATE(SDIO_PowerState));
-
- SDIO->POWER = SDIO_PowerState;
- }
- uint32_t SDIO_GetPowerState(void)
- {
- return (SDIO->POWER & (~PWR_PWRCTRL_MASK));
- }
- void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct)
- {
- uint32_t tmpreg = 0;
-
-
- assert_param(IS_SDIO_CMD_INDEX(SDIO_CmdInitStruct->SDIO_CmdIndex));
- assert_param(IS_SDIO_RESPONSE(SDIO_CmdInitStruct->SDIO_Response));
- assert_param(IS_SDIO_WAIT(SDIO_CmdInitStruct->SDIO_Wait));
- assert_param(IS_SDIO_CPSM(SDIO_CmdInitStruct->SDIO_CPSM));
-
-
- SDIO->ARG = SDIO_CmdInitStruct->SDIO_Argument;
-
-
-
- tmpreg = SDIO->CMD;
-
- tmpreg &= CMD_CLEAR_MASK;
-
-
-
-
- tmpreg |= (uint32_t)SDIO_CmdInitStruct->SDIO_CmdIndex | SDIO_CmdInitStruct->SDIO_Response
- | SDIO_CmdInitStruct->SDIO_Wait | SDIO_CmdInitStruct->SDIO_CPSM;
-
-
- SDIO->CMD = tmpreg;
- }
- void SDIO_CmdStructInit(SDIO_CmdInitTypeDef* SDIO_CmdInitStruct)
- {
-
- SDIO_CmdInitStruct->SDIO_Argument = 0x00;
- SDIO_CmdInitStruct->SDIO_CmdIndex = 0x00;
- SDIO_CmdInitStruct->SDIO_Response = SDIO_Response_No;
- SDIO_CmdInitStruct->SDIO_Wait = SDIO_Wait_No;
- SDIO_CmdInitStruct->SDIO_CPSM = SDIO_CPSM_Disable;
- }
- uint8_t SDIO_GetCommandResponse(void)
- {
- return (uint8_t)(SDIO->RESPCMD);
- }
- uint32_t SDIO_GetResponse(uint32_t SDIO_RESP)
- {
- __IO uint32_t tmp = 0;
-
- assert_param(IS_SDIO_RESP(SDIO_RESP));
- tmp = SDIO_RESP_ADDR + SDIO_RESP;
-
- return (*(__IO uint32_t *) tmp);
- }
- void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
- {
- uint32_t tmpreg = 0;
-
-
- assert_param(IS_SDIO_DATA_LENGTH(SDIO_DataInitStruct->SDIO_DataLength));
- assert_param(IS_SDIO_BLOCK_SIZE(SDIO_DataInitStruct->SDIO_DataBlockSize));
- assert_param(IS_SDIO_TRANSFER_DIR(SDIO_DataInitStruct->SDIO_TransferDir));
- assert_param(IS_SDIO_TRANSFER_MODE(SDIO_DataInitStruct->SDIO_TransferMode));
- assert_param(IS_SDIO_DPSM(SDIO_DataInitStruct->SDIO_DPSM));
-
- SDIO->DTIMER = SDIO_DataInitStruct->SDIO_DataTimeOut;
-
- SDIO->DLEN = SDIO_DataInitStruct->SDIO_DataLength;
-
-
- tmpreg = SDIO->DCTRL;
-
- tmpreg &= DCTRL_CLEAR_MASK;
-
-
-
-
- tmpreg |= (uint32_t)SDIO_DataInitStruct->SDIO_DataBlockSize | SDIO_DataInitStruct->SDIO_TransferDir
- | SDIO_DataInitStruct->SDIO_TransferMode | SDIO_DataInitStruct->SDIO_DPSM;
-
- SDIO->DCTRL = tmpreg;
- }
- void SDIO_DataStructInit(SDIO_DataInitTypeDef* SDIO_DataInitStruct)
- {
-
- SDIO_DataInitStruct->SDIO_DataTimeOut = 0xFFFFFFFF;
- SDIO_DataInitStruct->SDIO_DataLength = 0x00;
- SDIO_DataInitStruct->SDIO_DataBlockSize = SDIO_DataBlockSize_1b;
- SDIO_DataInitStruct->SDIO_TransferDir = SDIO_TransferDir_ToCard;
- SDIO_DataInitStruct->SDIO_TransferMode = SDIO_TransferMode_Block;
- SDIO_DataInitStruct->SDIO_DPSM = SDIO_DPSM_Disable;
- }
- uint32_t SDIO_GetDataCounter(void)
- {
- return SDIO->DCOUNT;
- }
- uint32_t SDIO_ReadData(void)
- {
- return SDIO->FIFO;
- }
- void SDIO_WriteData(uint32_t Data)
- {
- SDIO->FIFO = Data;
- }
- uint32_t SDIO_GetFIFOCount(void)
- {
- return SDIO->FIFOCNT;
- }
- void SDIO_StartSDIOReadWait(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) DCTRL_RWSTART_BB = (uint32_t) NewState;
- }
- void SDIO_StopSDIOReadWait(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) DCTRL_RWSTOP_BB = (uint32_t) NewState;
- }
- void SDIO_SetSDIOReadWaitMode(uint32_t SDIO_ReadWaitMode)
- {
-
- assert_param(IS_SDIO_READWAIT_MODE(SDIO_ReadWaitMode));
-
- *(__IO uint32_t *) DCTRL_RWMOD_BB = SDIO_ReadWaitMode;
- }
- void SDIO_SetSDIOOperation(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) DCTRL_SDIOEN_BB = (uint32_t)NewState;
- }
- void SDIO_SendSDIOSuspendCmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) CMD_SDIOSUSPEND_BB = (uint32_t)NewState;
- }
- void SDIO_CommandCompletionCmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) CMD_ENCMDCOMPL_BB = (uint32_t)NewState;
- }
- void SDIO_CEATAITCmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) CMD_NIEN_BB = (uint32_t)((~((uint32_t)NewState)) & ((uint32_t)0x1));
- }
- void SDIO_SendCEATACmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) CMD_ATACMD_BB = (uint32_t)NewState;
- }
- void SDIO_DMACmd(FunctionalState NewState)
- {
-
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- *(__IO uint32_t *) DCTRL_DMAEN_BB = (uint32_t)NewState;
- }
- void SDIO_ITConfig(uint32_t SDIO_IT, FunctionalState NewState)
- {
-
- assert_param(IS_SDIO_IT(SDIO_IT));
- assert_param(IS_FUNCTIONAL_STATE(NewState));
-
- if (NewState != DISABLE)
- {
-
- SDIO->MASK |= SDIO_IT;
- }
- else
- {
-
- SDIO->MASK &= ~SDIO_IT;
- }
- }
- FlagStatus SDIO_GetFlagStatus(uint32_t SDIO_FLAG)
- {
- FlagStatus bitstatus = RESET;
-
-
- assert_param(IS_SDIO_FLAG(SDIO_FLAG));
-
- if ((SDIO->STA & SDIO_FLAG) != (uint32_t)RESET)
- {
- bitstatus = SET;
- }
- else
- {
- bitstatus = RESET;
- }
- return bitstatus;
- }
- void SDIO_ClearFlag(uint32_t SDIO_FLAG)
- {
-
- assert_param(IS_SDIO_CLEAR_FLAG(SDIO_FLAG));
-
- SDIO->ICR = SDIO_FLAG;
- }
- ITStatus SDIO_GetITStatus(uint32_t SDIO_IT)
- {
- ITStatus bitstatus = RESET;
-
-
- assert_param(IS_SDIO_GET_IT(SDIO_IT));
- if ((SDIO->STA & SDIO_IT) != (uint32_t)RESET)
- {
- bitstatus = SET;
- }
- else
- {
- bitstatus = RESET;
- }
- return bitstatus;
- }
- void SDIO_ClearITPendingBit(uint32_t SDIO_IT)
- {
-
- assert_param(IS_SDIO_CLEAR_IT(SDIO_IT));
-
- SDIO->ICR = SDIO_IT;
- }
|