EEPROM_24Cxx.h 8.12 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211

#ifndef _EEPROM_24CXX_H_
#define _EEPROM_24CXX_H_

#include "Simulated_IIC_Master.h"

/******************************************************************************
=====================================================
            Supported EEPROM Devices
-----------------------------------------------------
     Device    | Density	| Organization | Page Size
-----------------------------------------------------
 EEPROM_24C01  |  1Kb    |    128  x 8   |    8
 EEPROM_24C02  |  2Kb    |	  256  x 8   |	  8
 EEPROM_24C04  |  4Kb    |	  512  x 8   |    16
 EEPROM_24C08  |  8Kb    |	  1k   x 8   |    16
 EEPROM_24C16  |  16Kb   |	  2k   x 8   |    16
 EEPROM_24C32  |  32Kb   |	  4k   x 8	 |    32
 EEPROM_24C64  |  64Kb   |	  8k   x 8   |    32
 EEPROM_24C128 |  128Kb  |	  16k  x 8   |    64
 EEPROM_24C256 |  256Kb  |	  32k  x 8   |    64
 EEPROM_24C512 |  512Kb  |	  64k  x 8   |    128
 ====================================================
******************************************************************************/

/******************************************************************************
选用的EEPROM
******************************************************************************/
#define   EEPROM_24C16

/******************************************************************************
EEPROM写保护使能
******************************************************************************/
#define   EEPROM_WP_ENABLE                  0

#if       EEPROM_WP_ENABLE
#ifndef     EEPROM_WP
#define   EEPROM_WP
#endif
#endif

/******************************************************************************
EEPROM读写缓冲区大小
******************************************************************************/
#define   EEPROM_BUFFER_SIZE                32

/******************************************************************************
EEPROM参数预定义
******************************************************************************/
#define   EEPROM_DEVICE_ADDR_WR             0xA0
#define   EEPROM_DEVICE_ADDR_RD             0xA1

#if   defined EEPROM_24C01                  /*** 24C01 ***/
#define EEPROM_DATA_ADDR_1_BYTE
#define EEPROM_MAX_DATA_ADDR              0x007F
#define EEPROM_TOTAL_PAGE_NUM             16
#define EEPROM_PAGE_SIZE                  8

#elif defined EEPROM_24C02                  /*** 24C02 ***/
#define EEPROM_DATA_ADDR_1_BYTE
#define EEPROM_MAX_DATA_ADDR              0x00FF
#define EEPROM_TOTAL_PAGE_NUM             32
#define EEPROM_PAGE_SIZE                  8

#elif defined EEPROM_24C04                  /*** 24C04 ***/
#define EEPROM_DATA_ADDR_2_BYTE_MIXED
#define EEPROM_MAX_DATA_ADDR              0x01FF
#define EEPROM_TOTAL_PAGE_NUM             32
#define EEPROM_PAGE_SIZE                  16

#elif defined EEPROM_24C08                  /*** 24C08 ***/
#define EEPROM_DATA_ADDR_2_BYTE_MIXED
#define EEPROM_MAX_DATA_ADDR              0x03FF
#define EEPROM_TOTAL_PAGE_NUM             64
#define EEPROM_PAGE_SIZE                  16

#elif defined EEPROM_24C16                  /*** 24C16 ***/
#define EEPROM_DATA_ADDR_2_BYTE_MIXED
#define EEPROM_MAX_DATA_ADDR              0x07FF
#define EEPROM_TOTAL_PAGE_NUM             128
#define EEPROM_PAGE_SIZE                  16

#elif defined EEPROM_24C32                  /*** 24C32 ***/
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR              0x0FFF
#define EEPROM_TOTAL_PAGE_NUM             128
#define EEPROM_PAGE_SIZE                  32

#elif defined EEPROM_24C64                  /*** 24C64 ***/
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR              0x1FFF
#define EEPROM_TOTAL_PAGE_NUM             256
#define EEPROM_PAGE_SIZE                  32

#elif defined EEPROM_24C128                 /*** 24C128 ***/
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR              0x3FFF
#define EEPROM_TOTAL_PAGE_NUM             256
#define EEPROM_PAGE_SIZE                  64

#elif defined EEPROM_24C256                 /*** 24C256 ***/
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR              0x7FFF
#define EEPROM_TOTAL_PAGE_NUM             512
#define EEPROM_PAGE_SIZE                  64

#elif defined EEPROM_24C512                 /*** 24C512 ***/
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR              0xFFFF
#define EEPROM_TOTAL_PAGE_NUM             512
#define EEPROM_PAGE_SIZE                  128

#else                                       /*** EEPROM未定义 ***/
#error  EEPROM device is undefined

#endif

/******************************************************************************
EEPROM读写过程
******************************************************************************/
#define   EEPROM_IDLE                       0x00
#define   EEPROM_WR                         0x10
#define   EEPROM_RD                         0x20

#define   EEPROM_WR_START                   0x10
#define   EEPROM_WR_ADDR                    0x11
#define   EEPROM_WR_DATA                    0x12
#define   EEPROM_WR_STOP                    0x13

#define   EEPROM_RD_START                   0x20
#define   EEPROM_RD_ADDR1                   0x21
#define   EEPROM_RD_RESTART                 0x22
#define   EEPROM_RD_ADDR2                   0x23
#define   EEPROM_RD_DATA                    0x24
#define   EEPROM_RD_STOP                    0x25

/******************************************************************************
状态列表
******************************************************************************/
/*** 读写错误 ***/
typedef enum
{
  EEPROM_OK = 0,                       //操作成功,没有错误发生
  EEPROM_BUSY,                         //EEPROM忙
  EEPROM_INVALID_DEVICE_ADDR,          //无效的器件地址
  EEPROM_INVALID_DATA_ADDR,            //无效的数据地址
  EEPROM_DATA_LENGTH_ERR,              //错误的数据长度
  EEPROM_NO_RESPONSE,                  //EEPROM没有响应
} EEPROMErrEnum;

/*** 读写过程 ***/
typedef enum
{
  EEPROM_RW_IDLE = 0,                  //空闲状态,允许新数据读写
  EEPROM_RW_REQ,                       //已有数据请求读写
  EEPROM_RW_BUSY,                      //数据读写进行中
} EEPROMRWStateEnum;

/*** 读写结果 ***/
typedef enum
{
  EEPROM_RW_NONE = 0,                  //未发起过读写
  EEPROM_RW_DONE,                      //数据读写完成
  EEPROM_RW_FAIL,                      //数据读写失败
  EEPROM_RW_IN_PROGRESS,               //数据读写中
} EEPROMRWResultEnum;

/******************************************************************************
EEPROM读写控制结构
******************************************************************************/
typedef struct
{
  uint8_t             State;
  uint8_t             Cnt;
  uint8_t             WRAddrLen;
  uint8_t             WRAddr[3];
  uint8_t             WRDataLen;
  uint8_t             WRData[EEPROM_BUFFER_SIZE];
  EEPROMRWStateEnum   WRState;
  EEPROMRWResultEnum  WRResult;
  uint8_t             RDAddrLen;
  uint8_t             RDAddr[3];
  uint8_t             RDDataLen;
  uint8_t             RDData[EEPROM_BUFFER_SIZE];
  EEPROMRWStateEnum   RDState;
  EEPROMRWResultEnum  RDResult;
} EEPROMRWStruct;

/******************************************************************************
函数声明
******************************************************************************/
EEPROMErrEnum EEPROM_Instant_Byte_Write(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t Data);
EEPROMErrEnum EEPROM_Instant_Page_Write(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t *pData, uint8_t Len);
EEPROMErrEnum EEPROM_Byte_Write(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t Data);
EEPROMErrEnum EEPROM_Page_Write(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t *pData, uint8_t Len);
EEPROMRWResultEnum EEPROM_Get_Write_Result(void);
void EEPROM_Write_In(void);

EEPROMErrEnum EEPROM_Instant_Byte_Read(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t *pData);
EEPROMErrEnum EEPROM_Instant_Sequential_Read(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t *pData, uint8_t Len);
EEPROMErrEnum EEPROM_Byte_Read(uint8_t DeviceAddr, uint16_t DataAddr);
EEPROMErrEnum EEPROM_Sequential_Read(uint8_t DeviceAddr, uint16_t DataAddr, uint8_t Len);
EEPROMRWResultEnum EEPROM_Get_Read_Result(void);
uint8_t EEPROM_Get_Read_Out_Byte(void);
void EEPROM_Get_Read_Out(uint8_t *pData, uint8_t Len);
void EEPROM_Read_Out(void);

void EEPROM_Init(void);
void EEPROM_RW_Service(void);

#endif