HPM SDK
HPMicro Software Development Kit
hpm_spi.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_COMPONENT_SPI_H
9 #define HPM_COMPONENT_SPI_H
10 
11 #include "hpm_common.h"
12 #include "hpm_spi_drv.h"
13 #ifdef HPMSOC_HAS_HPMSDK_DMAV2
14 #include "hpm_dmav2_drv.h"
15 #else
16 #include "hpm_dma_drv.h"
17 #endif
18 #include "hpm_dmamux_drv.h"
19 #include "hpm_misc.h"
20 #include "hpm_l1c_drv.h"
21 
22 #ifndef SPI_CS_ACTIVE
23 #define SPI_CS_ACTIVE 0
24 #endif
25 
26 #ifndef USE_DMA_MGR
27 #define USE_DMA_MGR (0U)
28 #endif
29 
30 #if USE_DMA_MGR
31 #include "hpm_dma_mgr.h"
32 #endif
33 /* Every transaction can be delineated by 3 dma descriptions: SPI control, SPI cmd, SPI data */
34 #define SPI_DMA_DESC_COUNT_PER_TRANS (3U)
35 
36 typedef struct {
39  uint8_t rx_dma_ch;
40  uint8_t tx_dma_ch;
41  uint8_t rx_dmamux_ch;
42  uint8_t tx_dmamux_ch;
43  uint8_t rx_req;
44  uint8_t tx_req;
45  uint8_t data_width;
47 
48 typedef struct {
50  uint32_t cs_pin;
51  uint8_t cmd;
52  uint8_t *rx_buff;
53  uint8_t *tx_buff;
54  uint8_t running_core;
55  uint32_t addr;
56  uint32_t rx_size;
57  uint32_t rx_count;
58  uint32_t tx_size;
59  uint32_t tx_count;
60  uint32_t data_len_in_byte;
61  uint32_t per_trans_max;
62  uint32_t *spi_transctrl;
63  void (*write_cs)(uint32_t cs_pin, uint8_t state);
67 
71 typedef struct {
77  uint8_t data_len;
78  bool data_merge;
80 
81 #if USE_DMA_MGR
82 typedef void (*spi_dma_complete_cb)(uint32_t channel);
83 #endif
84 
85 #ifdef __cplusplus
86 extern "C" {
87 #endif
88 
100 
101 /*
102  * SPI release gpio pin if gpio use for SPI CS function
103  */
111 
112 
121 
132 
140 hpm_stat_t hpm_spi_set_sclk_frequency(SPI_Type *ptr, uint32_t freq);
141 
154 hpm_stat_t hpm_spi_transmit_receive_blocking(SPI_Type *ptr, uint8_t *wbuff, uint8_t *rbuff, uint32_t size, uint32_t timeout);
155 
167 hpm_stat_t hpm_spi_receive_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout);
168 
180 hpm_stat_t hpm_spi_transmit_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout);
181 
193 
205 
217 
218 #if USE_DMA_MGR
229 hpm_stat_t hpm_spi_dma_mgr_install_callback(SPI_Type *ptr,
230  spi_dma_complete_cb tx_complete,
231  spi_dma_complete_cb rx_complete);
232 
244 hpm_stat_t hpm_spi_transmit_receive_nonblocking(SPI_Type *ptr, uint8_t *wbuff, uint8_t *rbuff, uint32_t size);
245 
256 hpm_stat_t hpm_spi_receive_nonblocking(SPI_Type *ptr, uint8_t *buff, uint32_t size);
257 
268 hpm_stat_t hpm_spi_transmit_nonblocking(SPI_Type *ptr, uint8_t *buff, uint32_t size);
269 
280 dma_resource_t *hpm_spi_get_tx_dma_resource(SPI_Type *ptr);
281 
291 dma_resource_t *hpm_spi_get_rx_dma_resource(SPI_Type *ptr);
292 
293 #endif
294 
295 #ifdef __cplusplus
296 }
297 #endif
298 
299 #endif /* HPM_COMPONENT_SPI_H */
uint32_t hpm_stat_t
Definition: hpm_common.h:126
static void size
Definition: hpm_math.h:6938
spi_mode_selection_t
spi mode selection
Definition: hpm_spi_drv.h:47
spi_sclk_idle_state_t
spi clock polarity
Definition: hpm_spi_drv.h:55
spi_shift_direction_t
Definition: hpm_spi_drv.h:151
spi_sclk_sampling_clk_edges_t
spi clock phase
Definition: hpm_spi_drv.h:63
spi_data_phase_format_t
spi data phase format
Definition: hpm_spi_drv.h:127
@ cs_pin
Definition: hpm_spi_drv.h:265
struct _dma_resource dma_resource_t
DMA Resource Structure.
hpm_stat_t hpm_spi_set_sclk_frequency(SPI_Type *ptr, uint32_t freq)
set spi sclk frequency for spi master
Definition: hpm_spi.c:833
hpm_stat_t hpm_spi_transmit_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout)
transmit block for spi
Definition: hpm_spi.c:1016
hpm_stat_t hpm_spi_release_gpio_cs(spi_context_t *context)
hpm_spi releases gpio cs pin after SPI transfer completed
Definition: hpm_spi.c:581
hpm_stat_t hpm_spi_initialize(SPI_Type *ptr, spi_initialize_config_t *config)
initialize for spi
Definition: hpm_spi.c:805
void hpm_spi_get_default_init_config(spi_initialize_config_t *config)
spi get default init config
Definition: hpm_spi.c:794
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
Definition: hpm_spi.c:932
hpm_stat_t hpm_spi_setup_dma_transfer(spi_context_t *context, spi_control_config_t *config)
hpm_spi setup dma transfer
Definition: hpm_spi.c:533
hpm_stat_t hpm_spi_receive_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout)
receive block for spi
Definition: hpm_spi.c:980
hpm_stat_t hpm_spi_transmit_receive_setup_dma(SPI_Type *ptr, uint32_t size)
transmit and receive setup dma for spi
Definition: hpm_spi.c:1063
hpm_stat_t hpm_spi_transmit_setup_dma(SPI_Type *ptr, uint32_t size)
transmit setup dma for spi
Definition: hpm_spi.c:1116
hpm_stat_t hpm_spi_receive_setup_dma(SPI_Type *ptr, uint32_t size)
receive setup dma for spi
Definition: hpm_spi.c:1091
Definition: hpm_dmamux_regs.h:12
Definition: hpm_dma_regs.h:12
Definition: hpm_spi_regs.h:12
Linked descriptor.
Definition: hpm_dma_drv.h:92
Definition: hpm_spi.h:48
uint32_t rx_count
Definition: hpm_spi.h:57
dma_linked_descriptor_t * dma_linked_descriptor
Definition: hpm_spi.h:65
uint32_t * spi_transctrl
Definition: hpm_spi.h:62
spi_dma_context_t dma_context
Definition: hpm_spi.h:64
uint8_t * rx_buff
Definition: hpm_spi.h:52
SPI_Type * ptr
Definition: hpm_spi.h:49
uint32_t rx_size
Definition: hpm_spi.h:56
uint32_t tx_size
Definition: hpm_spi.h:58
uint8_t running_core
Definition: hpm_spi.h:54
uint32_t data_len_in_byte
Definition: hpm_spi.h:60
uint32_t per_trans_max
Definition: hpm_spi.h:61
uint32_t addr
Definition: hpm_spi.h:55
uint32_t cs_pin
Definition: hpm_spi.h:50
uint32_t tx_count
Definition: hpm_spi.h:59
uint8_t * tx_buff
Definition: hpm_spi.h:53
uint8_t cmd
Definition: hpm_spi.h:51
spi control config structure
Definition: hpm_spi_drv.h:236
Definition: hpm_spi.h:36
DMAMUX_Type * dmamux_ptr
Definition: hpm_spi.h:38
uint8_t tx_dmamux_ch
Definition: hpm_spi.h:42
uint8_t rx_req
Definition: hpm_spi.h:43
uint8_t data_width
Definition: hpm_spi.h:45
DMA_Type * dma_ptr
Definition: hpm_spi.h:37
uint8_t rx_dmamux_ch
Definition: hpm_spi.h:41
uint8_t rx_dma_ch
Definition: hpm_spi.h:39
uint8_t tx_dma_ch
Definition: hpm_spi.h:40
uint8_t tx_req
Definition: hpm_spi.h:44
spi configuration init structure
Definition: hpm_spi.h:71
spi_mode_selection_t mode
Definition: hpm_spi.h:72
spi_sclk_sampling_clk_edges_t clk_phase
Definition: hpm_spi.h:75
spi_shift_direction_t direction
Definition: hpm_spi.h:76
bool data_merge
Definition: hpm_spi.h:78
spi_data_phase_format_t io_mode
Definition: hpm_spi.h:73
uint8_t data_len
Definition: hpm_spi.h:77
spi_sclk_idle_state_t clk_polarity
Definition: hpm_spi.h:74