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 /* Every transaction can be delineated by 3 dma descriptions: SPI control, SPI cmd, SPI data */
31 #define SPI_DMA_DESC_COUNT_PER_TRANS (3U)
32 
33 typedef struct {
36  uint8_t rx_dma_ch;
37  uint8_t tx_dma_ch;
38  uint8_t rx_dmamux_ch;
39  uint8_t tx_dmamux_ch;
40  uint8_t rx_req;
41  uint8_t tx_req;
42  uint8_t data_width;
44 
45 typedef struct {
47  uint32_t cs_pin;
48  uint8_t cmd;
49  uint8_t *rx_buff;
50  uint8_t *tx_buff;
51  uint8_t running_core;
52  uint32_t addr;
53  uint32_t rx_size;
54  uint32_t rx_count;
55  uint32_t tx_size;
56  uint32_t tx_count;
57  uint32_t data_len_in_byte;
58  uint32_t per_trans_max;
59  uint32_t *spi_transctrl;
60  void (*write_cs)(uint32_t cs_pin, uint8_t state);
64 
68 typedef struct {
74  uint8_t data_len;
75  bool data_merge;
77 
78 #if USE_DMA_MGR
79 typedef void (*spi_dma_complete_cb)(uint32_t channel);
80 #endif
81 
82 #ifdef __cplusplus
83 extern "C" {
84 #endif
85 
97 
98 /*
99  * SPI release gpio pin if gpio use for SPI CS function
100  */
108 
109 
118 
129 
137 hpm_stat_t hpm_spi_set_sclk_frequency(SPI_Type *ptr, uint32_t freq);
138 
151 hpm_stat_t hpm_spi_transmit_receive_blocking(SPI_Type *ptr, uint8_t *wbuff, uint8_t *rbuff, uint32_t size, uint32_t timeout);
152 
164 hpm_stat_t hpm_spi_receive_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout);
165 
177 hpm_stat_t hpm_spi_transmit_blocking(SPI_Type *ptr, uint8_t *buff, uint32_t size, uint32_t timeout);
178 
190 
202 
214 
215 #if USE_DMA_MGR
226 hpm_stat_t hpm_spi_dma_install_callback(SPI_Type *ptr,
227  spi_dma_complete_cb tx_complete,
228  spi_dma_complete_cb rx_complete);
229 
241 hpm_stat_t hpm_spi_transmit_receive_nonblocking(SPI_Type *ptr, uint8_t *wbuff, uint8_t *rbuff, uint32_t size);
242 
253 hpm_stat_t hpm_spi_receive_nonblocking(SPI_Type *ptr, uint8_t *buff, uint32_t size);
254 
265 hpm_stat_t hpm_spi_transmit_nonblocking(SPI_Type *ptr, uint8_t *buff, uint32_t size);
266 
267 #endif
268 
269 #ifdef __cplusplus
270 }
271 #endif
272 
273 #endif /* HPM_COMPONENT_SPI_H */
uint32_t hpm_stat_t
Definition: hpm_common.h:123
static void size
Definition: hpm_math.h:6899
spi_mode_selection_t
spi mode selection
Definition: hpm_spi_drv.h:43
spi_sclk_idle_state_t
spi clock polarity
Definition: hpm_spi_drv.h:51
spi_shift_direction_t
Definition: hpm_spi_drv.h:147
spi_sclk_sampling_clk_edges_t
spi clock phase
Definition: hpm_spi_drv.h:59
spi_data_phase_format_t
spi data phase format
Definition: hpm_spi_drv.h:123
@ cs_pin
Definition: hpm_spi_drv.h:261
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:836
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:1019
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:584
hpm_stat_t hpm_spi_initialize(SPI_Type *ptr, spi_initialize_config_t *config)
initialize for spi
Definition: hpm_spi.c:808
void hpm_spi_get_default_init_config(spi_initialize_config_t *config)
spi get default init config
Definition: hpm_spi.c:797
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:935
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:536
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:983
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:1066
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:45
uint32_t rx_count
Definition: hpm_spi.h:54
dma_linked_descriptor_t * dma_linked_descriptor
Definition: hpm_spi.h:62
uint32_t * spi_transctrl
Definition: hpm_spi.h:59
spi_dma_context_t dma_context
Definition: hpm_spi.h:61
uint8_t * rx_buff
Definition: hpm_spi.h:49
SPI_Type * ptr
Definition: hpm_spi.h:46
uint32_t rx_size
Definition: hpm_spi.h:53
uint32_t tx_size
Definition: hpm_spi.h:55
uint8_t running_core
Definition: hpm_spi.h:51
uint32_t data_len_in_byte
Definition: hpm_spi.h:57
uint32_t per_trans_max
Definition: hpm_spi.h:58
uint32_t addr
Definition: hpm_spi.h:52
uint32_t cs_pin
Definition: hpm_spi.h:47
uint32_t tx_count
Definition: hpm_spi.h:56
uint8_t * tx_buff
Definition: hpm_spi.h:50
uint8_t cmd
Definition: hpm_spi.h:48
spi control config structure
Definition: hpm_spi_drv.h:232
Definition: hpm_spi.h:33
DMAMUX_Type * dmamux_ptr
Definition: hpm_spi.h:35
uint8_t tx_dmamux_ch
Definition: hpm_spi.h:39
uint8_t rx_req
Definition: hpm_spi.h:40
uint8_t data_width
Definition: hpm_spi.h:42
DMA_Type * dma_ptr
Definition: hpm_spi.h:34
uint8_t rx_dmamux_ch
Definition: hpm_spi.h:38
uint8_t rx_dma_ch
Definition: hpm_spi.h:36
uint8_t tx_dma_ch
Definition: hpm_spi.h:37
uint8_t tx_req
Definition: hpm_spi.h:41
spi configuration init structure
Definition: hpm_spi.h:68
spi_mode_selection_t mode
Definition: hpm_spi.h:69
spi_sclk_sampling_clk_edges_t clk_phase
Definition: hpm_spi.h:72
spi_shift_direction_t direction
Definition: hpm_spi.h:73
bool data_merge
Definition: hpm_spi.h:75
spi_data_phase_format_t io_mode
Definition: hpm_spi.h:70
uint8_t data_len
Definition: hpm_spi.h:74
spi_sclk_idle_state_t clk_polarity
Definition: hpm_spi.h:71