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 driver   spi
 
#define sd_mmc_spi_debug(...)
 
#define sd_mmc_spi_drv_deselect_device   ATPASTE2(driver, _deselect_device)
 
#define sd_mmc_spi_drv_device   ATPASTE2(driver, _device)
 
#define sd_mmc_spi_drv_read_packet   ATPASTE2(driver, _read_packet)
 
#define sd_mmc_spi_drv_select_device   ATPASTE2(driver, _select_device)
 
#define sd_mmc_spi_drv_setup_device   ATPASTE2(driver, _setup_device)
 
#define sd_mmc_spi_drv_write_packet   ATPASTE2(driver, _write_packet)
 
#define spi_setup_device   spi_master_setup_device
 

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 uint16_t sd_mmc_spi_block_size
 Size block requested by last mci_adtc_start() More...
 
static struct sd_mmc_spi_drv_device sd_mmc_spi_devices []
 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...
 

#define driver   spi
#define sd_mmc_spi_drv_deselect_device   ATPASTE2(driver, _deselect_device)
#define sd_mmc_spi_drv_device   ATPASTE2(driver, _device)
#define sd_mmc_spi_drv_select_device   ATPASTE2(driver, _select_device)
#define sd_mmc_spi_drv_setup_device   ATPASTE2(driver, _setup_device)
#define spi_setup_device   spi_master_setup_device

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_SPI, sd_mmc_spi_block_size, sd_mmc_spi_crc7(), sd_mmc_spi_debug, sd_mmc_spi_drv_read_packet, sd_mmc_spi_drv_write_packet, 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, 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_SPI, sd_mmc_spi_devices, sd_mmc_spi_drv_deselect_device, sd_mmc_spi_err, and SD_MMC_SPI_NO_ERR.

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.

void sd_mmc_spi_init ( void  )

Initializes the low level driver.

This enable the clock required and the hardware interface.

References SD_MMC_SPI, sd_mmc_spi_err, SD_MMC_SPI_NO_ERR, spi_enable(), spi_is_enabled(), and spi_master_init().

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_SPI, sd_mmc_spi_block_size, sd_mmc_spi_drv_read_packet, 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(), and sd_mmc_spi_transfert_pos.

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_SPI, sd_mmc_spi_devices, sd_mmc_spi_drv_select_device, sd_mmc_spi_drv_setup_device, sd_mmc_spi_err, SD_MMC_SPI_NO_ERR, SPI_MODE_0, 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_SPI, sd_mmc_spi_drv_write_packet, sd_mmc_spi_err, and SD_MMC_SPI_NO_ERR.

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_SPI, sd_mmc_spi_block_size, sd_mmc_spi_drv_read_packet, 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(), and sd_mmc_spi_transfert_pos.

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_SPI, sd_mmc_spi_block_size, sd_mmc_spi_debug, sd_mmc_spi_drv_write_packet, 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, and sd_mmc_spi_wait_busy().

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_SPI, and sd_mmc_spi_drv_read_packet.

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_SPI, and sd_mmc_spi_drv_read_packet.

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 sd_mmc_spi_drv_device sd_mmc_spi_devices[]
static
Initial value:
= {
#define SD_MMC_SPI_CS(slot, unused)
}

Slot array of SPI structures.

Referenced by sd_mmc_spi_deselect_device(), 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().