#ifndef __CSIH_H__
#define __CSIH_H__

#include "r_typedefs.h"

typedef struct stc_cpg_mfsn_csih_ctl0_field{
    uint8_t		CSIHnMBS:1;
    uint8_t               CSIHnJOBE:1;
    uint8_t		:3;
    uint8_t		CSIHnRXE:1;
    uint8_t		CSIHnTXE:1;
    uint8_t		CSIHnPWR:1;            
}stc_cpg_mfsn_csih_ctl0_field_t;

typedef union un_cpg_mfsn_csih_ctl0{
    uint8_t		u8Register;
    stc_cpg_mfsn_csih_ctl0_field_t    stcField;
}un_cpg_mfsn_csih_ctl0_t;


typedef struct stc_cpg_mfsn_csih_ctl1_field{
    uint32_t		CSIHnSSE:1;
    uint32_t		CSIHnHSE:1;
    uint32_t		CSIHnSIT:1;
    uint32_t		CSIHnLBM:1;
    uint32_t		CSIHnCSRI:1;
    uint32_t		CSIHnDCS:1;
    uint32_t		CSIHnJE:1;
    uint32_t		CSIHnEDLE:1;
    uint32_t		CSIHnCSLx:8;
    uint32_t		CSIHnSLIT:1;
    uint32_t		CSIHnCKR:1;
    uint32_t		CSIHnPHE:1;
    uint32_t		:5;
    uint32_t		CSIHnSLRS:1;
    uint32_t		:7;          
}stc_cpg_mfsn_csih_ctl1_field_t;

typedef union un_cpg_mfsn_csih_ctl1{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_ctl1_field_t    stcField;
}un_cpg_mfsn_csih_ctl1_t;


typedef struct stc_cpg_mfsn_csih_ctl2_field{
    uint16_t		CSIHnBRS:12;
    uint16_t		:1;
    uint16_t		CSIHnPRS:3;   
}stc_cpg_mfsn_csih_ctl2_field_t;

typedef union un_cpg_mfsn_csih_ctl2{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_ctl2_field_t    stcField;
}un_cpg_mfsn_csih_ctl2_t;


typedef struct stc_cpg_mfsn_csih_str0_field{
    uint32_t		CSIHnOVE:1;
    uint32_t		CSIHnPE:1;
    uint32_t		:1;
    uint32_t		CSIHnDCE:1;
    uint32_t		CSIHnEMF:1;
    uint32_t		CSIHnFLF:1;
    uint32_t		:1;
    uint32_t		CSIHnTSF:1;
    uint32_t		CSIHnHPST:1;
    uint32_t		:5;
    uint32_t		CSIHnOFE:1;
    uint32_t		CSIHnTMOE:1;
    uint32_t		CSIHnSPF:8;
    uint32_t		CSIHnSRP:8;
}stc_cpg_mfsn_csih_str0_field_t;

typedef union un_cpg_mfsn_csih_str0{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_str0_field_t    stcField;
}un_cpg_mfsn_csih_str0_t;


typedef struct stc_cpg_mfsn_csih_stcr0_field{
    uint16_t		CSIHnOVEC:1;
    uint16_t		CSIHnPEC:1;
    uint16_t		:1;
    uint16_t		CSIHnDCEC:1;
    uint16_t		:4;
    uint16_t		CSIHnPCT:1;
    uint16_t		:5;
    uint16_t		CSIHnOFEC:1;
    uint16_t		CSIHnTMOEC:1;
}stc_cpg_mfsn_csih_stcr0_field_t;

typedef union un_cpg_mfsn_csih_stcr0{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_stcr0_field_t    stcField;
}un_cpg_mfsn_csih_stcr0_t;


typedef struct stc_cpg_mfsn_csih_mctl0_field{
    uint16_t		CSIHnTO:5;
    uint16_t		:3;
    uint16_t		CSIHnMMS:2;
    uint16_t		:6;
}stc_cpg_mfsn_csih_mctl0_field_t;

typedef union un_cpg_mfsn_csih_mctl0{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_mctl0_field_t    stcField;
}un_cpg_mfsn_csih_mctl0_t;


typedef struct stc_cpg_mfsn_csih_mctl1_field{
    uint32_t		CSIHnFFS:7;
    uint32_t		:9;
    uint32_t		CSIHnFES:7;
    uint32_t		:9;
}stc_cpg_mfsn_csih_mctl1_field_t;

typedef union un_cpg_mfsn_csih_mctl1{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_mctl1_field_t    stcField;
}un_cpg_mfsn_csih_mctl1_t;


typedef struct stc_cpg_mfsn_csih_mctl2_field{
    uint32_t		CSIHnSOP:7;
    uint32_t		:9;
    uint32_t		CSIHnND:8;
    uint32_t		:7;
    uint32_t		CSIHnBTST:1;
}stc_cpg_mfsn_csih_mctl2_field_t;

typedef union un_cpg_mfsn_csih_mctl2{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_mctl2_field_t    stcField;
}un_cpg_mfsn_csih_mctl2_t;


typedef struct stc_cpg_mfsn_csih_mrwp0_field{
    uint32_t		CSIHnTRWA:7;
    uint32_t		:9;
    uint32_t		CSIHnRRA:7;
    uint32_t		:9;
}stc_cpg_mfsn_csih_mrwp0_field_t;

typedef union un_cpg_mfsn_csih_mrwp0{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_mrwp0_field_t    stcField;
}un_cpg_mfsn_csih_mrwp0_t;


typedef struct stc_cpg_mfsn_csih_cfg0_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;    
}stc_cpg_mfsn_csih_cfg0_field_t;

typedef union un_cpg_mfsn_csih_cfg0{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg0_field_t    stcField;
}un_cpg_mfsn_csih_cfg0_t;


typedef struct stc_cpg_mfsn_csih_cfg1_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;   
}stc_cpg_mfsn_csih_cfg1_field_t;

typedef union un_cpg_mfsn_csih_cfg1{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg1_field_t    stcField;
}un_cpg_mfsn_csih_cfg1_t;


typedef struct stc_cpg_mfsn_csih_cfg2_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;    
}stc_cpg_mfsn_csih_cfg2_field_t;

typedef union un_cpg_mfsn_csih_cfg2{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg2_field_t    stcField;
}un_cpg_mfsn_csih_cfg2_t;


typedef struct stc_cpg_mfsn_csih_cfg3_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;   
}stc_cpg_mfsn_csih_cfg3_field_t;

typedef union un_cpg_mfsn_csih_cfg3{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg3_field_t    stcField;
}un_cpg_mfsn_csih_cfg3_t;


typedef struct stc_cpg_mfsn_csih_cfg4_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;  
}stc_cpg_mfsn_csih_cfg4_field_t;

typedef union un_cpg_mfsn_csih_cfg4{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg4_field_t    stcField;
}un_cpg_mfsn_csih_cfg4_t;


typedef struct stc_cpg_mfsn_csih_cfg5_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;    
}stc_cpg_mfsn_csih_cfg5_field_t;

typedef union un_cpg_mfsn_csih_cfg5{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg5_field_t    stcField;
}un_cpg_mfsn_csih_cfg5_t;


typedef struct stc_cpg_mfsn_csih_cfg6_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;   
}stc_cpg_mfsn_csih_cfg6_field_t;

typedef union un_cpg_mfsn_csih_cfg6{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg6_field_t    stcField;
}un_cpg_mfsn_csih_cfg6_t;


typedef struct stc_cpg_mfsn_csih_cfg7_field{
    uint32_t		CSIHnSPx:4;
    uint32_t		CSIHnINx:4;
    uint32_t		CSIHnHDx:4;
    uint32_t		CSIHnIDx:3;
    uint32_t		CSIHnIDLx:1;
    uint32_t		CSIHnDAPx:1;
    uint32_t		CSIHnCKPx:1;
    uint32_t		CSIHnDIRx:1;
    uint32_t		CSIHnRCBx:1;
    uint32_t		:4;
    uint32_t		CSIHnDLSx:4;
    uint32_t		CSIHnPSx:2;
    uint32_t		PSCLxOBRSSx:2;    
}stc_cpg_mfsn_csih_cfg7_field_t;

typedef union un_cpg_mfsn_csih_cfg7{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_cfg7_field_t    stcField;
}un_cpg_mfsn_csih_cfg7_t;


typedef struct stc_cpg_mfsn_csih_tx0w_field{
    uint32_t		CSIHnTX:16;
    uint32_t		CSIHnCS:8;
    uint32_t		:5;
    uint32_t		CSIHnEDL:1;
    uint32_t		CSIHnEOJ:1;
    uint32_t		CSIHnCIRE:1;   
}stc_cpg_mfsn_csih_tx0w_field_t;

typedef union un_cpg_mfsn_csih_tx0w{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_tx0w_field_t    stcField;
}un_cpg_mfsn_csih_tx0w_t;


typedef struct stc_cpg_mfsn_csih_tx0h_field{
    uint16_t		CSIHnTX:16;
}stc_cpg_mfsn_csih_tx0h_field_t;

typedef union un_cpg_mfsn_csih_tx0h{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_tx0h_field_t    stcField;
}un_cpg_mfsn_csih_tx0h_t;


typedef struct stc_cpg_mfsn_csih_rx0w_field{
    uint32_t		CSIHnRX:16;
    uint32_t		CSIHnCSx:8;
    uint32_t		CSIHnTDCE:1;
    uint32_t		CSIHnRPE:1;
    uint32_t		:6;  
}stc_cpg_mfsn_csih_rx0w_field_t;

typedef union un_cpg_mfsn_csih_rx0w{
    uint32_t		u32Register;
    stc_cpg_mfsn_csih_rx0w_field_t    stcField;
}un_cpg_mfsn_csih_rx0w_t;


typedef struct stc_cpg_mfsn_csih_rx0h_field{
    uint16_t		CSIHnRX:16;
}stc_cpg_mfsn_csih_rx0h_field_t;

typedef union un_cpg_mfsn_csih_rx0h{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_rx0h_field_t    stcField;
}un_cpg_mfsn_csih_rx0h_t;


typedef struct stc_cpg_mfsn_csih_emu_field{
    uint8_t		:7;
    uint8_t		CSIHnSVSDIS:1;
}stc_cpg_mfsn_csih_emu_field_t;

typedef union un_cpg_mfsn_csih_emu{
    uint8_t		u8Register;
    stc_cpg_mfsn_csih_emu_field_t    stcField;
}un_cpg_mfsn_csih_emu_t;


typedef struct stc_cpg_mfsn_csih_brs0_field{
    uint16_t		CSIHnBRS:12;
    uint16_t		:4;
}stc_cpg_mfsn_csih_brs0_field_t;

typedef union un_cpg_mfsn_csih_brs0{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_brs0_field_t    stcField;
}un_cpg_mfsn_csih_brs0_t;


typedef struct stc_cpg_mfsn_csih_brs1_field{
    uint16_t		CSIHnBRS:12;
    uint16_t		:4;
}stc_cpg_mfsn_csih_brs1_field_t;

typedef union un_cpg_mfsn_csih_brs1{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_brs1_field_t    stcField;
}un_cpg_mfsn_csih_brs1_t;


typedef struct stc_cpg_mfsn_csih_brs2_field{
    uint16_t		CSIHnBRS:12;
    uint16_t		:4;
}stc_cpg_mfsn_csih_brs2_field_t;

typedef union un_cpg_mfsn_csih_brs2{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_brs2_field_t    stcField;
}un_cpg_mfsn_csih_brs2_t;


typedef struct stc_cpg_mfsn_csih_brs3_field{
    uint16_t		CSIHnBRS:12;
    uint16_t		:4;
}stc_cpg_mfsn_csih_brs3_field_t;

typedef union un_cpg_mfsn_csih_brs3{
    uint16_t		u16Register;
    stc_cpg_mfsn_csih_brs3_field_t    stcField;
}un_cpg_mfsn_csih_brs3_t;


typedef struct stc_cpg_mfsn_csih{
    un_cpg_mfsn_csih_ctl0_t    unCTL0;
    uint8_t Reserved0[3];
    un_cpg_mfsn_csih_str0_t    unSTR0;
    un_cpg_mfsn_csih_stcr0_t   unSTCR0;
    uint8_t Reserved1[6];
    un_cpg_mfsn_csih_ctl1_t    unCTL1;
    un_cpg_mfsn_csih_ctl2_t    unCTL2;
    uint8_t Reserved2[2];
    un_cpg_mfsn_csih_emu_t     unEMU;
    uint8_t Reserved3[4071];
    un_cpg_mfsn_csih_mctl1_t   unMCTL1;
    un_cpg_mfsn_csih_mctl2_t   unMCTL2;
    un_cpg_mfsn_csih_tx0w_t    unTX0W;
    un_cpg_mfsn_csih_tx0h_t    unTX0H;
    uint8_t Reserved4[2];
    un_cpg_mfsn_csih_rx0w_t    unRX0W;
    un_cpg_mfsn_csih_rx0h_t    unRX0H;
    uint8_t Reserved5[2];
    un_cpg_mfsn_csih_mrwp0_t   unMRWP0;
    uint8_t Reserved6[36];
    un_cpg_mfsn_csih_mctl0_t   unMCTL0;
    uint8_t Reserved7[2];
    un_cpg_mfsn_csih_cfg0_t    unCFG0;
    un_cpg_mfsn_csih_cfg1_t    unCFG1;
    un_cpg_mfsn_csih_cfg2_t    unCFG2;
    un_cpg_mfsn_csih_cfg3_t    unCFG3;
    un_cpg_mfsn_csih_cfg4_t    unCFG4;
    un_cpg_mfsn_csih_cfg5_t    unCFG5;
    un_cpg_mfsn_csih_cfg6_t    unCFG6;
    un_cpg_mfsn_csih_cfg7_t    unCFG7;
    uint8_t Reserved8[4];
    un_cpg_mfsn_csih_brs0_t    unBRS0;
    uint8_t Reserved9[2];
    un_cpg_mfsn_csih_brs1_t    unBRS1;
    uint8_t Reserved10[2];
    un_cpg_mfsn_csih_brs2_t    unBRS2;
    uint8_t Reserved11[2];
    un_cpg_mfsn_csih_brs3_t    unBRS3;
}stc_cpg_mfsn_csih_t;


volatile static stc_cpg_mfsn_csih_t* const CSIH[2] =
{
    (volatile stc_cpg_mfsn_csih_t*)(0xFFDA8000U),          /*  MFS 通道0   */
    (volatile stc_cpg_mfsn_csih_t*)(0xFFDAA000U),          /*  MFS 通道1   */   
};


typedef enum
{
    CSIH_SCKH_Rising = 0,  /*  在时钟信号空闲时,为高电平, 上升沿取数  */
    CSIH_SCKH_Falling,     /*  在时钟信号空闲时,为高电平, 下降沿取数  */
    CSIH_SCKL_Rising,      /*  在时钟信号空闲时,为低电平, 上升沿取数  */
    CSIH_SCKL_Falling,     /*  在时钟信号空闲时,为低电平, 下降沿取数  */
}CSIH_SCK_Edge;


typedef enum
{
    CSIH_DAT_LSbit = 0,    /*  低位先发出去  */
    CSIH_DAT_MSbit,        /*  高位先发出去  */
}CSIH_DAT_FORMAT;


typedef enum
{
    CSIH_OptSt_OK = 0,      /*  操作完成  */
    CSIH_OptSt_BUSY,        /*  当前忙  */
}CSIH_OptSt;



static void CSIH_CPU_SleepIdle(void);
extern void CSIH_Init(uint8_t channel, 
	                  uint16_t baud,
		              uint8_t bitnum,
                      CSIH_SCK_Edge sck_edge, 
                      CSIH_DAT_FORMAT dat_format
                      );
static CSIH_OptSt CSIH_IsSendBusy(uint8_t channel);
static void CSIH_WaitForSendReady(uint8_t channel);
extern CSIH_OptSt CSIH_SendData_12bit8th(uint8_t channel, uint16_t* pdat);
extern CSIH_OptSt CSIH_SendData_9bit1th(uint8_t channel, uint16_t* pdat);

extern void CSIH_Ch0_Rx_ISR(void);
extern void CSIH_Ch1_Rx_ISR(void);
extern void CSIH_Ch0_Tx_ISR(void);
extern void CSIH_Ch1_Tx_ISR(void);

#endif