#ifndef __LKS32MC09X_EEPROM_H__
#define __LKS32MC09X_EEPROM_H__

#include "lks32mc09x_reg.h"
#define EEPROM_BAUD_100K   0 ///< EEPROM波特率100K
#define EEPROM_BAUD_400K   1 ///< EEPROM波特率400K
#define EEPROM_BAUD_1M     2 ///< EEPROM波特率1M
#define EEPROM_BAUD_1M2    3 ///< EEPROM波特率1M2

#define EEPROM_ADDR_LEN_8  0 ///< 数据地址长度为8位 影响 EEPROM_Read EEPROM_Write
#define EEPROM_ADDR_LEN_16 1 ///< 数据地址长度位16位 影响 EEPROM_Read EEPROM_Write

/**
 * @brief EEPROM初始化结构体定义
 */
typedef struct
{
    uint32_t addr;          ///< eeprom地址
    uint32_t EEPROM_BAUD_x; ///< 通信波特率选择
    uint32_t RDY_RLS;       ///< 软件等待选择信号，disable读写时不响应中断，使能&失能不影响函数执行效果，使能后读写时可以响应中断
    uint32_t IO_SWITCH;     ///< 通信引脚交换使能
    uint32_t ADDR_LEN_x;    ///< eeprom数据地址长度
} EEPROM_InitTypeDef;
/**
 * @brief 初始化
 * @param EEPROM_InitStruct EEPROM初始化结构体指针
 */
void EEPROM_Init(EEPROM_InitTypeDef *EEPROM_InitStruct);
/**
 * @brief 初始化EEPROM_InitStruct结构体为默认值
 */
void EEPROM_StructInit(EEPROM_InitTypeDef *EEPROM_InitStruct);
/**
 * @brief 初始化为默认配置，IO不交换，波特率100k，地址数据长度16位，读写时响应中断
 */
void EEPROM_InitDefault(void);
/**
 * @brief EEPROM使能
 */
void EEPROM_Enable(void);
/**
 * @brief EEPROM失能
 */
void EEPROM_Disable(void);
/**
 * @brief EEPROM复位
 */
void EEPROM_Reset(void);

/**
 * @brief 读取eeprom内数据
 * @param eeprom_addr eeprom数据地址
 * @return 数据
 */
uint8_t EEPROM_Read(uint16_t eeprom_addr);
/**
 * @brief 向eeprom写入数据
 * @param eeprom_addr eeprom数据地址
 * @param data 要写入的数据
 */
void EEPROM_Write(uint16_t eeprom_addr, uint8_t data);
/**
 * @brief 向eeprom写入数据(多字节)，09上eeprom本身不支持多字节模式，这里用n个单次读写实现，执行时间为len*5mS（典型值）
 * @param eepromaddr eeprom模块设备地址，例如0xa0
 * @param taddr eeprom数据的起始地址
 * @param data 要写入的数据地址
 * @param len 要写入的长度
 */
void EEPROM_WriteData(uint8_t eepromaddr, u16 taddr, u8 *data, uint32_t len);
/**
 * @brief 读取eeprom内数据，09上eeprom本身不支持多字节模式，这里用n个单次读写实现
 * @param eepromaddr eeprom模块设备地址，例如0xa0
 * @param taddr eeprom数据的起始地址
 * @param data 存放数据的地址
 * @param len 数据长度
 */
void EEPROM_ReadData(uint8_t eepromaddr, u16 taddr, u8 *data, uint32_t len);

#endif
