xref: /nrf52832-nimble/nordic/nrfx/drivers/include/nrfx_spim.h (revision 150812a83cab50279bd772ef6db1bfaf255f2c5b)
1*150812a8SEvalZero /*
2*150812a8SEvalZero  * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA
3*150812a8SEvalZero  * All rights reserved.
4*150812a8SEvalZero  *
5*150812a8SEvalZero  * Redistribution and use in source and binary forms, with or without
6*150812a8SEvalZero  * modification, are permitted provided that the following conditions are met:
7*150812a8SEvalZero  *
8*150812a8SEvalZero  * 1. Redistributions of source code must retain the above copyright notice, this
9*150812a8SEvalZero  *    list of conditions and the following disclaimer.
10*150812a8SEvalZero  *
11*150812a8SEvalZero  * 2. Redistributions in binary form must reproduce the above copyright
12*150812a8SEvalZero  *    notice, this list of conditions and the following disclaimer in the
13*150812a8SEvalZero  *    documentation and/or other materials provided with the distribution.
14*150812a8SEvalZero  *
15*150812a8SEvalZero  * 3. Neither the name of the copyright holder nor the names of its
16*150812a8SEvalZero  *    contributors may be used to endorse or promote products derived from this
17*150812a8SEvalZero  *    software without specific prior written permission.
18*150812a8SEvalZero  *
19*150812a8SEvalZero  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*150812a8SEvalZero  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*150812a8SEvalZero  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*150812a8SEvalZero  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23*150812a8SEvalZero  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*150812a8SEvalZero  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*150812a8SEvalZero  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*150812a8SEvalZero  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*150812a8SEvalZero  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*150812a8SEvalZero  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*150812a8SEvalZero  * POSSIBILITY OF SUCH DAMAGE.
30*150812a8SEvalZero  */
31*150812a8SEvalZero 
32*150812a8SEvalZero #ifndef NRFX_SPIM_H__
33*150812a8SEvalZero #define NRFX_SPIM_H__
34*150812a8SEvalZero 
35*150812a8SEvalZero #include <nrfx.h>
36*150812a8SEvalZero #include <hal/nrf_spim.h>
37*150812a8SEvalZero 
38*150812a8SEvalZero #ifdef __cplusplus
39*150812a8SEvalZero extern "C" {
40*150812a8SEvalZero #endif
41*150812a8SEvalZero 
42*150812a8SEvalZero /**
43*150812a8SEvalZero  * @defgroup nrfx_spim SPIM driver
44*150812a8SEvalZero  * @{
45*150812a8SEvalZero  * @ingroup nrf_spim
46*150812a8SEvalZero  * @brief   SPIM peripheral driver.
47*150812a8SEvalZero  */
48*150812a8SEvalZero 
49*150812a8SEvalZero /**
50*150812a8SEvalZero  * @brief SPIM master driver instance data structure.
51*150812a8SEvalZero  */
52*150812a8SEvalZero typedef struct
53*150812a8SEvalZero {
54*150812a8SEvalZero     NRF_SPIM_Type * p_reg;        ///< Pointer to a structure with SPIM registers.
55*150812a8SEvalZero     uint8_t         drv_inst_idx; ///< Driver instance index.
56*150812a8SEvalZero } nrfx_spim_t;
57*150812a8SEvalZero 
58*150812a8SEvalZero enum {
59*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM0_ENABLED)
60*150812a8SEvalZero     NRFX_SPIM0_INST_IDX,
61*150812a8SEvalZero #endif
62*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM1_ENABLED)
63*150812a8SEvalZero     NRFX_SPIM1_INST_IDX,
64*150812a8SEvalZero #endif
65*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM2_ENABLED)
66*150812a8SEvalZero     NRFX_SPIM2_INST_IDX,
67*150812a8SEvalZero #endif
68*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM3_ENABLED)
69*150812a8SEvalZero     NRFX_SPIM3_INST_IDX,
70*150812a8SEvalZero #endif
71*150812a8SEvalZero     NRFX_SPIM_ENABLED_COUNT
72*150812a8SEvalZero };
73*150812a8SEvalZero 
74*150812a8SEvalZero /**
75*150812a8SEvalZero  * @brief Macro for creating an SPIM master driver instance.
76*150812a8SEvalZero  */
77*150812a8SEvalZero #define NRFX_SPIM_INSTANCE(id)                               \
78*150812a8SEvalZero {                                                            \
79*150812a8SEvalZero     .p_reg        = NRFX_CONCAT_2(NRF_SPIM, id),             \
80*150812a8SEvalZero     .drv_inst_idx = NRFX_CONCAT_3(NRFX_SPIM, id, _INST_IDX), \
81*150812a8SEvalZero }
82*150812a8SEvalZero 
83*150812a8SEvalZero /**
84*150812a8SEvalZero  * @brief This value can be provided instead of a pin number for signals MOSI,
85*150812a8SEvalZero  *        MISO, and Slave Select to specify that the given signal is not used and
86*150812a8SEvalZero  *        therefore does not need to be connected to a pin.
87*150812a8SEvalZero  */
88*150812a8SEvalZero #define NRFX_SPIM_PIN_NOT_USED  0xFF
89*150812a8SEvalZero 
90*150812a8SEvalZero /**
91*150812a8SEvalZero  * @brief SPIM master driver instance configuration structure.
92*150812a8SEvalZero  */
93*150812a8SEvalZero typedef struct
94*150812a8SEvalZero {
95*150812a8SEvalZero     uint8_t sck_pin;      ///< SCK pin number.
96*150812a8SEvalZero     uint8_t mosi_pin;     ///< MOSI pin number (optional).
97*150812a8SEvalZero                           /**< Set to @ref NRFX_SPIM_PIN_NOT_USED
98*150812a8SEvalZero                            *   if this signal is not needed. */
99*150812a8SEvalZero     uint8_t miso_pin;     ///< MISO pin number (optional).
100*150812a8SEvalZero                           /**< Set to @ref NRFX_SPIM_PIN_NOT_USED
101*150812a8SEvalZero                            *   if this signal is not needed. */
102*150812a8SEvalZero     uint8_t ss_pin;       ///< Slave Select pin number (optional).
103*150812a8SEvalZero                           /**< Set to @ref NRFX_SPIM_PIN_NOT_USED
104*150812a8SEvalZero                            *   if this signal is not needed. */
105*150812a8SEvalZero     bool ss_active_high;  ///< Polarity of the Slave Select pin during transmission.
106*150812a8SEvalZero     uint8_t irq_priority; ///< Interrupt priority.
107*150812a8SEvalZero     uint8_t orc;          ///< Over-run character.
108*150812a8SEvalZero                           /**< This character is used when all bytes from the TX buffer are sent,
109*150812a8SEvalZero                                but the transfer continues due to RX. */
110*150812a8SEvalZero     nrf_spim_frequency_t frequency; ///< SPI frequency.
111*150812a8SEvalZero     nrf_spim_mode_t      mode;      ///< SPI mode.
112*150812a8SEvalZero     nrf_spim_bit_order_t bit_order; ///< SPI bit order.
113*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__)
114*150812a8SEvalZero     uint8_t              dcx_pin;     ///< D/CX pin number (optional).
115*150812a8SEvalZero     uint8_t              rx_delay;    ///< Sample delay for input serial data on MISO.
116*150812a8SEvalZero                                       /**< The value specifies the delay, in number of 64 MHz clock cycles
117*150812a8SEvalZero                                        *   (15.625 ns), from the the sampling edge of SCK (leading edge for
118*150812a8SEvalZero                                        *   CONFIG.CPHA = 0, trailing edge for CONFIG.CPHA = 1) until
119*150812a8SEvalZero                                        *   the input serial data is sampled.*/
120*150812a8SEvalZero     bool                 use_hw_ss;   ///< Indication to use software or hardware controlled Slave Select pin.
121*150812a8SEvalZero     uint8_t              ss_duration; ///< Slave Select duration before and after transmission.
122*150812a8SEvalZero                                       /**< Minimum duration between the edge of CSN and the edge of SCK and minimum
123*150812a8SEvalZero                                        *   duration of CSN must stay inactive between transactions.
124*150812a8SEvalZero                                        *   The value is specified in number of 64 MHz clock cycles (15.625 ns).
125*150812a8SEvalZero                                        *   Supported only for hardware controlled Slave Select.*/
126*150812a8SEvalZero #endif
127*150812a8SEvalZero } nrfx_spim_config_t;
128*150812a8SEvalZero 
129*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__)
130*150812a8SEvalZero /**
131*150812a8SEvalZero  * @brief SPIM master instance extended default configuration.
132*150812a8SEvalZero  */
133*150812a8SEvalZero     #define NRFX_SPIM_DEFAULT_EXTENDED_CONFIG   \
134*150812a8SEvalZero         .dcx_pin      = NRFX_SPIM_PIN_NOT_USED, \
135*150812a8SEvalZero         .rx_delay     = 0x02,                   \
136*150812a8SEvalZero         .ss_duration  = 0x02,                   \
137*150812a8SEvalZero         .use_hw_ss    = false,
138*150812a8SEvalZero #else
139*150812a8SEvalZero     #define NRFX_SPIM_DEFAULT_EXTENDED_CONFIG
140*150812a8SEvalZero #endif
141*150812a8SEvalZero 
142*150812a8SEvalZero /**
143*150812a8SEvalZero  * @brief SPIM master instance default configuration.
144*150812a8SEvalZero  */
145*150812a8SEvalZero #define NRFX_SPIM_DEFAULT_CONFIG                             \
146*150812a8SEvalZero {                                                            \
147*150812a8SEvalZero     .sck_pin        = NRFX_SPIM_PIN_NOT_USED,                \
148*150812a8SEvalZero     .mosi_pin       = NRFX_SPIM_PIN_NOT_USED,                \
149*150812a8SEvalZero     .miso_pin       = NRFX_SPIM_PIN_NOT_USED,                \
150*150812a8SEvalZero     .ss_pin         = NRFX_SPIM_PIN_NOT_USED,                \
151*150812a8SEvalZero     .ss_active_high = false,                                 \
152*150812a8SEvalZero     .irq_priority   = NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY, \
153*150812a8SEvalZero     .orc            = 0xFF,                                  \
154*150812a8SEvalZero     .frequency      = NRF_SPIM_FREQ_4M,                      \
155*150812a8SEvalZero     .mode           = NRF_SPIM_MODE_0,                       \
156*150812a8SEvalZero     .bit_order      = NRF_SPIM_BIT_ORDER_MSB_FIRST,          \
157*150812a8SEvalZero     NRFX_SPIM_DEFAULT_EXTENDED_CONFIG                        \
158*150812a8SEvalZero }
159*150812a8SEvalZero 
160*150812a8SEvalZero #define NRFX_SPIM_FLAG_TX_POSTINC          (1UL << 0) /**< TX buffer address incremented after transfer. */
161*150812a8SEvalZero #define NRFX_SPIM_FLAG_RX_POSTINC          (1UL << 1) /**< RX buffer address incremented after transfer. */
162*150812a8SEvalZero #define NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */
163*150812a8SEvalZero #define NRFX_SPIM_FLAG_HOLD_XFER           (1UL << 3) /**< Set up the transfer but do not start it. */
164*150812a8SEvalZero #define NRFX_SPIM_FLAG_REPEATED_XFER       (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */
165*150812a8SEvalZero 
166*150812a8SEvalZero /**
167*150812a8SEvalZero  * @brief Single transfer descriptor structure.
168*150812a8SEvalZero  */
169*150812a8SEvalZero typedef struct
170*150812a8SEvalZero {
171*150812a8SEvalZero     uint8_t const * p_tx_buffer; ///< Pointer to TX buffer.
172*150812a8SEvalZero     size_t          tx_length;   ///< TX buffer length.
173*150812a8SEvalZero     uint8_t       * p_rx_buffer; ///< Pointer to RX buffer.
174*150812a8SEvalZero     size_t          rx_length;   ///< RX buffer length.
175*150812a8SEvalZero } nrfx_spim_xfer_desc_t;
176*150812a8SEvalZero 
177*150812a8SEvalZero /**
178*150812a8SEvalZero  * @brief Macro for setting up single transfer descriptor.
179*150812a8SEvalZero  *
180*150812a8SEvalZero  * This macro is for internal use only.
181*150812a8SEvalZero  */
182*150812a8SEvalZero #define NRFX_SPIM_SINGLE_XFER(p_tx, tx_len, p_rx, rx_len)    \
183*150812a8SEvalZero     {                                                        \
184*150812a8SEvalZero     .p_tx_buffer = (uint8_t const *)(p_tx),                  \
185*150812a8SEvalZero     .tx_length = (tx_len),                                   \
186*150812a8SEvalZero     .p_rx_buffer = (p_rx),                                   \
187*150812a8SEvalZero     .rx_length = (rx_len),                                   \
188*150812a8SEvalZero     }
189*150812a8SEvalZero 
190*150812a8SEvalZero /**
191*150812a8SEvalZero  * @brief Macro for setting duplex TX RX transfer.
192*150812a8SEvalZero  */
193*150812a8SEvalZero #define NRFX_SPIM_XFER_TRX(p_tx_buf, tx_length, p_rx_buf, rx_length)                    \
194*150812a8SEvalZero         NRFX_SPIM_SINGLE_XFER(p_tx_buf, tx_length, p_rx_buf, rx_length)
195*150812a8SEvalZero 
196*150812a8SEvalZero /**
197*150812a8SEvalZero  * @brief Macro for setting TX transfer.
198*150812a8SEvalZero  */
199*150812a8SEvalZero #define NRFX_SPIM_XFER_TX(p_buf, length) \
200*150812a8SEvalZero         NRFX_SPIM_SINGLE_XFER(p_buf, length, NULL, 0)
201*150812a8SEvalZero 
202*150812a8SEvalZero /**
203*150812a8SEvalZero  * @brief Macro for setting RX transfer.
204*150812a8SEvalZero  */
205*150812a8SEvalZero #define NRFX_SPIM_XFER_RX(p_buf, length) \
206*150812a8SEvalZero         NRFX_SPIM_SINGLE_XFER(NULL, 0, p_buf, length)
207*150812a8SEvalZero 
208*150812a8SEvalZero /**
209*150812a8SEvalZero  * @brief SPIM master driver event types, passed to the handler routine provided
210*150812a8SEvalZero  *        during initialization.
211*150812a8SEvalZero  */
212*150812a8SEvalZero typedef enum
213*150812a8SEvalZero {
214*150812a8SEvalZero     NRFX_SPIM_EVENT_DONE, ///< Transfer done.
215*150812a8SEvalZero } nrfx_spim_evt_type_t;
216*150812a8SEvalZero 
217*150812a8SEvalZero typedef struct
218*150812a8SEvalZero {
219*150812a8SEvalZero     nrfx_spim_evt_type_t  type;      ///< Event type.
220*150812a8SEvalZero     nrfx_spim_xfer_desc_t xfer_desc; ///< Transfer details.
221*150812a8SEvalZero } nrfx_spim_evt_t;
222*150812a8SEvalZero 
223*150812a8SEvalZero /**
224*150812a8SEvalZero  * @brief SPIM master driver event handler type.
225*150812a8SEvalZero  */
226*150812a8SEvalZero typedef void (* nrfx_spim_evt_handler_t)(nrfx_spim_evt_t const * p_event,
227*150812a8SEvalZero                                          void *                  p_context);
228*150812a8SEvalZero 
229*150812a8SEvalZero /**
230*150812a8SEvalZero  * @brief Function for initializing the SPI master driver instance.
231*150812a8SEvalZero  *
232*150812a8SEvalZero  * This function configures and enables the specified peripheral.
233*150812a8SEvalZero  *
234*150812a8SEvalZero  * @param[in] p_instance Pointer to the driver instance structure.
235*150812a8SEvalZero  * @param[in] p_config   Pointer to the structure with initial configuration.
236*150812a8SEvalZero  *
237*150812a8SEvalZero  * @param     handler    Event handler provided by the user. If NULL, transfers
238*150812a8SEvalZero  *                       will be performed in blocking mode.
239*150812a8SEvalZero  * @param     p_context  Context passed to event handler.
240*150812a8SEvalZero  *
241*150812a8SEvalZero  * @retval NRFX_SUCCESS             If initialization was successful.
242*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_STATE If the driver was already initialized.
243*150812a8SEvalZero  * @retval NRFX_ERROR_BUSY          If some other peripheral with the same
244*150812a8SEvalZero  *                                  instance ID is already in use. This is
245*150812a8SEvalZero  *                                  possible only if @ref nrfx_prs module
246*150812a8SEvalZero  *                                  is enabled.
247*150812a8SEvalZero  * @retval NRFX_ERROR_NOT_SUPPORTED If requested configuration is not supported
248*150812a8SEvalZero  *                                  by the SPIM instance.
249*150812a8SEvalZero  */
250*150812a8SEvalZero nrfx_err_t nrfx_spim_init(nrfx_spim_t const * const  p_instance,
251*150812a8SEvalZero                           nrfx_spim_config_t const * p_config,
252*150812a8SEvalZero                           nrfx_spim_evt_handler_t    handler,
253*150812a8SEvalZero                           void *                     p_context);
254*150812a8SEvalZero 
255*150812a8SEvalZero /**
256*150812a8SEvalZero  * @brief Function for uninitializing the SPI master driver instance.
257*150812a8SEvalZero  *
258*150812a8SEvalZero  * @param[in] p_instance Pointer to the driver instance structure.
259*150812a8SEvalZero  */
260*150812a8SEvalZero void       nrfx_spim_uninit(nrfx_spim_t const * const p_instance);
261*150812a8SEvalZero 
262*150812a8SEvalZero /**
263*150812a8SEvalZero  * @brief Function for starting the SPI data transfer.
264*150812a8SEvalZero  *
265*150812a8SEvalZero  * Additional options are provided using the @c flags parameter:
266*150812a8SEvalZero  *
267*150812a8SEvalZero  * - @ref NRFX_SPIM_FLAG_TX_POSTINC and @ref NRFX_SPIM_FLAG_RX_POSTINC<span></span>:
268*150812a8SEvalZero  *   Post-incrementation of buffer addresses. Supported only by SPIM.
269*150812a8SEvalZero  * - @ref NRFX_SPIM_FLAG_HOLD_XFER<span></span>: Driver is not starting the transfer. Use this
270*150812a8SEvalZero  *   flag if the transfer is triggered externally by PPI. Supported only by SPIM. Use
271*150812a8SEvalZero  *   @ref nrfx_spim_start_task_get to get the address of the start task.
272*150812a8SEvalZero  * - @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER<span></span>: No user event handler after transfer
273*150812a8SEvalZero  *   completion. This also means no interrupt at the end of the transfer. Supported only by SPIM.
274*150812a8SEvalZero  *   If @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER is used, the driver does not set the instance into
275*150812a8SEvalZero  *   busy state, so you must ensure that the next transfers are set up when SPIM is not active.
276*150812a8SEvalZero  *   @ref nrfx_spim_end_event_get function can be used to detect end of transfer. Option can be used
277*150812a8SEvalZero  *   together with @ref NRFX_SPIM_FLAG_REPEATED_XFER to prepare a sequence of SPI transfers
278*150812a8SEvalZero  *   without interruptions.
279*150812a8SEvalZero  * - @ref NRFX_SPIM_FLAG_REPEATED_XFER<span></span>: Prepare for repeated transfers. You can set
280*150812a8SEvalZero  *   up a number of transfers that will be triggered externally (for example by PPI). An example is
281*150812a8SEvalZero  *   a TXRX transfer with the options @ref NRFX_SPIM_FLAG_RX_POSTINC,
282*150812a8SEvalZero  *   @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER, and @ref NRFX_SPIM_FLAG_REPEATED_XFER. After the
283*150812a8SEvalZero  *   transfer is set up, a set of transfers can be triggered by PPI that will read, for example,
284*150812a8SEvalZero  *   the same register of an external component and put it into a RAM buffer without any interrupts.
285*150812a8SEvalZero  *   @ref nrfx_spim_end_event_get can be used to get the address of the END event, which can be
286*150812a8SEvalZero  *   used to count the number of transfers. If @ref NRFX_SPIM_FLAG_REPEATED_XFER is used,
287*150812a8SEvalZero  *   the driver does not set the instance into busy state, so you must ensure that the next
288*150812a8SEvalZero  *   transfers are set up when SPIM is not active. Supported only by SPIM.
289*150812a8SEvalZero  *
290*150812a8SEvalZero  * @note Peripherals using EasyDMA (including SPIM) require the transfer buffers
291*150812a8SEvalZero  *       to be placed in the Data RAM region. If this condition is not met,
292*150812a8SEvalZero  *       this function will fail with the error code NRFX_ERROR_INVALID_ADDR.
293*150812a8SEvalZero  *
294*150812a8SEvalZero  * @param p_instance  Pointer to the driver instance structure.
295*150812a8SEvalZero  * @param p_xfer_desc Pointer to the transfer descriptor.
296*150812a8SEvalZero  * @param flags       Transfer options (0 for default settings).
297*150812a8SEvalZero  *
298*150812a8SEvalZero  * @retval NRFX_SUCCESS             If the procedure was successful.
299*150812a8SEvalZero  * @retval NRFX_ERROR_BUSY          If the driver is not ready for a new transfer.
300*150812a8SEvalZero  * @retval NRFX_ERROR_NOT_SUPPORTED If the provided parameters are not supported.
301*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_ADDR  If the provided buffers are not placed in the Data
302*150812a8SEvalZero  *                                  RAM region.
303*150812a8SEvalZero  */
304*150812a8SEvalZero nrfx_err_t nrfx_spim_xfer(nrfx_spim_t const * const     p_instance,
305*150812a8SEvalZero                           nrfx_spim_xfer_desc_t const * p_xfer_desc,
306*150812a8SEvalZero                           uint32_t                      flags);
307*150812a8SEvalZero 
308*150812a8SEvalZero #if NRFX_CHECK(NRFX_SPIM_EXTENDED_ENABLED) || defined(__NRFX_DOXYGEN__)
309*150812a8SEvalZero /**
310*150812a8SEvalZero  * @brief Function for starting the SPI data transfer with DCX control.
311*150812a8SEvalZero  *
312*150812a8SEvalZero  * See @ref nrfx_spim_xfer for description of additional options of transfer
313*150812a8SEvalZero  * provided by the @c flags parameter.
314*150812a8SEvalZero  *
315*150812a8SEvalZero  * @note Peripherals that use EasyDMA (including SPIM) require the transfer buffers
316*150812a8SEvalZero  *       to be placed in the Data RAM region. If this condition is not met,
317*150812a8SEvalZero  *       this function will fail with the error code NRFX_ERROR_INVALID_ADDR.
318*150812a8SEvalZero  *
319*150812a8SEvalZero  * @param p_instance  Pointer to the driver instance structure.
320*150812a8SEvalZero  * @param p_xfer_desc Pointer to the transfer descriptor.
321*150812a8SEvalZero  * @param flags       Transfer options (0 for default settings).
322*150812a8SEvalZero  * @param cmd_length  Length of the command bytes preceding the data
323*150812a8SEvalZero  *                    bytes. The DCX line will be low during transmission
324*150812a8SEvalZero  *                    of command bytes and high during transmission of data bytes.
325*150812a8SEvalZero  *                    Maximum value available for dividing the transmitted bytes
326*150812a8SEvalZero  *                    into command bytes and data bytes is @ref NRF_SPIM_DCX_CNT_ALL_CMD - 1.
327*150812a8SEvalZero  *                    The @ref NRF_SPIM_DCX_CNT_ALL_CMD value passed as the
328*150812a8SEvalZero  *                    @c cmd_length parameter causes all transmitted bytes
329*150812a8SEvalZero  *                    to be marked as command bytes.
330*150812a8SEvalZero  *
331*150812a8SEvalZero  * @retval NRFX_SUCCESS              If the procedure was successful.
332*150812a8SEvalZero  * @retval NRFX_ERROR_BUSY           If the driver is not ready for a new transfer.
333*150812a8SEvalZero  * @retval NRFX_ERROR_NOT_SUPPORTED  If the provided parameters are not supported.
334*150812a8SEvalZero  * @retval NRFX_ERROR_INVALID_ADDR   If the provided buffers are not placed in the Data
335*150812a8SEvalZero  *                                   RAM region.
336*150812a8SEvalZero  */
337*150812a8SEvalZero nrfx_err_t nrfx_spim_xfer_dcx(nrfx_spim_t const * const     p_instance,
338*150812a8SEvalZero                               nrfx_spim_xfer_desc_t const * p_xfer_desc,
339*150812a8SEvalZero                               uint32_t                      flags,
340*150812a8SEvalZero                               uint8_t                       cmd_length);
341*150812a8SEvalZero #endif
342*150812a8SEvalZero 
343*150812a8SEvalZero /**
344*150812a8SEvalZero  * @brief Function for returning the address of a SPIM start task.
345*150812a8SEvalZero  *
346*150812a8SEvalZero  * This function should be used if @ref nrfx_spim_xfer was called with the flag @ref NRFX_SPIM_FLAG_HOLD_XFER.
347*150812a8SEvalZero  * In that case, the transfer is not started by the driver, but it must be started externally by PPI.
348*150812a8SEvalZero  *
349*150812a8SEvalZero  * @param[in]  p_instance Pointer to the driver instance structure.
350*150812a8SEvalZero  *
351*150812a8SEvalZero  * @return     Start task address.
352*150812a8SEvalZero  */
353*150812a8SEvalZero uint32_t nrfx_spim_start_task_get(nrfx_spim_t const * p_instance);
354*150812a8SEvalZero 
355*150812a8SEvalZero /**
356*150812a8SEvalZero  * @brief Function for returning the address of a END SPIM event.
357*150812a8SEvalZero  *
358*150812a8SEvalZero  * The END event can be used to detect the end of a transfer
359*150812a8SEvalZero  * if the @ref NRFX_SPIM_FLAG_NO_XFER_EVT_HANDLER option is used.
360*150812a8SEvalZero  *
361*150812a8SEvalZero  * @param[in] p_instance Pointer to the driver instance structure.
362*150812a8SEvalZero  *
363*150812a8SEvalZero  * @return END event address.
364*150812a8SEvalZero  */
365*150812a8SEvalZero uint32_t nrfx_spim_end_event_get(nrfx_spim_t const * p_instance);
366*150812a8SEvalZero 
367*150812a8SEvalZero /**
368*150812a8SEvalZero  * @brief Function for aborting ongoing transfer.
369*150812a8SEvalZero  *
370*150812a8SEvalZero  * @param[in]  p_instance Pointer to the driver instance structure.
371*150812a8SEvalZero  */
372*150812a8SEvalZero void nrfx_spim_abort(nrfx_spim_t const * p_instance);
373*150812a8SEvalZero 
374*150812a8SEvalZero 
375*150812a8SEvalZero void nrfx_spim_0_irq_handler(void);
376*150812a8SEvalZero void nrfx_spim_1_irq_handler(void);
377*150812a8SEvalZero void nrfx_spim_2_irq_handler(void);
378*150812a8SEvalZero void nrfx_spim_3_irq_handler(void);
379*150812a8SEvalZero 
380*150812a8SEvalZero 
381*150812a8SEvalZero /** @} */
382*150812a8SEvalZero 
383*150812a8SEvalZero #ifdef __cplusplus
384*150812a8SEvalZero }
385*150812a8SEvalZero #endif
386*150812a8SEvalZero 
387*150812a8SEvalZero #endif // NRFX_SPIM_H__
388