SPI
Macros
spi role
spi 支持主从角色。
1 #define SPI_ROLE_MASTER 0
2 #define SPI_ROLE_SLAVE 1
spi mode
spi 支持 4 种工作模式。
1 #define SPI_DEV_MODE0 0 /* CPOL=0 CHPHA=0 */
2 #define SPI_DEV_MODE1 1 /* CPOL=0 CHPHA=1 */
3 #define SPI_DEV_MODE2 2 /* CPOL=1 CHPHA=0 */
4 #define SPI_DEV_MODE3 3 /* CPOL=1 CHPHA=1 */
spi data_width
spi 支持 4 种位宽。
1 #define SPI_DATA_WIDTH_8BIT 0
2 #define SPI_DATA_WIDTH_16BIT 1
3 #define SPI_DATA_WIDTH_24BIT 2
4 #define SPI_DATA_WIDTH_32BIT 3
spi bit_order
spi bit 先行方式。
1 #define SPI_BIT_LSB 1
2 #define SPI_BIT_MSB 0
spi byte_order
spi 字节先行方式。
1 #define SPI_BYTE_LSB 0
2 #define SPI_BYTE_MSB 1
Structs
struct bflb_spi_config_s
spi 初始化配置结构体。
1 struct bflb_spi_config_s {
2 uint32_t freq;
3 uint8_t role;
4 uint8_t mode;
5 uint8_t data_width;
6 uint8_t bit_order;
7 uint8_t byte_order;
8 uint8_t tx_fifo_threshold;
9 uint8_t rx_fifo_threshold;
10 };
parameter |
description |
---|---|
freq |
频率(BL702 不得超过32M,其他芯片不得超过 40M) |
role |
主从选择 |
mode |
工作模式 |
data_width |
数据宽度 |
bit_order |
bit 先行方式 |
byte_order |
字节先行方式 |
tx_fifo_threshold |
发送 fifo 中断触发阈值(大于阈值触发中断) |
rx_fifo_threshold |
接收 fifo 中断触发阈值(大于阈值触发中断) |
备注
SPI 阈值最大为 16
Functions
bflb_spi_init
说明: 初始化 spi。使用之前需要开启 spi ip 时钟、设置 spi 时钟源和分频值、选择 gpio 为 spi 功能。
1 void bflb_spi_init(struct bflb_device_s *dev, const struct bflb_spi_config_s *config);
parameter |
description |
---|---|
dev |
设备句柄 |
config |
配置项 |
bflb_spi_deinit
说明: 反初始化 spi。
1 void bflb_spi_deinit(struct bflb_device_s *dev);
parameter |
description |
---|---|
dev |
设备句柄 |
bflb_spi_link_txdma
说明: spi tx dma 使能开关。
1 void bflb_spi_link_txdma(struct bflb_device_s *dev, bool enable);
parameter |
description |
---|---|
dev |
设备句柄 |
enable |
是否使能 dma |
bflb_spi_link_rxdma
说明: spi rx dma 使能开关。
1 void bflb_spi_link_rxdma(struct bflb_device_s *dev, bool enable);
parameter |
description |
---|---|
dev |
设备句柄 |
enable |
是否使能 dma |
bflb_spi_poll_send
说明: 通过 spi 阻塞式发送一个数据并接收一个数据。
1 uint32_t bflb_spi_poll_send(struct bflb_device_s *dev, uint32_t data);
parameter |
description |
---|---|
dev |
设备句柄 |
data |
发送的数据(可以为字节、字、双字) |
return |
接收的数据(可以为字节、字、双字) |
bflb_spi_poll_exchange
说明: 通过 spi 阻塞式发送一段数据并接收一段数据。
1 int bflb_spi_poll_exchange(struct bflb_device_s *dev, const void *txbuffer, void *rxbuffer, size_t nbyte);
parameter |
description |
---|---|
dev |
设备句柄 |
txbuffer |
发送缓冲区 |
rxbuffer |
接收缓冲区 |
nbyte |
数据长度 |
bflb_spi_txint_mask
说明: spi tx fifo 阈值中断屏蔽开关,开启后超过设定阈值则触发中断。
1 void bflb_spi_txint_mask(struct bflb_device_s *dev, bool mask);
parameter |
description |
---|---|
dev |
设备句柄 |
mask |
是否屏蔽中断 |
bflb_spi_rxint_mask
说明: spi rx fifo 阈值中断和超时屏蔽开关,开启后超过设定阈值则或者超时则触发中断。
1 void bflb_spi_rxint_mask(struct bflb_device_s *dev, bool mask);
parameter |
description |
---|---|
dev |
设备句柄 |
mask |
是否屏蔽中断 |
bflb_spi_errint_mask
说明: spi 错误中断屏蔽开关。
1 void bflb_spi_errint_mask(struct bflb_device_s *dev, bool mask);
parameter |
description |
---|---|
dev |
设备句柄 |
mask |
是否屏蔽中断 |
bflb_spi_get_intstatus
说明: 获取 spi 中断标志。
1 uint32_t bflb_spi_get_intstatus(struct bflb_device_s *dev);
parameter |
description |
---|---|
dev |
设备句柄 |
return |
中断标志 |
中断标志有以下选项:
1#define SPI_INTSTS_TC (1 << 0)
2#define SPI_INTSTS_TX_FIFO (1 << 1)
3#define SPI_INTSTS_RX_FIFO (1 << 2)
4#define SPI_INTSTS_SLAVE_TIMEOUT (1 << 3)
5#define SPI_INTSTS_SLAVE_TX_UNDERRUN (1 << 4)
6#define SPI_INTSTS_FIFO_ERR (1 << 5)
bflb_spi_int_clear
说明: 清除 spi 中断标志。
1 void bflb_spi_int_clear(struct bflb_device_s *dev, uint32_t int_clear);
parameter |
description |
---|---|
dev |
设备句柄 |
int_clear |
清除值 |
int_clear 可以填入以下参数:
1#define SPI_INTCLR_TC (1 << 16)
2#define SPI_INTCLR_SLAVE_TIMEOUT (1 << 19)
3#define SPI_INTCLR_SLAVE_TX_UNDERRUN (1 << 20)
bflb_spi_feature_control
说明: spi 其他特性相关控制,一般不常用。
1 int bflb_spi_feature_control(struct bflb_device_s *dev, int cmd, size_t arg);
parameter |
description |
---|---|
dev |
设备句柄 |
cmd |
控制字 |
arg |
控制参数 |
return |
负值表示不支持此命令 |
cmd 可以填入以下参数:
1#define SPI_CMD_SET_DATA_WIDTH (0x01)
2#define SPI_CMD_GET_DATA_WIDTH (0x02)
3#define SPI_CMD_CLEAR_TX_FIFO (0x03)
4#define SPI_CMD_CLEAR_RX_FIFO (0x04)
5#define SPI_CMD_SET_CS_INTERVAL (0x05)