Files
AC707N/SDK/interface/driver/spi.h
T
2025-12-03 11:12:34 +08:00

117 lines
4.1 KiB
C

#ifndef _SPI_H_
#define _SPI_H_
#include "asm/spi_hw.h"
enum spi_mode {
SPI_MODE_BIDIR_1BIT, //支持SPIx(x=0,1,2),全双工,di接收,do发送
SPI_MODE_UNIDIR_1BIT, //支持SPIx(x=0,1,2),半双工,do分时发送/接收
SPI_MODE_UNIDIR_2BIT, //支持SPIx(x=0,1,2),半双工,di & do共2bit分时发送/接收
SPI_MODE_UNIDIR_4BIT, //支持SPIx(x=1),半双工,di & do & wp & hold 共4bit分时发送/接收
};
enum spi_role {
SPI_ROLE_MASTER,
SPI_ROLE_SLAVE,
};
enum hw_spi_isr_status {
SPI_WAITING_PND,
SPI_TX_FINISH,
SPI_RX_FINISH,
SPI_PND_ERROR,
};
typedef struct spi_platform_data {
u8 port[6]; //CLK, DO, DI, D2(wp), D3(hold), cs(只用于slave),未使用的io配0xff
enum spi_role role; //master or slave
enum spi_mode mode; //模式,选项为enum spi_mode中的枚举常量
enum spi_bit_mode bit_mode;
u8 cpol: 1; //clk level in idle state:0:low, 1:high
u8 cpha: 2; //0:s_rise,u_fall 1:s_fall,u_rise 2:s_fall,u_fall 3:s_rise,u_rise
u8 ie_en: 1; //ie enbale:0:disable, 1:enable
u8 irq_priority: 4; //中断优先级
void (*spi_isr_callback)(hw_spi_dev spi, enum hw_spi_isr_status sta); //spi isr callback
u32 clk; //波特率
} spi_hardware_info;
#define HW_SPI_MASTER_CS_EN 0//0:close,1:open
struct spi_platform_data *get_hw_spi_config(hw_spi_dev spi);
int spi_open(hw_spi_dev spi, spi_hardware_info *spi_info);
void spi_deinit(hw_spi_dev spi);
void spi_suspend(hw_spi_dev spi);
void spi_resume(hw_spi_dev spi);
void spi_set_bit_mode(hw_spi_dev spi, enum spi_mode mode);
int spi_set_baud(hw_spi_dev spi, u32 baud);
u32 spi_get_baud(hw_spi_dev spi);
/*******************主机 阻塞接口*********************/
u8 spi_recv_byte(hw_spi_dev spi, int *err);
int spi_send_byte(hw_spi_dev spi, u8 byte);
u8 spi_send_recv_byte(hw_spi_dev spi, u8 byte, int *err);//全双工
int spi_dma_recv(hw_spi_dev spi, void *buf, u32 len);
int spi_dma_send(hw_spi_dev spi, const void *buf, u32 len);
void spi_set_ie(hw_spi_dev spi, u8 en);
u8 spi_get_pending(hw_spi_dev spi);
void spi_clear_pending(hw_spi_dev spi);
/*******************主机,从机中断接口*********************/
//切换中断回调函数
void hw_spix_irq_change_callback(hw_spi_dev spi, void (*spi_isr_callback_f)(hw_spi_dev spi, enum hw_spi_isr_status sta));
/*
* @brief 发送1个字节,不等待pnd,用于中断,无cs, 适用主从
* @parm spi spi句柄
* @parm tx_byte 发送的数据,rw=1时无效
* @parm rx_byte 接收的数据的地址,没有时给NULL
* @parm rw :1-rx; 0-tx
* @return null
*/
void spi_byte_transmit_for_isr(hw_spi_dev spi, u8 tx_byte, u8 *rx_byte, u8 rw);//rw:1-rx; 0-tx
/*
* @brief 发送n个字节,不等待pnd,用于中断,无cs, 适用主从
* @parm spi spi句柄
* @parm tx_buf 发送的buf的地址,没有时给NULL
* @parm rx_buf 接收的buf的地址,没有时给NULL
* @parm len:接收或发送的长
* @parm rw :1-rx; 0-tx
* @return null
*/
void spi_buf_transmit_for_isr(hw_spi_dev spi, u8 *tx_buf, u8 *rx_buf, int len, u8 rw);//rw:1-rx; 0-tx
void hw_spix_clear_buf_isr_addr_inc(hw_spi_dev spi);
/*
* @brief spi 配置dma,不等待pnd,用于中断,无cs, 适用主从
* @parm spi spi句柄
* @parm buf 缓冲区基地址
* @parm len 期望长度
* @parm rw 1 接收 / 0 发送
* @return null
*/
void spi_dma_transmit_for_isr(hw_spi_dev spi, void *buf, int len, u8 rw);//rw:1-rx; 0-tx
//返回spi中断状态isr_status:见枚举
enum hw_spi_isr_status hw_spix_get_isr_status(hw_spi_dev spi);
//每包数据前清空,在通信过程中调用,会导致数据长不准
void hw_spix_clear_isr_len(hw_spi_dev spi);
/*返回中断通信数据长度 带符号
* 符号表示dma(-)还是byte(+)
* 数据表示长度
* 结合isr_status可知是接收还是发送 */
int hw_spix_get_isr_len(hw_spi_dev spi);
/* spi从机接口
* spi从机不开中断dma模式
*返回dma通信数据长度(当前已传输个数)
* 符号表示dma(-)
* 数据表示长度
* 不能区分收发*/
int hw_spix_slave_get_dma_len(hw_spi_dev spi);
#endif