#ifndef __LKS32MC09X_I2C_H__
#define __LKS32MC09X_I2C_H__

#include "lks32mc09x_reg.h"

// I2C总线状态宏定义
#define I2C_BUS_STATE_STT_ERR   BIT7 ///< 总线错误
#define I2C_BUS_STATE_LOST_ARB  BIT6 ///< 总线仲裁丢失
#define I2C_BUS_STATE_STOP_EVT  BIT5 ///< STOP事件记录
#define I2C_BUS_STATE_ADDR_DATA BIT3 ///< 正在传输地址数据
#define I2C_BUS_STATE_RX_ACK    BIT1 ///< 接收到ACK响应
#define I2C_BUS_STATE_Done      BIT0 ///< 传输完成

// I2C中断标志宏定义
#define I2C_IF_TC       0 ///< 传输完成中断
#define I2C_IF_BUS_ERR  1 ///< 总线错误中断
#define I2C_IF_STOP     2 ///< STOP事件中断
#define I2C_IF_NACK     3 ///< NACK事件中断
#define I2C_IF_ADDR_CMP 4 ///< 硬件地址匹配中断

// I2C初始化结构体定义
typedef struct
{
    uint32_t ADRCMP;         ///< I2C 硬件地址比较使能开关
    uint32_t ADDR;           ///< 从模式下，本节点的从机地址
    uint32_t MST_MODE;       ///< I2C 主模式使能信号
    uint32_t SLV_MODE;       ///< I2C 从模式使能信号
    uint32_t BUSRT_EN;       ///< I2C DMA传输使能
    uint32_t BaudRate;       ///< I2C 波特率
    uint32_t IE;             ///< I2C 中断使能信号
    uint32_t TC_IE;          ///< I2C 数据传输完成中断使能
    uint32_t BUS_ERR_IE;     ///< I2C 总线错误事件中断使能信号
    uint32_t STOP_IE;        ///< I2C STOP 事件中断使能信号
    uint32_t BURST_NACK;     ///< NACK 事件中断使能
    uint32_t BURST_ADDR_CMP; ///< 硬件地址匹配中断使能
} I2C_InitTypeDef;

// 函数声明

/**
 * @brief I2C初始化
 * @param I2Cx: I2C外设指针
 * @param I2C_InitStruct: I2C初始化结构体指针
 */
void I2C_Init(I2C_TypeDef *I2Cx, I2C_InitTypeDef *I2C_InitStruct);

/**
 * @brief I2C配置结构体初始化
 * @param I2C_InitStruct: I2C初始化结构体指针
 */
void I2C_StructInit(I2C_InitTypeDef *I2C_InitStruct);

/**
 * @brief 清除I2C中断标志
 * @param I2Cx: I2C外设指针
 * @param I2C_IF_x: 要清除的中断标志
 */
void I2C_ClearIRQFlag(I2C_TypeDef *I2Cx, uint16_t I2C_IF_x);

/**
 * @brief 获取I2C中断标志状态
 * @param I2Cx: I2C外设指针
 * @param I2C_IF_x: 要获取的中断标志
 * @return 中断标志状态
 */
uint8_t I2C_GetIRQFlag(I2C_TypeDef *I2Cx, uint16_t I2C_IF_x);

/**
 * @brief 获取I2C状态标志
 * @param I2Cx: I2C外设指针
 * @param I2C_IF_x: 要获取的状态标志
 * @return 状态标志状态
 */
uint8_t I2C_GetFlag(I2C_TypeDef *I2Cx, uint16_t I2C_IF_x);

/**
 * @brief 使能I2C外设
 * @param I2Cx: I2C外设指针
 */
void I2C_Enable(I2C_TypeDef *I2Cx);

/**
 * @brief 禁用I2C外设
 * @param I2Cx: I2C外设指针
 */
void I2C_Disable(I2C_TypeDef *I2Cx);

/**
 * @brief 设置I2C波特率
 * @param BaudRate: 波特率值
 */
void I2C_SetBaudRate(I2C_TypeDef *I2Cx, uint32_t BaudRate);

/**
 * @brief 读取I2C总线状态
 * @param I2Cx: I2C外设指针
 * @param state: 要读取的状态位
 * @return 状态位值
 */
uint8_t I2c_ReadBusState(I2C_TypeDef *I2Cx, uint16_t state);

/**
 * @brief 清除I2C总线状态
 * @param I2Cx: I2C外设指针
 * @param state: 要清除的状态位
 */
void I2c_ClearBusState(I2C_TypeDef *I2Cx, uint16_t state);

/**
 * @brief 发送数据到I2C总线
 * @param I2Cx: I2C外设指针
 * @param n: 要发送的数据
 */
void I2C_SendData(I2C_TypeDef *I2Cx, uint8_t n);

/**
 * @brief 从I2C总线读取数据
 * @param I2Cx: I2C外设指针
 * @return 读取到的数据
 */
uint8_t I2C_ReadData(I2C_TypeDef *I2Cx);

/**
 * @brief 向从机发送数据 （需要在中断里执行I2C_TableIrq）
 * @param I2Cx I2C外设指针
 * @param taddr 从机地址
 * @param data 数据指针
 * @param len 数据长度
 * @return 状态，0成功 1失败（i2c总线非空闲，或上一次数据尚未发送完毕）
 */
int I2C_TableSend(I2C_TypeDef *I2Cx, u8 taddr, u8 *data, u8 len);

/**
 * @brief 向从机读取数据 （需要在中断里执行I2C_TableIrq）
 * @param I2Cx I2C外设指针
 * @param taddr 从机地址
 * @param data 数据指针
 * @param len 数据长度
 * @return 状态，0成功 1失败（i2c总线非空闲，或上一次数据尚未发送完毕）
 */
int I2C_TableRead(I2C_TypeDef *I2Cx, u8 taddr, u8 *data, u8 len);
/**
 * @brief 获取I2C_Table发送状态
 * @return 状态，0空闲 1正在发送或接收数据
 */
int I2C_TableState(I2C_TypeDef *I2Cx);
/**
 * @brief 获取I2C_Table发送后的ack电平
 * @return 收到的ACK电平
 */
int I2C_TableAck(I2C_TypeDef *I2Cx);
/**
 * @brief I2C_SendTable和I2C_ReadTable对应的中断处理函数
 */
void I2C_TableIrq(I2C_TypeDef *I2Cx);
#endif // __LKS32MC09X_I2C_H__
