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
#ifndef _EEPROM_24CXX_H_
#define _EEPROM_24CXX_H_
#include "r_typedefs.h"
#include "RTE_GPIO.h"
#define EEPROM_24C16
#define EEPROM_WP_ENABLE 0
#if EEPROM_WP_ENABLE
#ifndef EEPROM_WP
#define EEPROM_WP
#endif
#endif
#define EEPROM_BUFFER_SIZE 32
#define EEPROM_DEVICE_ADDR_WR 0xA0
#define EEPROM_DEVICE_ADDR_RD 0xA1
#if defined EEPROM_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
#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
#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
#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
#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
#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
#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
#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
#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
#define EEPROM_DATA_ADDR_2_BYTE
#define EEPROM_MAX_DATA_ADDR 0xFFFF
#define EEPROM_TOTAL_PAGE_NUM 512
#define EEPROM_PAGE_SIZE 128
#else
#error EEPROM device is undefined
#endif
#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_INVALID_DEVICE_ADDR,
EEPROM_INVALID_DATA_ADDR,
EEPROM_DATA_LENGTH_ERR,
EEPROM_NO_RESPONSE,
}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;
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;
extern EEPROMRWStruct EEPROMRW;
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_Instant_Page_Write_Repeatedly(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