HPM SDK
HPMicro Software Development Kit
hpm_spi.c File Reference
#include "hpm_spi.h"
#include "hpm_clock_drv.h"
#include <stdlib.h>

Data Structures

struct  hpm_spi_cfg_t
 

Macros

#define SPI_COMP_FREQUENCY_THRESHOLD   (20000000U)
 

Functions

static hpm_stat_t hpm_spi_tx_trigger_dma (DMA_Type *dma_ptr, uint8_t ch_num, SPI_Type *spi_ptr, uint32_t src, uint8_t data_width, uint32_t size)
 
static hpm_stat_t hpm_spi_rx_trigger_dma (DMA_Type *dma_ptr, uint8_t ch_num, SPI_Type *spi_ptr, uint32_t dst, uint8_t data_width, uint32_t size)
 
void hpm_spi_prepare_dma_tx_descriptors (spi_context_t *context, spi_control_config_t *config, uint32_t trans_count, uint32_t *spi_transctrl, dma_linked_descriptor_t *tx_dma_descriptors)
 
void hpm_prepare_dma_rx_descriptors (spi_context_t *context, spi_control_config_t *config, uint32_t trans_count, uint32_t *spi_transctrl, dma_linked_descriptor_t *rx_dma_descriptors)
 
static uint32_t hpm_spi_get_trans_count (spi_context_t *context, spi_control_config_t *config)
 
static hpm_stat_t spi_setup_trans_with_dma_chain (spi_context_t *context, spi_control_config_t *config)
 
static hpm_stat_t spi_setup_trans_with_dma (spi_context_t *context, spi_control_config_t *config)
 
hpm_stat_t hpm_spi_setup_dma_transfer (spi_context_t *context, spi_control_config_t *config)
 hpm_spi setup dma transfer More...
 
hpm_stat_t hpm_spi_release_gpio_cs (spi_context_t *context)
 hpm_spi releases gpio cs pin after SPI transfer completed More...
 
static hpm_stat_t wait_spi_slave_active (SPI_Type *ptr, bool active_status, uint32_t timeout)
 
static hpm_spi_cfg_thpm_spi_get_cfg_obj (SPI_Type *ptr)
 
static hpm_stat_t hpm_spi_transfer_init (SPI_Type *ptr, spi_trans_mode_t mode, uint32_t size)
 
static hpm_stat_t write_read_data_together (SPI_Type *ptr, uint8_t data_len_in_bytes, uint8_t *wbuff, uint32_t wsize, uint8_t *rbuff, uint32_t rsize, uint32_t timeout)
 
static hpm_stat_t read_data_single (SPI_Type *ptr, uint8_t data_len_in_bytes, uint8_t *rbuff, uint32_t rsize, uint32_t timeout)
 
static hpm_stat_t write_data_single (SPI_Type *ptr, uint8_t data_len_in_bytes, uint8_t *wbuff, uint32_t wsize, uint32_t timeout)
 
void hpm_spi_get_default_init_config (spi_initialize_config_t *config)
 spi get default init config More...
 
hpm_stat_t hpm_spi_initialize (SPI_Type *ptr, spi_initialize_config_t *config)
 initialize for spi More...
 
hpm_stat_t hpm_spi_set_sclk_frequency (SPI_Type *ptr, uint32_t freq)
 set spi sclk frequency for spi master More...
 
hpm_stat_t hpm_spi_transmit_receive_blocking (SPI_Type *ptr, uint8_t *wbuff, uint8_t *rbuff, uint32_t size, uint32_t timeout)
 transmit and receive block for spi More...
 
hpm_stat_t hpm_spi_receive_blocking (SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout)
 receive block for spi More...
 
hpm_stat_t hpm_spi_transmit_blocking (SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout)
 transmit block for spi More...
 
hpm_stat_t hpm_spi_transmit_receive_setup_dma (SPI_Type *ptr, uint32_t size)
 transmit and receive setup dma for spi More...
 
hpm_stat_t hpm_spi_receive_setup_dma (SPI_Type *ptr, uint32_t size)
 receive setup dma for spi More...
 
hpm_stat_t hpm_spi_transmit_setup_dma (SPI_Type *ptr, uint32_t size)
 transmit setup dma for spi More...
 

Variables

static hpm_spi_cfg_t spi_dma_cfg_table []
 

Macro Definition Documentation

◆ SPI_COMP_FREQUENCY_THRESHOLD

#define SPI_COMP_FREQUENCY_THRESHOLD   (20000000U)

Function Documentation

◆ hpm_prepare_dma_rx_descriptors()

void hpm_prepare_dma_rx_descriptors ( spi_context_t context,
spi_control_config_t config,
uint32_t  trans_count,
uint32_t *  spi_transctrl,
dma_linked_descriptor_t rx_dma_descriptors 
)

◆ hpm_spi_get_cfg_obj()

static hpm_spi_cfg_t* hpm_spi_get_cfg_obj ( SPI_Type ptr)
static

◆ hpm_spi_get_default_init_config()

void hpm_spi_get_default_init_config ( spi_initialize_config_t config)

spi get default init config

Note
it's no command/address/token phase, only data phase.
Parameters
[out]configspi_init_config_t

◆ hpm_spi_get_trans_count()

static uint32_t hpm_spi_get_trans_count ( spi_context_t context,
spi_control_config_t config 
)
static

◆ hpm_spi_initialize()

hpm_stat_t hpm_spi_initialize ( SPI_Type ptr,
spi_initialize_config_t config 
)

initialize for spi

Note
it's no command/address/token phase, only data phase.
Parameters
[in]ptrSPI base address
[in]configspi_init_config_t struct
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_prepare_dma_tx_descriptors()

void hpm_spi_prepare_dma_tx_descriptors ( spi_context_t context,
spi_control_config_t config,
uint32_t  trans_count,
uint32_t *  spi_transctrl,
dma_linked_descriptor_t tx_dma_descriptors 
)

◆ hpm_spi_receive_blocking()

hpm_stat_t hpm_spi_receive_blocking ( SPI_Type ptr,
uint8_t *  buff,
uint32_t  size,
uint32_t  timeout 
)

receive block for spi

Note
it's no command/address/token phase, only data phase.
Parameters
[in]ptrSPI base address
[out]buffspi receive data buff address
[in]sizespi sent data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
[in]timeoutwait time. unit is millisecond
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_receive_setup_dma()

hpm_stat_t hpm_spi_receive_setup_dma ( SPI_Type ptr,
uint32_t  size 
)

receive setup dma for spi

Note
it's no command/address/token phase, only data phase. main configuration spi dma related, call this API after configuring DMA best
Parameters
[in]ptrSPI base address
[in]sizespi receive data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_release_gpio_cs()

hpm_stat_t hpm_spi_release_gpio_cs ( spi_context_t context)

hpm_spi releases gpio cs pin after SPI transfer completed

Parameters
[in]contextA pointer to the struct of "spi_context_t"
Return values
status_successif SPI releases gpio cs pin successfully.

◆ hpm_spi_rx_trigger_dma()

static hpm_stat_t hpm_spi_rx_trigger_dma ( DMA_Type dma_ptr,
uint8_t  ch_num,
SPI_Type spi_ptr,
uint32_t  dst,
uint8_t  data_width,
uint32_t  size 
)
static

◆ hpm_spi_set_sclk_frequency()

hpm_stat_t hpm_spi_set_sclk_frequency ( SPI_Type ptr,
uint32_t  freq 
)

set spi sclk frequency for spi master

Parameters
[in]ptrSPI base address
[in]freqspi sclk frequency
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_setup_dma_transfer()

hpm_stat_t hpm_spi_setup_dma_transfer ( spi_context_t context,
spi_control_config_t config 
)

hpm_spi setup dma transfer

Note
if the transferred data count more than SPI_SOC_TRANSFER_COUNT_MAX, this API will using DMA chain descriptors to link SPI transmission.
Parameters
[in]contextA pointer to the struct of "spi_context_t"
[in]configA pointer to the struct of "spi_control_config_t"
Return values
status_successif SPI transfers data successfully.

◆ hpm_spi_transfer_init()

static hpm_stat_t hpm_spi_transfer_init ( SPI_Type ptr,
spi_trans_mode_t  mode,
uint32_t  size 
)
static

◆ hpm_spi_transmit_blocking()

hpm_stat_t hpm_spi_transmit_blocking ( SPI_Type ptr,
uint8_t *  buff,
uint32_t  size,
uint32_t  timeout 
)

transmit block for spi

Note
it's no command/address/token phase, only data phase.
Parameters
[in]ptrSPI base address
[in]buffspi sent data buff address
[in]sizespi sent data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
[in]timeoutwait time. unit is millisecond
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_transmit_receive_blocking()

hpm_stat_t hpm_spi_transmit_receive_blocking ( SPI_Type ptr,
uint8_t *  wbuff,
uint8_t *  rbuff,
uint32_t  size,
uint32_t  timeout 
)

transmit and receive block for spi

Note
it's no command/address/token phase, only data phase.
Parameters
[in]ptrSPI base address
[in]wbuffspi sent data buff address
[out]rbuffspi receive data buff address
[in]sizespi sent data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
[in]timeoutwait time. unit is millisecond
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_transmit_receive_setup_dma()

hpm_stat_t hpm_spi_transmit_receive_setup_dma ( SPI_Type ptr,
uint32_t  size 
)

transmit and receive setup dma for spi

Note
it's no command/address/token phase, only data phase. main configuration spi dma related, call this API after configuring DMA best
Parameters
[in]ptrSPI base address
[in]sizespi sent and receive data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_transmit_setup_dma()

hpm_stat_t hpm_spi_transmit_setup_dma ( SPI_Type ptr,
uint32_t  size 
)

transmit setup dma for spi

Note
it's no command/address/token phase, only data phase. main configuration spi dma related, call this API after configuring DMA best
Parameters
[in]ptrSPI base address
[in]sizespi transmit data count(word unit), not greater than SPI_SOC_TRANSFER_COUNT_MAX
Return values
hpm_stat_tstatus_success if spi in busy status

◆ hpm_spi_tx_trigger_dma()

static hpm_stat_t hpm_spi_tx_trigger_dma ( DMA_Type dma_ptr,
uint8_t  ch_num,
SPI_Type spi_ptr,
uint32_t  src,
uint8_t  data_width,
uint32_t  size 
)
static

◆ read_data_single()

static hpm_stat_t read_data_single ( SPI_Type ptr,
uint8_t  data_len_in_bytes,
uint8_t *  rbuff,
uint32_t  rsize,
uint32_t  timeout 
)
static

◆ spi_setup_trans_with_dma()

static hpm_stat_t spi_setup_trans_with_dma ( spi_context_t context,
spi_control_config_t config 
)
static

◆ spi_setup_trans_with_dma_chain()

static hpm_stat_t spi_setup_trans_with_dma_chain ( spi_context_t context,
spi_control_config_t config 
)
static

spi with dma chain workflow

  1. call spi_setup_dma_transfer to config SPI for first transmission
  2. execute data transmission phase in dma chain descriptor
  3. execute setting SPI CTRL register phase in dma chain descriptor
  4. execute writing SPI CMD register phase in dma chain descriptor
  5. Repeat steps 2-4 until finish the transmission

◆ wait_spi_slave_active()

static hpm_stat_t wait_spi_slave_active ( SPI_Type ptr,
bool  active_status,
uint32_t  timeout 
)
static

◆ write_data_single()

static hpm_stat_t write_data_single ( SPI_Type ptr,
uint8_t  data_len_in_bytes,
uint8_t *  wbuff,
uint32_t  wsize,
uint32_t  timeout 
)
static

◆ write_read_data_together()

static hpm_stat_t write_read_data_together ( SPI_Type ptr,
uint8_t  data_len_in_bytes,
uint8_t *  wbuff,
uint32_t  wsize,
uint8_t *  rbuff,
uint32_t  rsize,
uint32_t  timeout 
)
static

Variable Documentation

◆ spi_dma_cfg_table

hpm_spi_cfg_t spi_dma_cfg_table[]
static
Initial value:
= {
}