This repository has been archived on 2023-07-17. You can view files and clone it, but cannot push or open issues or pull requests.
bl_mcu_sdk/drivers/lhal/include/bflb_spi.h

132 lines
3.4 KiB
C
Raw Normal View History

#ifndef _BFLB_SPI_H
#define _BFLB_SPI_H
#include "bflb_core.h"
#if defined(BL602) || defined(BL702)
#define SPI_FIFO_WORD_NUM_MAX 4
#define SPI_FIFO_WIDTH_VARIABLE_SUPPORT 0
#elif defined(BL606P) || defined(BL808)
#define SPI_FIFO_BYTE_NUM_MAX 32
#define SPI_FIFO_WIDTH_VARIABLE_SUPPORT 1
#elif defined(BL616) || defined(BL628)
#define SPI_FIFO_BYTE_NUM_MAX 16
#define SPI_FIFO_WIDTH_VARIABLE_SUPPORT 1
#elif defined(BL702L)
#define SPI_FIFO_BYTE_NUM_MAX 16
#define SPI_FIFO_WIDTH_VARIABLE_SUPPORT 1
#else
#error "unknown device"
#endif
/** @defgroup SPI_ROLE spi role definition
* @{
*/
#define SPI_ROLE_MASTER 0
#define SPI_ROLE_SLAVE 1
/**
* @}
*/
/** @defgroup SPI_MODE spi mode definition
* @{
*/
#define SPI_MODE0 0 /* CPOL=0 CHPHA=0 */
#define SPI_MODE1 1 /* CPOL=0 CHPHA=1 */
#define SPI_MODE2 2 /* CPOL=1 CHPHA=0 */
#define SPI_MODE3 3 /* CPOL=1 CHPHA=1 */
/**
* @}
*/
/** @defgroup SPI_DATA_WIDTH spi data width definition
* @{
*/
#define SPI_DATA_WIDTH_8BIT 1
#define SPI_DATA_WIDTH_16BIT 2
#define SPI_DATA_WIDTH_24BIT 3
#define SPI_DATA_WIDTH_32BIT 4
/**
* @}
*/
/** @defgroup SPI_BIT_ORDER spi bit order definition
* @{
*/
#define SPI_BIT_LSB 1
#define SPI_BIT_MSB 0
/**
* @}
*/
/** @defgroup SPI_BYTE_ORDER spi byte order definition
* @{
*/
#define SPI_BYTE_LSB 0
#if !defined(BL602) && !defined(BL702)
#define SPI_BYTE_MSB 1
#endif
/**
* @}
*/
2022-10-29 13:33:23 +08:00
/** @defgroup SPI_CMD spi feature control cmd definition
* @{
*/
#define SPI_CMD_SET_DATA_WIDTH (0x01)
#define SPI_CMD_GET_DATA_WIDTH (0x02)
#define SPI_CMD_CLEAR_TX_FIFO (0x03)
#define SPI_CMD_CLEAR_RX_FIFO (0x04)
#define SPI_CMD_SET_CS_INTERVAL (0x05)
/**
* @}
*/
/**
* @brief SPI configuration structure
*
* @param freq SPI frequence, should be less than spi_clk/2
* @param role SPI role, use @ref SPI_ROLE
* @param mode SPI mode, use @ref SPI_MODE
* @param data_width SPI data width, use @ref SPI_DATA_WIDTH
* @param bit_order SPI bit order, use @ref SPI_BIT_ORDER
* @param byte_order SPI byte order, use @ref SPI_BYTE_ORDER
* @param tx_fifo_threshold SPI tx fifo threshold, should be less than 4
* @param rx_fifo_threshold SPI rx fifo threshold, should be less than 4
*/
struct bflb_spi_config_s {
uint32_t freq;
uint8_t role;
uint8_t mode;
uint8_t data_width;
uint8_t bit_order;
uint8_t byte_order;
uint8_t tx_fifo_threshold;
uint8_t rx_fifo_threshold;
};
#ifdef __cplusplus
extern "C" {
#endif
void bflb_spi_init(struct bflb_device_s *dev, const struct bflb_spi_config_s *config);
void bflb_spi_deinit(struct bflb_device_s *dev);
void bflb_spi_link_txdma(struct bflb_device_s *dev, bool enable);
void bflb_spi_link_rxdma(struct bflb_device_s *dev, bool enable);
uint32_t bflb_spi_poll_send(struct bflb_device_s *dev, uint32_t data);
int bflb_spi_poll_exchange(struct bflb_device_s *dev, const void *txbuffer, void *rxbuffer, size_t nbytes);
2022-10-29 13:33:23 +08:00
bool bflb_spi_isbusy(struct bflb_device_s *dev);
void bflb_spi_txint_mask(struct bflb_device_s *dev, bool mask);
void bflb_spi_rxint_mask(struct bflb_device_s *dev, bool mask);
void bflb_spi_errint_mask(struct bflb_device_s *dev, bool mask);
uint32_t bflb_spi_get_intstatus(struct bflb_device_s *dev);
void bflb_spi_int_clear(struct bflb_device_s *dev, uint32_t int_clear);
int bflb_spi_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
#ifdef __cplusplus
}
#endif
#endif