SP8EBC-ParaTNC/system/include/drivers/spi.h

71 wiersze
1.7 KiB
C

/*
* spi_stm32l4x.h
*
* Created on: Sep 22, 2022
* Author: mateusz
*/
#ifndef INCLUDE_DRIVERS_SPI_H_
#define INCLUDE_DRIVERS_SPI_H_
#include <stdint.h>
#define SPI_OK 0
#define SPI_BUSY_DIFF_SLAVE 10
#define SPI_BUSY 11
#define SPI_TX_DATA_TO_LONG 20
#define SPI_WRONG_SLAVE_ID 30
#define SPI_UKNOWN 255
typedef enum spi_transfer_mode_t {
SPI_MASTER_MOTOROLA,
SPI_MASTER_TI,
SPI_SLAVE_MOTOROLA,
SPI_SLAVE_TI
}spi_transfer_mode_t;
typedef enum spi_clock_polarity_strobe_t {
CLOCK_NORMAL_FALLING, // CPOL 0, CPHA 1
CLOCK_NORMAL_RISING, // CPOL 0, CPHA 0
CLOCK_REVERSED_FALLING, // CPOL 1, CPHA 0
CLOCK_REVERSED_RISING // CPOL 1, CPHA 1
}spi_clock_polarity_strobe_t;
#define SPI_ENDIAN_LSB 0
#define SPI_ENDIAN_MSB 1
typedef enum spi_rx_state_t {
SPI_RX_IDLE,
SPI_RX_RXING,
SPI_RX_DONE,
SPI_RX_ERROR_OVERRUN,
SPI_RX_ERROR_MODF,
SPI_RX_ERROR_TIMEOUT
}spi_rx_state_t;
typedef enum spi_tx_state_t {
SPI_TX_IDLE,
SPI_TX_TXING,
SPI_TX_DONE,
SPI_TX_ERROR_MODF
}spi_tx_state_t;
#define SPI_TIMEOUT_MSEC 100
uint8_t spi_init_full_duplex_pio(spi_transfer_mode_t mode, spi_clock_polarity_strobe_t strobe, int speed, int endianess);
uint8_t spi_rx_data(uint32_t slave_id, uint8_t * rx_buffer, uint16_t ln_to_rx);
uint8_t spi_tx_data(uint32_t slave_id, uint8_t * tx_buffer, uint16_t ln_to_tx);
uint8_t spi_rx_tx_data(uint32_t slave_id, uint8_t * rx_buffer, uint8_t * tx_buffer, uint16_t ln_to_rx, uint16_t ln_to_tx);
uint8_t * spi_get_rx_data(void);
uint8_t spi_wait_for_comms_done(void);
void spi_reset_errors(void);
void spi_irq_handler(void);
void spi_timeout_handler(void);
void spi_enable(void);
void spi_disable(uint8_t immediately);
#endif /* INCLUDE_DRIVERS_SPI_H_ */