Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Common SPI interface for SD/MMC stack

implementation

Macros

#define sd_mmc_spi_debug(...)
 

Functions

bool sd_mmc_spi_adtc_start (sdmmc_cmd_def_t cmd, uint32_t arg, uint16_t block_size, uint16_t nb_block, bool access_block)
 Send a adtc command on the selected slot A adtc command is used for read/write access. More...
 
static uint8_t sd_mmc_spi_crc7 (uint8_t *buf, uint8_t size)
 Calculates the CRC7. More...
 
void sd_mmc_spi_deselect_device (uint8_t slot)
 Deselect a slot. More...
 
sd_mmc_spi_errno_t sd_mmc_spi_get_errno (void)
 Return the error code of last function. More...
 
uint32_t sd_mmc_spi_get_response (void)
 Return the 32 bits response of the last command. More...
 
void sd_mmc_spi_init (void)
 Initializes the low level driver. More...
 
bool sd_mmc_spi_read_word (uint32_t *value)
 Read a word on the line. More...
 
void sd_mmc_spi_select_device (uint8_t slot, uint32_t clock, uint8_t bus_width, bool high_speed)
 Select a slot and initialize it. More...
 
void sd_mmc_spi_send_clock (void)
 Send 74 clock cycles on the line of selected slot Note: It is required after card plug and before card install. More...
 
bool sd_mmc_spi_send_cmd (sdmmc_cmd_def_t cmd, uint32_t arg)
 Send a command on the selected slot. More...
 
static bool sd_mmc_spi_start_read_block (void)
 Sends the correct TOKEN on the line to start a read block transfer. More...
 
bool sd_mmc_spi_start_read_blocks (void *dest, uint16_t nb_block)
 Start a read blocks transfer on the line Note: The driver will use the DMA available to speed up the transfer. More...
 
static void sd_mmc_spi_start_write_block (void)
 Sends the correct TOKEN on the line to start a write block transfer. More...
 
bool sd_mmc_spi_start_write_blocks (const void *src, uint16_t nb_block)
 Start a write blocks transfer on the line Note: The driver will use the DMA available to speed up the transfer. More...
 
static bool sd_mmc_spi_stop_multiwrite_block (void)
 Executed the end of a multi blocks write transfer. More...
 
static void sd_mmc_spi_stop_read_block (void)
 Executed the end of a read block transfer. More...
 
static bool sd_mmc_spi_stop_write_block (void)
 Waits the TOKEN which notify the end of write block transfer. More...
 
static bool sd_mmc_spi_wait_busy (void)
 Wait the end of busy on DAT0 line. More...
 
bool sd_mmc_spi_wait_end_of_read_blocks (void)
 Wait the end of transfer initiated by mci_start_read_blocks() More...
 
bool sd_mmc_spi_wait_end_of_write_blocks (void)
 Wait the end of transfer initiated by mci_start_write_blocks() More...
 
bool sd_mmc_spi_write_word (uint32_t value)
 Write a word on the line. More...
 

Variables

static struct spi_module sd_mmc_master
 
static uint16_t sd_mmc_spi_block_size
 Size block requested by last mci_adtc_start() More...
 
static struct spi_slave_inst sd_mmc_spi_devices [SD_MMC_SPI_MEM_CNT]
 Slot array of SPI structures. More...
 
static sd_mmc_spi_errno_t sd_mmc_spi_err
 Internal global error status. More...
 
static uint16_t sd_mmc_spi_nb_block
 Total number of block requested by last mci_adtc_start() More...
 
static uint32_t sd_mmc_spi_response_32
 32 bits response of the last command More...
 
static uint32_t sd_mmc_spi_transfert_pos
 Current position (byte) of the transfer started by mci_adtc_start() More...
 
static struct spi_slave_inst_config slave_configs [SD_MMC_SPI_MEM_CNT]
 
uint8_t ss_pins [SD_MMC_SPI_MEM_CNT] = {SD_MMC_CS}
 

bool sd_mmc_spi_adtc_start ( sdmmc_cmd_def_t  cmd,
uint32_t  arg,
uint16_t  block_size,
uint16_t  nb_block,
bool  access_block 
)

Send a adtc command on the selected slot A adtc command is used for read/write access.

Parameters
cmdCommand definition
argArgument of the command
block_sizeBlock size used for the transfer
nb_blockTotal number of block for this transfer
access_blockif true, the x_read_blocks() and x_write_blocks() functions must be used after this function. If false, the mci_read_word() and mci_write_word() functions must be used after this function.
Returns
true if success, otherwise false

R1 response

References Assert, be32_to_cpu, le32_to_cpu, R1_SPI_COM_CRC, R1_SPI_ERROR, R1_SPI_IDLE, R1_SPI_ILLEGAL_COMMAND, sd_mmc_master, sd_mmc_spi_block_size, sd_mmc_spi_crc7(), sd_mmc_spi_debug, SD_MMC_SPI_ERR, sd_mmc_spi_err, SD_MMC_SPI_ERR_ILLEGAL_COMMAND, SD_MMC_SPI_ERR_RESP_BUSY_TIMEOUT, SD_MMC_SPI_ERR_RESP_CRC, SD_MMC_SPI_ERR_RESP_TIMEOUT, sd_mmc_spi_nb_block, SD_MMC_SPI_NO_ERR, sd_mmc_spi_response_32, sd_mmc_spi_transfert_pos, sd_mmc_spi_wait_busy(), SDMMC_CMD_GET_INDEX, SDMMC_RESP_32, SDMMC_RESP_8, SDMMC_RESP_BUSY, SDMMC_RESP_PRESENT, SPI_CMD_ENCODE, spi_read_buffer_wait(), spi_write_buffer_wait(), and UNUSED.

Referenced by sd_mmc_spi_send_cmd().

static uint8_t sd_mmc_spi_crc7 ( uint8_t *  buf,
uint8_t  size 
)
static

Calculates the CRC7.

Parameters
bufBuffer data to compute
sizeSize of buffer data
Returns
CRC7 computed

Referenced by sd_mmc_spi_adtc_start().

void sd_mmc_spi_deselect_device ( uint8_t  slot)

Deselect a slot.

Parameters
slotSelected slot

References sd_mmc_master, sd_mmc_spi_devices, sd_mmc_spi_err, SD_MMC_SPI_NO_ERR, and spi_select_slave().

sd_mmc_spi_errno_t sd_mmc_spi_get_errno ( void  )

Return the error code of last function.

Returns
error code

References sd_mmc_spi_err.

uint32_t sd_mmc_spi_get_response ( void  )

Return the 32 bits response of the last command.

Returns
32 bits response

References sd_mmc_spi_response_32.

bool sd_mmc_spi_read_word ( uint32_t *  value)

Read a word on the line.

Parameters
valuePointer on a word to fill
Returns
true if success, otherwise false

References Assert, le32_to_cpu, sd_mmc_master, sd_mmc_spi_block_size, sd_mmc_spi_err, sd_mmc_spi_nb_block, SD_MMC_SPI_NO_ERR, sd_mmc_spi_start_read_block(), sd_mmc_spi_stop_read_block(), sd_mmc_spi_transfert_pos, and spi_read_buffer_wait().

void sd_mmc_spi_select_device ( uint8_t  slot,
uint32_t  clock,
uint8_t  bus_width,
bool  high_speed 
)

Select a slot and initialize it.

Parameters
slotSelected slot
clockMaximum clock to use (Hz)
bus_widthBus width to use (1, 4 or 8)
high_speedtrue, to enable high speed mode

References sd_mmc_master, sd_mmc_spi_devices, sd_mmc_spi_err, SD_MMC_SPI_MAX_CLOCK, SD_MMC_SPI_NO_ERR, spi_select_slave(), spi_set_baudrate(), STATUS_ERR_INVALID_ARG, and UNUSED.

void sd_mmc_spi_send_clock ( void  )

Send 74 clock cycles on the line of selected slot Note: It is required after card plug and before card install.

Send 80 cycles

References sd_mmc_master, sd_mmc_spi_err, SD_MMC_SPI_NO_ERR, and spi_write_buffer_wait().

bool sd_mmc_spi_send_cmd ( sdmmc_cmd_def_t  cmd,
uint32_t  arg 
)

Send a command on the selected slot.

Parameters
cmdCommand definition
argArgument of the command
Returns
true if success, otherwise false

References sd_mmc_spi_adtc_start().

bool sd_mmc_spi_start_read_blocks ( void *  dest,
uint16_t  nb_block 
)

Start a read blocks transfer on the line Note: The driver will use the DMA available to speed up the transfer.

Parameters
destPointer on the buffer to fill
nb_blockNumber of block to transfer
Returns
true if started, otherwise false

References Assert, sd_mmc_master, sd_mmc_spi_block_size, sd_mmc_spi_err, sd_mmc_spi_nb_block, SD_MMC_SPI_NO_ERR, sd_mmc_spi_start_read_block(), sd_mmc_spi_stop_read_block(), sd_mmc_spi_transfert_pos, and spi_read_buffer_wait().

static void sd_mmc_spi_start_write_block ( void  )
static
bool sd_mmc_spi_start_write_blocks ( const void *  src,
uint16_t  nb_block 
)

Start a write blocks transfer on the line Note: The driver will use the DMA available to speed up the transfer.

Parameters
srcPointer on the buffer to send
nb_blockNumber of block to transfer
Returns
true if started, otherwise false

References Assert, sd_mmc_master, sd_mmc_spi_block_size, sd_mmc_spi_debug, sd_mmc_spi_err, SD_MMC_SPI_ERR_WRITE_TIMEOUT, sd_mmc_spi_nb_block, SD_MMC_SPI_NO_ERR, sd_mmc_spi_start_write_block(), sd_mmc_spi_stop_write_block(), sd_mmc_spi_transfert_pos, sd_mmc_spi_wait_busy(), and spi_write_buffer_wait().

static bool sd_mmc_spi_stop_multiwrite_block ( void  )
static
static void sd_mmc_spi_stop_read_block ( void  )
static

Executed the end of a read block transfer.

References sd_mmc_master, and spi_read_buffer_wait().

Referenced by sd_mmc_spi_read_word(), and sd_mmc_spi_start_read_blocks().

static bool sd_mmc_spi_stop_write_block ( void  )
static
static bool sd_mmc_spi_wait_busy ( void  )
static

Wait the end of busy on DAT0 line.

Returns
true if success, otherwise false

References sd_mmc_master, and spi_read_buffer_wait().

Referenced by sd_mmc_spi_adtc_start(), sd_mmc_spi_start_write_blocks(), sd_mmc_spi_stop_multiwrite_block(), sd_mmc_spi_wait_end_of_write_blocks(), and sd_mmc_spi_write_word().

bool sd_mmc_spi_wait_end_of_read_blocks ( void  )

Wait the end of transfer initiated by mci_start_read_blocks()

Returns
true if success, otherwise false
bool sd_mmc_spi_wait_end_of_write_blocks ( void  )

Wait the end of transfer initiated by mci_start_write_blocks()

Returns
true if success, otherwise false

References sd_mmc_spi_debug, sd_mmc_spi_err, SD_MMC_SPI_ERR_WRITE_TIMEOUT, sd_mmc_spi_stop_multiwrite_block(), and sd_mmc_spi_wait_busy().

struct spi_slave_inst sd_mmc_spi_devices[SD_MMC_SPI_MEM_CNT]
static

Slot array of SPI structures.

Referenced by sd_mmc_spi_deselect_device(), sd_mmc_spi_init(), and sd_mmc_spi_select_device().

uint32_t sd_mmc_spi_response_32
static

32 bits response of the last command

Referenced by sd_mmc_spi_adtc_start(), and sd_mmc_spi_get_response().

struct spi_slave_inst_config slave_configs[SD_MMC_SPI_MEM_CNT]
static

Referenced by sd_mmc_spi_init().

uint8_t ss_pins[SD_MMC_SPI_MEM_CNT] = {SD_MMC_CS}

Referenced by sd_mmc_spi_init().