ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_spi.h
Go to the documentation of this file.
1
40
41#pragma once
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47#include <stdint.h>
48
49#include "ra8_dma.h"
50#include "ra8_err.h"
51
52/* =============================================================================
53 * Types
54 * =============================================================================
55 */
56
67
89
99typedef struct {
100 uint32_t baud_hz;
101 uint32_t pclka_hz;
104 bool loopback;
106
118
126typedef void (*ra8_spi_complete_fn_t)(void* ctx, uint8_t err_mask);
127
128/* =============================================================================
129 * Lifecycle
130 * =============================================================================
131 */
132
147[[nodiscard]] ra8_err_t ra8_spi_init(uint8_t channel, const ra8_spi_cfg_t* cfg);
148
156[[nodiscard]] ra8_err_t ra8_spi_deinit(uint8_t channel);
157
158/* =============================================================================
159 * Legacy polling API
160 * =============================================================================
161 */
162
169[[nodiscard]] ra8_err_t ra8_spi_controller_init(uint8_t channel);
170
180[[nodiscard]] ra8_err_t ra8_spi_xfer8(uint8_t channel, uint8_t tx, uint8_t* rx);
181
182/* =============================================================================
183 * Multi-byte / multi-width polling transfers (FSP r_spi_b parity)
184 * =============================================================================
185 */
186
226[[nodiscard]] ra8_err_t
227ra8_spi_write(uint8_t channel, const void* tx, uint32_t len, ra8_spi_bit_width_t bit_width);
228
261[[nodiscard]] ra8_err_t
262ra8_spi_read(uint8_t channel, void* rx, uint32_t len, ra8_spi_bit_width_t bit_width);
263
295[[nodiscard]] ra8_err_t ra8_spi_write_read(uint8_t channel,
296 const void* tx,
297 void* rx,
298 uint32_t len,
299 ra8_spi_bit_width_t bit_width);
300
301/* =============================================================================
302 * Runtime reconfigure
303 * =============================================================================
304 */
305
315[[nodiscard]] ra8_err_t ra8_spi_set_clock(uint8_t channel, uint32_t baud_hz, uint32_t pclka_hz);
316
317/* =============================================================================
318 * Error status
319 * =============================================================================
320 */
321
330[[nodiscard]] ra8_err_t ra8_spi_get_errors(uint8_t channel, uint8_t* out_mask);
331
338[[nodiscard]] ra8_err_t ra8_spi_clear_errors(uint8_t channel);
339
340/* =============================================================================
341 * Interrupt path
342 * =============================================================================
343 */
344
354[[nodiscard]] ra8_err_t
355ra8_spi_attach_transfer_handler(uint8_t channel, ra8_spi_complete_fn_t fn, void* ctx);
356
357/* =============================================================================
358 * Power transition
359 * =============================================================================
360 */
361
366[[nodiscard]] ra8_err_t ra8_spi_enter_stop(uint8_t channel);
367
372[[nodiscard]] ra8_err_t ra8_spi_exit_stop(uint8_t channel);
373
374/* =============================================================================
375 * Target (peripheral) mode -- SPI_B as an SPI peripheral
376 * =============================================================================
377 */
378
421[[nodiscard]] ra8_err_t ra8_spi_b_target_init(uint8_t channel, const ra8_spi_cfg_t* cfg);
422
475[[nodiscard]] ra8_err_t ra8_spi_b_target_xfer(uint8_t channel, uint8_t tx, uint8_t* rx);
476
477/* =============================================================================
478 * DMA TX / RX
479 * =============================================================================
480 */
481
512[[nodiscard]] ra8_err_t ra8_spi_write_dma(uint8_t channel,
513 const uint8_t* data,
514 uint16_t len,
515 ra8_dma_complete_fn_t on_complete,
516 void* ctx,
517 uint8_t* out_dma_channel);
518
547[[nodiscard]] ra8_err_t ra8_spi_read_dma(uint8_t channel,
548 uint8_t* out_buf,
549 uint16_t len,
550 ra8_dma_complete_fn_t on_complete,
551 void* ctx,
552 uint8_t* out_dma_channel);
553
554/* =============================================================================
555 * ISR dispatch
556 * =============================================================================
557 */
558
579void ra8_spi_dispatch_spti(uint8_t channel);
580
600void ra8_spi_dispatch_spri(uint8_t channel);
601
621void ra8_spi_dispatch_spei(uint8_t channel);
622
623#ifdef __cplusplus
624}
625#endif
Generic DMA transfer substrate (DMAC engine).
void(* ra8_dma_complete_fn_t)(void *ctx)
Caller-supplied completion callback.
Definition ra8_dma.h:88
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
ra8_spi_bit_width_t
Per-frame bit width for multi-byte transfers.
Definition ra8_spi.h:84
@ k_ra8_spi_width_16
16-bit frame -> SPCMDn.SPB = 0b01111.
Definition ra8_spi.h:86
@ k_ra8_spi_width_32
32-bit frame -> SPCMDn.SPB = 0b11111.
Definition ra8_spi.h:87
@ k_ra8_spi_width_8
8-bit frame -> SPCMDn.SPB = 0b00111.
Definition ra8_spi.h:85
ra8_err_t ra8_spi_b_target_xfer(uint8_t channel, uint8_t tx, uint8_t *rx)
Exchange one byte as the SPI target in a polled blocking call.
ra8_err_t ra8_spi_write(uint8_t channel, const void *tx, uint32_t len, ra8_spi_bit_width_t bit_width)
Multi-frame TX-only polling transfer.
Definition ra8_spi_b.c:703
ra8_err_t ra8_spi_write_read(uint8_t channel, const void *tx, void *rx, uint32_t len, ra8_spi_bit_width_t bit_width)
Multi-frame full-duplex polling transfer.
Definition ra8_spi_b.c:719
ra8_err_t ra8_spi_read_dma(uint8_t channel, uint8_t *out_buf, uint16_t len, ra8_dma_complete_fn_t on_complete, void *ctx, uint8_t *out_dma_channel)
Kick off a DMA-backed RX transfer on an SPI channel.
ra8_err_t ra8_spi_attach_transfer_handler(uint8_t channel, ra8_spi_complete_fn_t fn, void *ctx)
Attach a transfer-complete callback for a channel.
Definition ra8_spi_b.c:809
void(* ra8_spi_complete_fn_t)(void *ctx, uint8_t err_mask)
Transfer-complete callback signature.
Definition ra8_spi.h:126
ra8_err_t ra8_spi_clear_errors(uint8_t channel)
Clear the SPSR error flags.
Definition ra8_spi_b.c:794
void ra8_spi_dispatch_spei(uint8_t channel)
Dispatch SPEI – collect + clear errors, fire callback.
Definition ra8_spi_b.c:871
ra8_err_t ra8_spi_enter_stop(uint8_t channel)
Put the channel into MSTP-gated stop state.
Definition ra8_spi_b.c:824
void ra8_spi_dispatch_spti(uint8_t channel)
Dispatch SPTI – advance TX state.
Definition ra8_spi_b.c:853
ra8_err_t ra8_spi_controller_init(uint8_t channel)
Legacy init (1.9 MHz at PCLKA = 125 MHz, mode 0).
Definition ra8_spi_b.c:405
ra8_err_t ra8_spi_get_errors(uint8_t channel, uint8_t *out_mask)
Read the SPSR error bits (OVRF, MODERF, PERF, UDRF).
Definition ra8_spi_b.c:766
ra8_err_t ra8_spi_b_target_init(uint8_t channel, const ra8_spi_cfg_t *cfg)
Initialise an SPI_B channel in target (peripheral) mode.
ra8_err_t ra8_spi_xfer8(uint8_t channel, uint8_t tx, uint8_t *rx)
Full-duplex 8-bit exchange.
Definition ra8_spi_b.c:421
ra8_err_t ra8_spi_read(uint8_t channel, void *rx, uint32_t len, ra8_spi_bit_width_t bit_width)
Multi-frame RX-only polling transfer.
Definition ra8_spi_b.c:711
ra8_err_t ra8_spi_exit_stop(uint8_t channel)
Exit MSTP-gated stop state.
Definition ra8_spi_b.c:839
void ra8_spi_dispatch_spri(uint8_t channel)
Dispatch SPRI – advance RX state.
Definition ra8_spi_b.c:862
ra8_spi_mode_t
CPOL / CPHA combinations.
Definition ra8_spi.h:61
@ k_ra8_spi_mode_0
CPOL=0, CPHA=0.
Definition ra8_spi.h:62
@ k_ra8_spi_mode_3
CPOL=1, CPHA=1.
Definition ra8_spi.h:65
@ k_ra8_spi_mode_1
CPOL=0, CPHA=1.
Definition ra8_spi.h:63
@ k_ra8_spi_mode_2
CPOL=1, CPHA=0.
Definition ra8_spi.h:64
ra8_err_t ra8_spi_set_clock(uint8_t channel, uint32_t baud_hz, uint32_t pclka_hz)
Change the SPI clock without tearing down the channel.
Definition ra8_spi_b.c:741
ra8_err_t ra8_spi_init(uint8_t channel, const ra8_spi_cfg_t *cfg)
Initialise an SPI channel with a full config descriptor.
Definition ra8_spi_b.c:348
ra8_err_t ra8_spi_write_dma(uint8_t channel, const uint8_t *data, uint16_t len, ra8_dma_complete_fn_t on_complete, void *ctx, uint8_t *out_dma_channel)
Kick off a DMA-backed TX transfer on an SPI channel.
ra8_spi_err_mask_t
Bit mask of SPI error flags.
Definition ra8_spi.h:111
@ k_ra8_spi_err_none
RA8 SPI error none.
Definition ra8_spi.h:112
@ k_ra8_spi_err_mode
SPSR.MODERF set.
Definition ra8_spi.h:114
@ k_ra8_spi_err_parity
SPSR.PERF set.
Definition ra8_spi.h:115
@ k_ra8_spi_err_underrun
SPSR.UDRF set.
Definition ra8_spi.h:116
@ k_ra8_spi_err_overrun
SPSR.OVRF set.
Definition ra8_spi.h:113
ra8_err_t ra8_spi_deinit(uint8_t channel)
Tear down a channel.
Definition ra8_spi_b.c:382
Configuration descriptor for ra8_spi_init.
Definition ra8_spi.h:99
bool lsb_first
True for LSB-first transfers.
Definition ra8_spi.h:103
bool loopback
SPCR2.SPLP=1: internal COPI->CIPO tie (no pins).
Definition ra8_spi.h:104
uint32_t pclka_hz
Current PCLKA in Hz (for SPBR calc).
Definition ra8_spi.h:101
uint32_t baud_hz
Target SPI clock in Hz.
Definition ra8_spi.h:100
ra8_spi_mode_t mode
CPOL / CPHA combination.
Definition ra8_spi.h:102