/******************************************************************************

                  版权所有 (C), 2019-2039, 深圳前海维晟智能技术有限公司

 ******************************************************************************
  文 件 名   : user_spi_master.h
  版 本 号   : 初始版本
  作    者   : QingYang
  生成日期   : 2020年6月12日
  最近修改   :
  功能描述   : user_spi_master.c 的头文件
  函数列表   :
  修改历史   :
  1.日    期   : 2020年6月12日
    作    者   : QingYang
    修改内容   : 创建文件

******************************************************************************/

#ifndef __USER_SPI_MASTER_H__
#define __USER_SPI_MASTER_H__

#define SPI_SEND_BUF_SIZE		128
#define SPI_RECV_BUF_SIZE		128

typedef void (*spi_interrupt_handler)(void *param,uint8_t ch);

typedef struct SPI_PARAM_S
{
	uint32_t 	tx_transmit_stopped;			
	struct{
		uint32_t read_index;			
		uint32_t write_index;				
		volatile uint32_t bytes;					
		uint8_t buf[SPI_SEND_BUF_SIZE + 1];	
	}Send;
	struct{
		uint32_t read_index;				
		uint32_t write_index;			
		volatile uint32_t bytes;				
		uint8_t buf[SPI_RECV_BUF_SIZE + 1];	
	}Recv;
	uint32_t wait;
	uint8_t  init;
    spi_interrupt_handler spi_handler;
} SPI_PARAM;


typedef struct
{
	gpio_pin 	mosi_pin;				
	gpio_pin 	miso_pin;				
	gpio_pin 	clk_pin;					
	gpio_pin 	cs_pin;				

    uint8_t dir;           		// Specifies the SPI unidirectional or bidirectional data mode.
                                        
    uint8_t mode;                // Specifies the SPI operating mode.
                                         
    uint8_t data_size;            // Specifies the SPI data size.
                                         
    uint8_t cpol;                // Specifies the serial clock steady state.
                                         
    uint8_t cpha;                // Specifies the clock active edge for the bit capture.
                                        
    uint8_t nss;                 // Specifies whether the NSS signal is managed by
                                         
    uint32_t prescaler;   		// Specifies the Baud Rate prescaler value which will be
                                                                                   
    uint8_t rx_threshold;

    uint8_t tx_threshold;
}spi_init_config;

typedef struct
{
    spi_interrupt_handler spi_handler;
}user_spi_cfg_parameter_t;


#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* __cplusplus */
extern uint32_t ui_get_spi_fifo_avaiable(ws_dev dev);
extern void reg_spi_rx_callback(ws_dev dev,user_spi_cfg_parameter_t *p_parameter);
extern void set_dev_recv_busy(ws_dev dev,uint8_t busy);
extern void set_spi_init(ws_dev dev);
extern void SPI0_IRQHandler(void);
extern void SPI1_IRQHandler(void);
extern void spi_dev_isr(spi_type_def * spix,SPI_PARAM * spi_param);
extern SPI_PARAM *spi_get_instance(ws_dev dev);
extern void ui_spi_configuration(ws_dev dev,spi_init_config *pconfig,uint32_t on);
extern void ui_spi_init(ws_dev dev);
extern uint8_t ui_spi_readbuf(ws_dev  dev,uint8_t *buf,uint8_t len);
extern void ui_spi_sendchar(ws_dev dev, uint8_t data);
extern void ui_spi_writebuf(ws_dev dev,uint8_t * buf,uint32_t buf_len);
extern uint32_t ui_uart_recvchar(ws_dev dev, uint8_t *ch);
extern void user_spi_config(ws_dev dev,user_spi_cfg_parameter_t *p_parameter);
extern void set_spi_recv_busy(ws_dev dev,uint8_t busy);
extern uint32_t ui_spi_recvchar(ws_dev dev, uint8_t *ch);

uint8_t spi_master_block_read_write(spi_type_def *spix,uint8_t data);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif /* __USER_SPI_MASTER_H__ */
