#ifndef ____HDL_CS5552_H_
#define ____HDL_CS5552_H_

#include "hc32_ll.h"
#include "hdl_clk.h"

#define 	CS5552_SPI				CM_SPI1
#define 	CS5552_SPI_CLK			FCG1_PERIPH_SPI1

#define 	CS5552_CS_PORT			GPIO_PORT_A
#define 	CS5552_CS_PIN			GPIO_PIN_04
#define 	CS5552_CS_FUNC			GPIO_FUNC_42

#define 	CS5552_SCLK_PORT		GPIO_PORT_A
#define 	CS5552_SCLK_PIN			GPIO_PIN_07
#define 	CS5552_SCLK_FUNC		GPIO_FUNC_43

#define 	CS5552_MISO_PORT		GPIO_PORT_A
#define 	CS5552_MISO_PIN			GPIO_PIN_06
#define 	CS5552_MISO_FUNC		GPIO_FUNC_41

#define 	CS5552_MOSI_PORT		GPIO_PORT_A
#define 	CS5552_MOSI_PIN			GPIO_PIN_05
#define 	CS5552_MOSI_FUNC		GPIO_FUNC_40

#define		SET_CS5552_CS()			GPIO_SetPins(CS5552_CS_PORT, CS5552_CS_PIN)
#define		CLR_CS5552_CS()			GPIO_ResetPins(CS5552_CS_PORT, CS5552_CS_PIN)

#define		SET_CS5552_DOUT()		GPIO_SetPins(CS5552_MISO_PORT, CS5552_MISO_PIN)
#define		CLR_CS5552_DOUT()		GPIO_ResetPins(CS5552_MISO_PORT, CS5552_MISO_PIN)
#define		GET_CS5552_DOUT()		GPIO_ReadInputPins(CS5552_MISO_PORT, CS5552_MISO_PIN)

#define		SET_CS5552_DIN()		GPIO_SetPins(CS5552_MOSI_PORT, CS5552_MOSI_PIN)
#define		CLR_CS5552_DIN()		GPIO_ResetPins(CS5552_MOSI_PORT, CS5552_MOSI_PIN)

#define		SET_CS5552_SCLK()		GPIO_SetPins(CS5552_SCLK_PORT, CS5552_SCLK_PIN)
#define		CLR_CS5552_SCLK()		GPIO_ResetPins(CS5552_SCLK_PORT, CS5552_SCLK_PIN)

#define	OS_CH0_R			0x05
#define	OS_CH0_W			0x00

#define	GAIN_CH0_R			0x0C
#define	GAIN_CH0_W			0x09

#define	OS_CH1_R			0x14
#define	OS_CH1_W			0x11

#define	GAIN_CH1_R			0x1D
#define	GAIN_CH1_W			0x18

#define	CONV_CONF0_R		0x24
#define	CONV_CONF0_W		0x21

#define	CONV_CONF1_R		0x2D
#define	CONV_CONF1_W		0x28

#define	SYS_CONF0_R			0x35
#define	SYS_CONF0_W			0x30

#define	SYS_CONF1_R			0x3C
#define	SYS_CONF1_W			0x39

#define	SYS_CONF2_R			0x44
#define	SYS_CONF2_W			0x41

#define CONV_DATA_R			0x55

#define CONV_CH0			0x81
#define	CONV_CH1			0x90

#define SELF_OFFSET_CH0		0x84
#define	SELF_OFFSET_CH1		0x95

#define SYS_OFFSET_CH0		0x8B
#define SYS_OFFSET_CH1		0x9A

#define OFFSET_CNT			9

typedef enum
{
	CS5552_IDLE,
	CS5552_OFFSET,
	CS5552_OFFSET_READ,
	CS5552_START,
	CS5552_READ
}en_cs5552_step;

typedef enum
{
	CS5552_CH0,
	CS5552_CH1,
}en_cs5552_ch;

typedef struct
{
	en_cs5552_step step;	//流程
	en_cs5552_ch channel_sta;	//当前转换通道
	int32_t buf[2];			//通道数据
	uint32_t offset_ch0[OFFSET_CNT];	//通道0校准值
	uint32_t offset_ch1[OFFSET_CNT];	//通道1校准值
}stc_cs5552_t;

void hdl_cs5552_init(void);
uint32_t hdl_cs5552_reg_read(uint8_t cmd);

void hdl_cs5552_value_get(int32_t *buf);
void hdl_cs5552_conv_start(void);
void hdl_cs5552_proc(void);

#endif
