117 lines
4.1 KiB
C
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
|
|
|