LPCOpen Platform for LPC18XX/43XX microcontrollers: CHIP: LPC18xx/43xx SDIO Card driver

| LPCOpen Platform for LPC18XX/43XX microcontrollers 18XX43XX LPCOpen Platform for the NXP LPC18XX/43XX family of Microcontrollers

- Main Page
- Modules
- Data Structures
- Files

Macros | Enumerations | Functions
CHIP: LPC18xx/43xx SDIO Card driver
LPC18xx/43xx chip specific drivers

## Detailed Description

## Macros
#define | SDIO_CMD_RESP_R1 (1UL << 6)
| SDIO Command Responses. More...
#define | SDIO_CMD_RESP_R2 (3UL << 6)
#define | SDIO_CMD_RESP_R3 (1UL << 6)
#define | SDIO_CMD_RESP_R4 (1UL << 6)
#define | SDIO_CMD_RESP_R5 (1UL << 6)
#define | SDIO_CMD_RESP_R6 (1UL << 6)
#define | SDIO_CMD_CRC (1UL << 8) /**! Response must have a valid CRC */
| SDIO Command misc options. More...
#define | SDIO_CMD_DATA (1UL << 9) /**! Command is a data transfer command */
#define | CMD0 (0 | (1 << 15))
| List of commands. More...
#define | CMD5 (5 | SDIO_CMD_RESP_R4)
#define | CMD3 (3 | SDIO_CMD_RESP_R6)
#define | CMD7 (7 | SDIO_CMD_RESP_R1)
#define | CMD52 (52 | SDIO_CMD_RESP_R5 | SDIO_CMD_CRC)
#define | CMD53 (53 | SDIO_CMD_RESP_R5 | SDIO_CMD_DATA | SDIO_CMD_CRC)
#define | SDIO_ERROR -1 /**! General SDIO Error */
| SDIO Error numbers. More...
#define | SDIO_ERR_FNUM -2 /**! Error getting Number of functions supported */
#define | SDIO_ERR_READWRITE -3 /**! Error when performing Read/write of data */
#define | SDIO_ERR_VOLT -4 /**! Error Reading or setting up the voltage to 3v3 */
#define | SDIO_ERR_RCA -5 /**! Error during RCA phase */
#define | SDIO_ERR_INVFUNC -6 /**! Invalid function argument */
#define | SDIO_ERR_INVARG -7 /**! Invalid argument supplied to function */
#define | SDIO_VOLT_3_3 0x00100000UL /* for CMD5 */
#define | SDIO_MODE_BLOCK (1UL << 27)
| Block mode transfer flag. More...
#define | SDIO_MODE_BUFFER (1UL << 26)
| Buffer mode transfer flag. More...
#define | SDIO_AREA_CIA 0 /* function 0 */
#define | SDIO_CCCR_LSC 0x40u /* card is low-speed cards */
#define | SDIO_CCCR_4BLS 0x80u /* 4-bit support for low-speed cards */
#define | SDIO_POWER_INIT 1
#define | SDIO_CLK_HISPEED 33000000UL /* High-Speed Clock */
#define | SDIO_CLK_FULLSPEED 16000000UL /* Full-Speed Clock */
#define | SDIO_CLK_LOWSPEED 400000 /* Low-Speed Clock */

## Enumerations
enum | SDIO_EVENT { SDIO_START_COMMAND, SDIO_START_DATA, SDIO_WAIT_DELAY, SDIO_WAIT_COMMAND, SDIO_WAIT_DATA, SDIO_CARD_DETECT, SDIO_CMD_ERR, SDIO_CMD_DONE, SDIO_DATA_ERR, SDIO_DATA_DONE, SDIO_CARD_INT }
| SDIO Driver events. More...

## Functions
int | SDIO_Card_Init (LPC_SDMMC_T *pSDMMC, uint32_t freq)
| Initialize the SDIO card. More...
int | SDIO_Write_Direct (LPC_SDMMC_T *pSDMMC, uint32_t func, uint32_t addr, uint32_t data)
| Write 8-Bit register from SDIO register space. More...
int | SDIO_WriteRead_Direct (LPC_SDMMC_T *pSDMMC, uint32_t func, uint32_t addr, uint32_t *data)
| Write 8-Bit register from SDIO register space and read the register back. More...
int | SDIO_Read_Direct (LPC_SDMMC_T *pSDMMC, uint32_t func, uint32_t addr, uint32_t *data)
| Read an 8-Bit register from SDIO register space. More...
void | SDIO_Setup_Callback (LPC_SDMMC_T *pSDMMC, void(*wake_evt)(LPC_SDMMC_T *pSDMMC, uint32_t event, void *arg), uint32_t(*wait_evt)(LPC_SDMMC_T *pSDMMC, uint32_t event, void *arg))
| Setup SDIO wait and wakeup callbacks. More...
void | SDIO_Handler (LPC_SDMMC_T *pSDMMC)
| SDIO Event handler [Should be called from SDIO interrupt handler]. More...
uint32_t | SDIO_Send_Command (LPC_SDMMC_T *pSDMMC, uint32_t cmd, uint32_t arg)
| Sends a command to the SDIO Card [Example CMD52]. More...
uint32_t | SDIO_Card_GetBlockSize (LPC_SDMMC_T *pSDMMC, uint32_t func)
| Gets the block size of a given function. More...
int | SDIO_Card_SetBlockSize (LPC_SDMMC_T *pSDMMC, uint32_t func, uint32_t blkSize)
| Sets the block size of a given function. More...
int | SDIO_Card_WriteData (LPC_SDMMC_T *pSDMMC, uint32_t func, uint32_t dest_addr, const uint8_t *src_addr, uint32_t size, uint32_t flags)
| Writes stream or block of data to the SDIO card [Using CMD53]. More...
int | SDIO_Card_ReadData (LPC_SDMMC_T *pSDMMC, uint32_t func, uint8_t *dest_addr, uint32_t src_addr, uint32_t size, uint32_t flags)
| Reads stream or block of data from the SDIO card [Using CMD53]. More...
int | SDIO_Card_DisableInt (LPC_SDMMC_T *pSDMMC, uint32_t func)
| Disable SDIO interrupt for a given function. More...
int | SDIO_Card_EnableInt (LPC_SDMMC_T *pSDMMC, uint32_t func)
| Enable SDIO interrupt for a given function. More...

## Macro Definition Documentation

#define CMD0 (0 | (1 << 15))

List of commands.

Definition at line 74 of file sdio_18xx_43xx.h.

#define CMD3 (3 | SDIO_CMD_RESP_R6)

Definition at line 76 of file sdio_18xx_43xx.h.

#define CMD5 (5 | SDIO_CMD_RESP_R4)

Definition at line 75 of file sdio_18xx_43xx.h.

#define CMD52 (52 | SDIO_CMD_RESP_R5 | SDIO_CMD_CRC)

Definition at line 78 of file sdio_18xx_43xx.h.

#define CMD53 (53 | SDIO_CMD_RESP_R5 | SDIO_CMD_DATA | SDIO_CMD_CRC)

Definition at line 79 of file sdio_18xx_43xx.h.

#define CMD7 (7 | SDIO_CMD_RESP_R1)

Definition at line 77 of file sdio_18xx_43xx.h.

#define SDIO_AREA_CIA 0 /* function 0 */

Definition at line 114 of file sdio_18xx_43xx.h.

#define SDIO_CCCR_4BLS 0x80u /* 4-bit support for low-speed cards */

Definition at line 118 of file sdio_18xx_43xx.h.

#define SDIO_CCCR_LSC 0x40u /* card is low-speed cards */

Definition at line 117 of file sdio_18xx_43xx.h.

#define SDIO_CLK_FULLSPEED 16000000UL /* Full-Speed Clock */

Definition at line 123 of file sdio_18xx_43xx.h.

#define SDIO_CLK_HISPEED 33000000UL /* High-Speed Clock */

Definition at line 122 of file sdio_18xx_43xx.h.

#define SDIO_CLK_LOWSPEED 400000 /* Low-Speed Clock */

Definition at line 124 of file sdio_18xx_43xx.h.

#define SDIO_CMD_CRC (1UL << 8) /**! Response must have a valid CRC */

SDIO Command misc options.

Definition at line 70 of file sdio_18xx_43xx.h.

#define SDIO_CMD_DATA (1UL << 9) /**! Command is a data transfer command */

Definition at line 71 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R1 (1UL << 6)

SDIO Command Responses.

Definition at line 62 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R2 (3UL << 6)

Definition at line 63 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R3 (1UL << 6)

Definition at line 64 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R4 (1UL << 6)

Definition at line 65 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R5 (1UL << 6)

Definition at line 66 of file sdio_18xx_43xx.h.

#define SDIO_CMD_RESP_R6 (1UL << 6)

Definition at line 67 of file sdio_18xx_43xx.h.

#define SDIO_ERR_FNUM -2 /**! Error getting Number of functions supported */

Definition at line 83 of file sdio_18xx_43xx.h.

#define SDIO_ERR_INVARG -7 /**! Invalid argument supplied to function */

Definition at line 88 of file sdio_18xx_43xx.h.

#define SDIO_ERR_INVFUNC -6 /**! Invalid function argument */

Definition at line 87 of file sdio_18xx_43xx.h.

#define SDIO_ERR_RCA -5 /**! Error during RCA phase */

Definition at line 86 of file sdio_18xx_43xx.h.

#define SDIO_ERR_READWRITE -3 /**! Error when performing Read/write of data */

Definition at line 84 of file sdio_18xx_43xx.h.

#define SDIO_ERR_VOLT -4 /**! Error Reading or setting up the voltage to 3v3 */

Definition at line 85 of file sdio_18xx_43xx.h.

#define SDIO_ERROR -1 /**! General SDIO Error */

SDIO Error numbers.

Definition at line 82 of file sdio_18xx_43xx.h.

#define SDIO_MODE_BLOCK (1UL << 27)

Block mode transfer flag.

When this flag is specified in a transfer the data will be transfered in blocks if not it will be transfered in bytes. See SDIO_Card_DataRead(), SDIO_Card_DataWrite() for more information.

Definition at line 99 of file sdio_18xx_43xx.h.

#define SDIO_MODE_BUFFER (1UL << 26)

Buffer mode transfer flag.

Default mode for SDIO_Card_ReadData() and SDIO_Card_WriteData() is FIFO mode in FIFO mode all the given data will be written to or read from the same register address in the function. This flag will set the transfers to BUFFER mode; in BUFFER mode read first byte will be read from the given source address and the next byte will be read from the next source address (i.e src_addr + 1), and so on, in BUFFER mode write first byte will be written to dest_addr, next byte will be written to dest_addr + 1 and so on.

Definition at line 111 of file sdio_18xx_43xx.h.

#define SDIO_POWER_INIT 1

Definition at line 120 of file sdio_18xx_43xx.h.

#define SDIO_VOLT_3_3 0x00100000UL /* for CMD5 */

Definition at line 90 of file sdio_18xx_43xx.h.

## Enumeration Type Documentation

enum SDIO_EVENT

SDIO Driver events.

Enumerator
SDIO_START_COMMAND |
SDIO_START_DATA | ! SDIO driver is about to start a command transfer
SDIO_WAIT_DELAY | ! SDIO driver is about to start a data transfer
SDIO_WAIT_COMMAND | ! SDIO driver needs to wait for given milli seconds
SDIO_WAIT_DATA | ! SDIO driver is waiting for a command to complete
SDIO_CARD_DETECT | ! SDIO driver is waiting for data transfer to complete
SDIO_CMD_ERR | ! SDIO driver has detected a card
SDIO_CMD_DONE | ! Error in command transfer
SDIO_DATA_ERR | ! Command transfer successful
SDIO_DATA_DONE | ! Data transfer error
SDIO_CARD_INT | ! Data transfer successful

Definition at line 45 of file sdio_18xx_43xx.h.

## Function Documentation

int SDIO_Card_DisableInt | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func
| ) |  |

Disable SDIO interrupt for a given function.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]

Returns
  0 - on success; Non zero on failure

Definition at line 302 of file sdio_18xx_43xx.c.

int SDIO_Card_EnableInt | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func
| ) |  |

Enable SDIO interrupt for a given function.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]

Returns
  0 - on success; Non zero on failure

Definition at line 283 of file sdio_18xx_43xx.c.

uint32_t SDIO_Card_GetBlockSize | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func
| ) |  |

Gets the block size of a given function.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]

Returns
  Block size of the given function

See Also
  SDIO_Card_SetBlockSize()

Note
  If the return value is 0 then bock size is not set using SDIO_Card_SetBlockSize(), or given func is not valid or the card does not support block data transfers.

Definition at line 184 of file sdio_18xx_43xx.c.

int SDIO_Card_Init | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | freq
| ) |  |

Initialize the SDIO card.

Parameters

  pSDMMC | : SDMMC peripheral selected
  freq | : Initial frequency to use during the enumeration

Returns
  0 on Success; > 0 on response error [like CRC error] < 0 on BUS error

Definition at line 326 of file sdio_18xx_43xx.c.

int SDIO_Card_ReadData | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint8_t * | dest_addr,
|  | uint32_t | src_addr,
|  | uint32_t | size,
|  | uint32_t | flags
| ) |  |

Reads stream or block of data from the SDIO card [Using CMD53].

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  dest_addr | : memory where the data to be read into
  src_addr | : Register address from which data to be read (inside func register space)
  size | : Number of Bytes/Blocks to be transfered [Must be in the range 1 to 512]
  flags | : Or-ed value of SDIO_MODE_BLOCK, SDIO_MODE_BUFFER

Returns
  0 on success; Non-Zero on failure

Note
  When SDIO_MODE_BLOCK is set in flags the size is number of blocks, so the number of bytes transferd will be size * "block size" [See SDIO_Card_GetBlockSize() and SDIO_Card_SetBlockSize() for more information]

Definition at line 239 of file sdio_18xx_43xx.c.

int SDIO_Card_SetBlockSize | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint32_t | blkSize
| ) |  |

Sets the block size of a given function.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  blkSize | : Block size to set

Returns
  0 on success; Non-Zero on failure

See Also
  SDIO_Card_GetBlockSize()

Note
  After setting block size using this API, if SDIO_Card_GetBlockSize() returns 0 for a valid function then the card does not support block transfers.

Definition at line 160 of file sdio_18xx_43xx.c.

int SDIO_Card_WriteData | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint32_t | dest_addr,
|  | const uint8_t * | src_addr,
|  | uint32_t | size,
|  | uint32_t | flags
| ) |  |

Writes stream or block of data to the SDIO card [Using CMD53].

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  dest_addr | : Address where the data to be written (inside func register space)
  src_addr | : Buffer from which data to be taken
  size | : Number of Bytes/Blocks to be transfered [Must be in the range 1 to 512]
  flags | : Or-ed value of SDIO_MODE_BLOCK, SDIO_MODE_BUFFER

Returns
  0 on success; Non-Zero on failure

Note
  When SDIO_MODE_BLOCK is set in flags the size is number of blocks, so the number of bytes transferd will be size * "block size" [See SDIO_Card_GetBlockSize() and SDIO_Card_SetBlockSize() for more information]

Definition at line 193 of file sdio_18xx_43xx.c.

void SDIO_Handler | ( | LPC_SDMMC_T * | pSDMMC | ) |

SDIO Event handler [Should be called from SDIO interrupt handler].

Parameters

  pSDMMC | : SDMMC peripheral selected

Returns
  Nothing

Definition at line 479 of file sdio_18xx_43xx.c.

int SDIO_Read_Direct | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint32_t | addr,
|  | uint32_t * | data
| ) |  |

Read an 8-Bit register from SDIO register space.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  addr | : Address of the register to read
  data | : Pointer to memory where the 8-bit data be stored

Returns
  0 on Success; > 0 on response error [like CRC error] < 0 on BUS error

Definition at line 424 of file sdio_18xx_43xx.c.

uint32_t SDIO_Send_Command | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | cmd,
|  | uint32_t | arg
| ) |  |

Sends a command to the SDIO Card [Example CMD52].

Parameters

  pSDMMC | : SDMMC peripheral selected
  cmd | : Command to be sent along with any flags
  arg | : Argument for the command

Returns
  0 on Success; Non-Zero on failure

Definition at line 454 of file sdio_18xx_43xx.c.

void SDIO_Setup_Callback | ( | LPC_SDMMC_T * | pSDMMC,
|  | void(*)(LPC_SDMMC_T *pSDMMC, uint32_t event, void *arg) | wake_evt,
|  | uint32_t(*)(LPC_SDMMC_T *pSDMMC, uint32_t event, void *arg) | wait_evt
| ) |  |

Setup SDIO wait and wakeup callbacks.

Parameters

  pSDMMC | : SDMMC peripheral selected
  wake_evt | : Wakeup event call-back handler
  wait_evt | : Wait event call-back handler

Returns
  Nothing

Note
  wake_evt and wait_evt should always be non-null function pointers This function must be called before calling SDIO_Card_Init() function

Definition at line 445 of file sdio_18xx_43xx.c.

int SDIO_Write_Direct | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint32_t | addr,
|  | uint32_t | data
| ) |  |

Write 8-Bit register from SDIO register space.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  addr | : Address of the register to read
  data | : 8-bit data be written

Returns
  0 on Success; > 0 on response error [like CRC error] < 0 on BUS error

Note
  SDIO_Setup_Callback() function must be called to setup the call backs before calling this API.

Definition at line 381 of file sdio_18xx_43xx.c.

int SDIO_WriteRead_Direct | ( | LPC_SDMMC_T * | pSDMMC,
|  | uint32_t | func,
|  | uint32_t | addr,
|  | uint32_t * | data
| ) |  |

Write 8-Bit register from SDIO register space and read the register back.

Parameters

  pSDMMC | : SDMMC peripheral selected
  func | : function number [0 to 7] [0 = CIA function]
  addr | : Address of the register to read
  data | : Pointer to memory where the 8-bit data be stored

Returns
  0 on Success; > 0 on response error [like CRC error] < 0 on BUS error

Note
  data must have the value to be written stored in it when the function is called

Definition at line 402 of file sdio_18xx_43xx.c.