/**
 *@file    sr_spi.h
 *@brief   SPI抽象接口头文件
 *@details 提供SPI相关枚举、结构体、函数声明
 *@copyright Copyright (c) 2024 lierda. All rights reserved.
 *@author  Lierda-RDC
 *@date    2024-06-11
 *@example ZhaoyangSDK\example\pal\hal\spi_example.c
 */

#ifndef _SR_SPI_H
#define _SR_SPI_H

#include "sr_config.h"

#ifdef SR_USE_SPI  //使用SPI
#include "sr_device.h"

typedef struct SR_SPI_CFG SR_SPI_CFG_T;
typedef struct SR_SPI_DEV SR_SPI_DEV_T;

#include "sr_bsp_spi.h"

//配置参数宏定义
/** @defgroup SPI_MODE SPI模式
  * @{
  */
#define SR_SPI_MASTER       BSP_SPI_MASTER   /*!< 主机*/
#define SR_SPI_SLAVE        BSP_SPI_SLAVE    /*!< 从机*/
/**
  * @}
  */

/** @defgroup SPI_CPOL SPI时钟极性
  * @{
  */
#define SR_SPI_CPOL_LOW     BSP_SPI_CPOL_LOW     /*!< 空闲状态是低电平*/  
#define SR_SPI_CPOL_HIGH    BSP_SPI_CPOL_HIGH    /*!< 空闲状态是高电平*/  
/**
  * @}
  */

/** @defgroup SPI_CPHA SPI时钟相位
  * @{
  */
#define SR_SPI_CPHA_1EDGE   BSP_SPI_CPHA_1EDGE   /*!< 奇数边沿采样*/            
#define SR_SPI_CPHA_2EDGE   BSP_SPI_CPHA_2EDGE   /*!< 偶数边沿采样*/ 
/**
  * @}
  */

/** @defgroup SPI_BIT_ORDER  SPI bit位序
  * @{
  */
#define SR_SPI_MSB    BSP_SPI_MSB     /*!< MSB优先*/
#define SR_SPI_LSB    BSP_SPI_LSB     /*!< LSB优先*/
/**
  * @}
  */

/** @defgroup SPI_DATA_WIDTH SPI数据宽度
  * @{
  */
#define SR_SPI_DW_8BIT      BSP_SPI_DW_8BIT   /*!< 8bit*/
#define SR_SPI_DW_16BIT     BSP_SPI_DW_16BIT  /*!< 16bit*/


/** @defgroup SPI_CS_POL SPI cs有效极性
  * @{
  */
#define SR_SPI_CS_LOW     0     /*!< 片选拉低有效*/  
#define SR_SPI_CS_HIGH    1     /*!< 片选拉高有效*/  
/**
  * @}
  */


/** @defgroup SPI_CS_CTRL SPI cs引脚控制
  * @{
  */
#define SR_SPI_CS_SEL     (1<<0)    /*!< 传输数据前，设置CS为有效状态*/  
#define SR_SPI_CS_RLS     (1<<1)    /*!< 传输结束后，释放CS*/  
/**
  * @}
  */


/** @defgroup SPI_BRPRES   SPI 波特率预分频值
  * @{
  */

#define  SR_SPI_BRPRES_2     BSP_SPI_BRPRES_2     
#define  SR_SPI_BRPRES_4     BSP_SPI_BRPRES_4     
#define  SR_SPI_BRPRES_8     BSP_SPI_BRPRES_8     
#define  SR_SPI_BRPRES_16    BSP_SPI_BRPRES_16    
#define  SR_SPI_BRPRES_32    BSP_SPI_BRPRES_32    
#define  SR_SPI_BRPRES_64    BSP_SPI_BRPRES_64    
#define  SR_SPI_BRPRES_128   BSP_SPI_BRPRES_128   
#define  SR_SPI_BRPRES_256   BSP_SPI_BRPRES_256   
/**
  * @}
  */



/**
 * @brief SPI配置结构体
 */
struct SR_SPI_CFG
{
  uint32_t mode;     /*!< 主从模式，可取值@ref SPI_MODE */
  uint32_t cpol;     /*!< 时钟极性，可取值@ref SPI_CPOL */
  uint32_t cpha;     /*!< 时钟相位，可取值@ref SPI_CPHA */
  //uint32_t speed;      /*!< 从设备支持的最大速率 ，弃用*/
  uint32_t bdPrescaler;  /*!< 波特率预分频值，可取值@ref SPI_BRPRES */
  uint32_t order;    /*!< bit位序，可取值@ref SPI_BIT_ORDER*/
  uint32_t dw;       /*!< 数据宽度，可取值@ref SPI_DATA_WIDTH*/
  int csId;          /*!< 片选引脚id */  
  uint8_t  csPol;    /*!< 片选引脚极性，可取值@ref SPI_CS_POL*/
};


/**
 * @brief SPI设备结构体
 */
struct SR_SPI_DEV
{
  SR_DEVICE_T parent; /*!< 继承设备公共父类 */
  int csId;           /*!< SPI片选引脚id */ 
  uint8_t csPol;      /*!< SPI片选引脚极性*/ 

};



/*--------------------------------抽象接口------------------------------*/

/**
 * @brief 打开SPI设备
 *
 * @param[in] spiId 指定的SPI设备ID，SR_SPI_ID_E类型
 *
 * @return 成功返回SR_DEV_T *类型SPI设备指针，失败返回SR_NULL
 */
#define SR_HalSpiOpen(spiId) BspSpiOpen(spiId)


/**
 * @brief 关闭SPI设备
 *
 * @param[in] dev SPI设备的指针，SR_DEV_T *类型
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalSpiClose(dev) BspSpiClose(dev)


/**
 * @brief 配置SPI设备参数
 *
 * @param[in] dev      SPI设备的指针，SR_DEV_T *类型
 * @param[in] spiCfg   配置参数结构体，SR_SPI_CFG_T类型
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalSpiConfig(dev, spiCfg) BspSpiConfig(dev, spiCfg)

/**
 * @brief SPI读写
 *
 * @param[in]  dev     SPI设备指针，SR_DEV_T *类型
 * @param[in]  txBuf   发送数据缓冲区指针
 * @param[out] rxBuf   接收数据缓冲区指针
 * @param[in]  len     发送/接收 数据字节数
 * @param[in]  csCtrl  片选脚控制，可选值@ref SPI_CS_CTRL，可进行或操作
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalSpiWriteRead(dev,txBuf,rxBuf,len,csCtrl)   BspSpiWriteRead(dev,txBuf,rxBuf,len,csCtrl)

/**
 * @brief SPI读寄存器
 *
 * @param[in]  dev     SPI设备指针，SR_DEV_T *类型
 * @param[in]  reg     待读取寄存器地址
 * @param[in]  regLen  寄存器长度
 * @param[out] buff    存储读取到的数据的缓冲区指针
 * @param[in]  buffLen 数据长度
 *
 * @return 成功返回0，失败返回负值错误码
 */
#define SR_HalSpiReadReg(dev, reg, regLen, buff, buffLen) BspSpiReadReg(dev, reg, regLen, buff, buffLen)


/**
 * @brief SPI写寄存器
 *
 * @param[in] dev     SPI设备指针，SR_DEV_T *类型
 * @param[in] reg     寄存器地址。
 * @param[in] regLen  寄存器长度
 * @param[in] buff    数据缓冲区。
 * @param[in] buffLen 数据长度。
 *
 * @return 成功返回0，发生错误则返回负数错误码。
 */
#define SR_HalSpiWriteReg(dev,reg, regLen,buff, buffLen) BspSpiWriteReg(dev, reg, regLen, buff, buffLen)

#endif 

#endif
