53 #define SPI_CMD_DATA_MASK 0xFF
54 #define SPI_CMD_WR (1 << 8)
55 #define SPI_CMD_RD (1 << 9)
56 #define SPI_CMD_SS (1 << 11)
57 #define SPI_CMD_READ_INVALID (1 << 31)
64 #define SPI_RSP_CMD_FIFO_AVAILABILITY (0xFFFF)
65 #define SPI_RSP_FIFO_OCCUPANCY (0xFFFF << 16)
72 #define SPI_CONFIG_CPOL (1 << 0)
73 #define SPI_CONFIG_MODE (1 << 4)
74 #define SPI_CONFIG_CPHA (1 << 16)
81 #define SPI_INTC_CMD_INT_ENABLE (1 << 0)
82 #define SPI_INTC_RSP_INT_ENABLE (1 << 1)
83 #define SPI_CMD_INT (1 << 8)
84 #define SPI_RSP_INT (1 << 9)
85 #define SPI_CMD_VALID (1 << 16)
95#define IS_VALID_CPOL(x) ((x) == LOW || (x) == HIGH)
96#define IS_VALID_CPHA(x) ((x) == DATA_SAMPLED_RISE_EDGE || (x) == DATA_SAMPLED_FALL_EDGE)
97#define IS_VALID_MODE(x) ((x) == FULL_DUPLEX_SINGLE_LINE || (x) == HALF_DUPLEX_DUAL_LINE || (x) == HALF_DUPLEX_QUAD_LINE)
173 typedef volatile struct {
cfg_mode
SPI transfer mode configuration.
cfg_cpol
SPI clock polarity configuration.
cfg_cpha
SPI clock phase configuration.
@ FULL_DUPLEX_SINGLE_LINE
Full-duplex mode using single data lin.
@ HALF_DUPLEX_QUAD_LINE
Half-duplex mode using quad data lin.
@ HALF_DUPLEX_DUAL_LINE
Half-duplex mode using dual data lin.
@ HIGH
Clock is high when id.
@ LOW
Clock is low when id.
@ DATA_SAMPLED_FALL_EDGE
Data sampled on falling clock ed.
@ DATA_SAMPLED_RISE_EDGE
Data sampled on rising clock ed.
u8 spi_read(spi_instance_t *inst)
Read 8-bit SPI data.
u32 spi_read32(spi_instance_t *inst)
Read 32-bit SPI data.
void spi_waitUntilIdle(spi_instance_t *inst)
Wait for SPI if any command waiting to be executed.
void spi_diselect(spi_instance_t *inst, u32 cs)
De-assert SPI Chip Select.
u32 spi_isBusy(spi_instance_t *inst)
Check SPI if it has any command waiting to be executed in queue.
void spi_applyConfig(spi_instance_t *inst)
Apply stored SPI configuration to hardware.
void spi_write(spi_instance_t *inst, u8 data)
Write 8-bit SPI data.
u32 spi_writeRead32(spi_instance_t *inst, u32 data)
Write and Read 32-bit SPI data.
u32 spi_cmdAvailability(spi_instance_t *inst)
Check SPI command FIFO availability.
u8 spi_writeRead(spi_instance_t *inst, u8 data)
Write and Read 8-bit SPI data.
void spi_write32(spi_instance_t *inst, u32 data)
Write 32-bit SPI data.
u32 spi_rspOccupancy(spi_instance_t *inst)
Check SPI response FIFO occupancy.
void spi_setDataMode(spi_instance_t *inst, enum cfg_mode mode)
Set SPI data transfer mode.
void spi_select(spi_instance_t *inst, u32 cs)
Assert SPI Chip Select.
SPI hardware register map.
u32 SSSETUP
Address Offset: 0x24 - SS Setup Cycles.
u32 CMD
Address Offset: 0x00 - Command Register.
u32 INTERRUPT
Address Offset: 0x0C - Interrupt Control.
u32 RESERVED0[4]
Reserved.
u32 CMD_WRITELARGE
Address Offset: 0x50 - 32-bit Write.
u32 SSDISABLE
Address Offset: 0x2C - SS Disable Cycles.
u32 CMD_READLARGE
Address Offset: 0x58 - 32-bit Read.
u32 SSACTIVEHIGH
Address Offset: 0x30 - SS Polarity.
u32 RSP
Address Offset: 0x04 - Response Register.
u32 CONFIG
Address Offset: 0x08 - Configuration Register.
u32 CLOCKDIVIDER
Address Offset: 0x20 - Clock Divider.
u32 SSHOLD
Address Offset: 0x28 - SS Hold Cycles.
u32 RESERVED1[7]
Reserved.
u32 CMD_READWRITELARGE
Address Offset: 0x54 - 32-bit Read/Write.
SPI instance. Holds the software registers and hardware pointer.
spi_hwreg_t * hwreg
Pointer to Hardware Register Map.
enum cfg_mode mode
Stored Transfer Mode.
u32 ssSetup
Slave Select Setup Cycles.
u32 clkDivider
Clock Divider Value.
enum cfg_cpol cpol
Stored Clock Polarity.
enum cfg_cpha cpha
Stored Clock Phase.
u32 ssHold
Slave Select Hold Cycles.
u32 ssDisable
Slave Select Disable Cycles.