13 #define SPI_MASTER_MINIMUM_DELAY 10
18 #include <xcore/assert.h>
19 #include <xcore/port.h>
20 #include <xcore/clock.h>
23 #define SPI_IO_SETC_PAD_DELAY(n) (0x7007 | ((n) << 3))
26 #define SPI_IO_RESOURCE_SETCI(res, c) asm volatile( "setc res[%0], %1" :: "r" (res), "n" (c))
27 #define SPI_IO_RESOURCE_SETC(res, r) asm volatile( "setc res[%0], %1" :: "r" (res), "r" (r))
28 #define SPI_IO_SETSR(c) asm volatile("setsr %0" : : "n"(c));
29 #define SPI_IO_CLRSR(c) asm volatile("clrsr %0" : : "n"(c));
32 __attribute__((always_inline))
33 inline void spi_io_port_outpw(
38 asm volatile(
"outpw res[%0], %1, %2" : :
"r" (__p),
"r" (__w),
"r" (__bpw));
72 #define SPI_MODE_0 0,0
78 #define SPI_MODE_1 0,1
84 #define SPI_MODE_2 1,0
90 #define SPI_MODE_3 1,1
103 uint32_t current_device;
104 int delay_before_transfer;
118 uint32_t miso_pad_delay;
119 uint32_t miso_initial_trigger_delay;
120 uint32_t cs_assert_val;
121 uint32_t clock_delay;
123 uint32_t cs_to_clk_delay_ticks;
124 uint32_t clk_to_cs_delay_ticks;
125 uint32_t cs_to_cs_delay_ticks;
140 xclock_t clock_block,
180 uint32_t clock_divisor,
182 uint32_t miso_pad_delay,
183 uint32_t cs_to_clk_delay_ticks,
184 uint32_t clk_to_cs_delay_ticks,
185 uint32_t cs_to_cs_delay_ticks);
223 uint32_t delay_ticks)
227 spi->delay_before_transfer = 1;
229 port_clear_trigger_time(spi->cs_port);
232 port_out(spi->cs_port, dev->cs_assert_val);
233 port_sync(spi->cs_port);
240 port_out_at_time(spi->cs_port, port_get_trigger_time(spi->cs_port) + delay_ticks, dev->cs_assert_val);
297 typedef void (*
slave_transaction_ended_t)(
void *app_data, uint8_t **out_buf,
size_t bytes_written, uint8_t **in_buf,
size_t bytes_read,
size_t read_bits);
303 #define SPI_CALLBACK_ATTR __attribute__((fptrgroup("spi_callback")))
void spi_master_deinit(spi_master_t *spi)
void(* slave_transaction_ended_t)(void *app_data, uint8_t **out_buf, size_t bytes_written, uint8_t **in_buf, size_t bytes_read, size_t read_bits)
Definition: spi.h:297
void spi_master_transfer(spi_master_device_t *dev, uint8_t *data_out, uint8_t *data_in, size_t len)
void spi_master_delay_before_next_transfer(spi_master_device_t *dev, uint32_t delay_ticks)
Definition: spi.h:221
void spi_master_end_transaction(spi_master_device_t *dev)
void spi_master_start_transaction(spi_master_device_t *dev)
#define SPI_CALLBACK_ATTR
Definition: spi.h:303
spi_master_source_clock_t
Definition: spi.h:63
spi_master_sample_delay_t
Definition: spi.h:52
void(* slave_transaction_started_t)(void *app_data, uint8_t **out_buf, size_t *outbuf_len, uint8_t **in_buf, size_t *inbuf_len)
Definition: spi.h:277
void spi_master_init(spi_master_t *spi, xclock_t clock_block, port_t cs_port, port_t sclk_port, port_t mosi_port, port_t miso_port)
void spi_master_device_init(spi_master_device_t *dev, spi_master_t *spi, uint32_t cs_pin, int cpol, int cpha, spi_master_source_clock_t source_clock, uint32_t clock_divisor, spi_master_sample_delay_t miso_sample_delay, uint32_t miso_pad_delay, uint32_t cs_to_clk_delay_ticks, uint32_t clk_to_cs_delay_ticks, uint32_t cs_to_cs_delay_ticks)
@ spi_master_source_clock_ref
Definition: spi.h:64
@ spi_master_source_clock_xcore
Definition: spi.h:65
@ spi_master_sample_delay_0
Definition: spi.h:53
@ spi_master_sample_delay_1
Definition: spi.h:54
@ spi_master_sample_delay_3
Definition: spi.h:56
@ spi_master_sample_delay_2
Definition: spi.h:55
@ spi_master_sample_delay_4
Definition: spi.h:57
void spi_slave(const spi_slave_callback_group_t *spi_cbg, port_t p_sclk, port_t p_mosi, port_t p_miso, port_t p_cs, xclock_t clk, int cpol, int cpha)
#define SPI_MASTER_MINIMUM_DELAY
Definition: spi.h:13
void * app_data
Definition: spi.h:330
SPI_CALLBACK_ATTR slave_transaction_ended_t slave_transaction_ended
Definition: spi.h:327
SPI_CALLBACK_ATTR slave_transaction_started_t slave_transaction_started
Definition: spi.h:321