📄 eeprom.lst
字号:
1: #include <pic.h>
2: #include "Pindefine.h"
3: #include "variable.h"
4: #define Nop() asm("nop")
5: #define SDAMODE TRISB7
6: #define FM24C16addr 0xa0
7: #define FM24C16addr2 0xa8
8: #define DZSUM 6
9: #define TRUE 1
10: #define FALSE 0
11: bank1 para_data Para;
12: const unsigned char ParaDefault[]= //确省定值
13: {
14: 0x01, //地址
15: 0x00, //波特率
16: 0x00, //PT高字节
17: 0x01, //PT低字节
18: 0x00, //CT高字节
19: 0x01, //CT低字节
20: };
21: void I2C_Start(void);
22: void I2C_Stop(void);
23: void I2C_Wait(void);
24: unsigned char I2C_SendByte(unsigned char byte);
25: unsigned char I2C_ReceiveByte(void);
26: void SendAcknowledge(unsigned char ack);
27: unsigned char I2C_ReceiveByte(void);
28: unsigned char I2C_Read(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf);
29: unsigned char I2C_Write(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf);
30: char CheckParameter(void);
31: void Load_DefaultValue(void);
32: void FinishParams(void);
33: char LoadParameter(void);
34: unsigned char ReadParameter(void);
35: unsigned char WriteParameter(void);
36: extern void watchDOG(void);
37: extern void DelyNms(unsigned int Nms);
38: void I2C_Start(void)
39: {
40: SCLPort = 0;
41: SDAMODE = 0;
42: I2C_Wait();
43: SDA = 1;
44: I2C_Wait();
45: SCL = 1;
46: I2C_Wait();
47: SDA = 0;
48: I2C_Wait();
49: SCL = 0;
50: }
51: /***********************************************************************/
52: void I2C_Stop(void)
53: {
54: SDAMODE = 0;
55: I2C_Wait();
56: SDA = 0;
57: I2C_Wait();
58: SCL = 1;
59: I2C_Wait();
60: SDA = 1;
61: }
62: /***********************************************************************/
63: void I2C_Wait(void)
64: {
65: Nop();Nop();Nop();Nop();Nop();Nop(); Nop();Nop();Nop() ;Nop();Nop();Nop();
66: }
67: /***********************************************************************/
68: unsigned char I2C_SendByte(unsigned char byte)
69: {
70: unsigned char i,ack;
71: SDAMODE = 0;
72: I2C_Wait();
73: for (i = 0;i <= 7;i++)
74: {
75: if(byte & 0x80)
76: {
77: SDA=1;
78: }
79: else
80: {
81: SDA=0;
82: }
83: byte <<= 1;
84: SCL = 1;
85: I2C_Wait();
86: SCL = 0;
87: I2C_Wait();
88: }
89: SDA = 1;
90: Nop();
91: SDAMODE = 1;
92: I2C_Wait();
93: SCL = 1;
94: I2C_Wait();
95: if(SDA == 1)
96: {
97: ack = 0;
98: }
99: else
100: {
101: ack = 1;
102: }
103: SCL = 0;
104: SDAMODE = 0;
105: return(ack);
106: }
107: /***********************************************************************/
108: unsigned char I2C_ReceiveByte(void)
109: {
110: unsigned char i,byte = 0;
111: SDAMODE = 1;
112: I2C_Wait();
113: for(i = 0;i <= 7;i++)
114: {
115: SCL = 1;
116: I2C_Wait();
117: byte <<= 1;
118: if(SDA == 1)
119: {
120: byte |= 0x01;
121: }
122: SCL = 0;
123: }
124: return(byte);
125: }
126: /***********************************************************************/
127: void SendAcknowledge(unsigned char ack)
128: {
129: SDAMODE = 0;
130: I2C_Wait();
131: if(ack)
132: {
133: SDA = 1;
134: }
135: else
136: {
137: SDA = 0;
138: }
139: I2C_Wait();
140: SCL = 1;
141: I2C_Wait();
142: SCL = 0;
143: }
144: unsigned char I2C_Read(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf)
145: {
146: unsigned char i,j,ack;
147: for(j = 0;j < 3;j++)
148: {
149: I2C_Start();
150: ack = I2C_SendByte(slvaddr);
151: if(ack == 0)
152: {
153: I2C_Stop();
154: continue;
155: }
156: I2C_Wait();
157: ack = I2C_SendByte(address);
158: if(ack == 0)
159: {
160: I2C_Stop();
161: continue;
162: }
163: I2C_Wait();
164:
165: I2C_Start();
166: ack = I2C_SendByte(slvaddr | 0x01);
167: if(ack == 0)
168: {
169: I2C_Stop();
170: continue;
171: }
172: Nop();
173: Nop();
174: for(i = 0;i < length;i++)
175: {
176: *(databuf+i) = I2C_ReceiveByte();
177: if(i < length-1)
178: {
179: SendAcknowledge(0);
180: }
181: else
182: {
183: SendAcknowledge(1);
184: }
185: }
186: I2C_Stop();
187: if(ack == 1)
188: {
189: break;
190: }
191: }
192: return(ack);
193: }
194: /***********************************************************************/
195: unsigned char I2C_Write(unsigned char slvaddr,unsigned char address,unsigned char length,unsigned char *databuf)
196: {
197: unsigned char i,j,ack;
198: WP = 0;
199: for(j = 0;j < 3;j++)
200: {
201: I2C_Start();
202: ack = I2C_SendByte(slvaddr);
203: if(ack == 0)
204: {
205: I2C_Stop();continue;
206: }
207: I2C_Wait();
208: ack = I2C_SendByte(address);
209: if(ack == 0)
210: {
211: I2C_Stop();continue;
212: }
213: for(i = 0;i < length;i++)
214: {
215: ack = I2C_SendByte(*(databuf+i));
216: if(ack == 0)
217: {
218: break;
219: }
220: }
221: if(ack == 0)
222: {
223: I2C_Stop();continue;
224: }
225: I2C_Stop();
226: if(ack == 1)
227: {
228: break;
229: }
230: }
231: return(ack);
232: }
233:
234: char CheckParameter(void)
235: {
236: unsigned char *P,crc0,sum0,data,crc,sum;
237: char i;
238: P = &Para;
239: I2C_Read(FM24C16addr,0,1,&crc0);
240: I2C_Read(FM24C16addr,1,1,&sum0);
241:
242: if((crc0==0x55)&&(sum0==0xaa)) //定值标志
243: {
244: crc=0;
245: sum=0;
246: I2C_Read(FM24C16addr,0x02,1,&crc0);
247: I2C_Read(FM24C16addr,0x03,1,&sum0);
248:
249: for(i=4;i<DZSUM+4;i++)
250: {
251: I2C_Read(FM24C16addr,i,1,&data);
252: *P++ = data;
253: crc^=data;
254: sum^=data;
255: }
256: if((crc==crc0)&&(sum==sum0)) return TRUE;
257: }
258: return FALSE;
259:
260: }
261:
262: void Load_DefaultValue(void)
263: {
264: unsigned char i,*P;
265: P = &Para;
266: watchDOG();
267: for(i=0;i<DZSUM;i++) *P++ = ParaDefault[i];
268: I2C_Write(FM24C16addr,0x04,4,P++);
269: DelyNms(1);
270: I2C_Write(FM24C16addr,8,2,P++);
271: WP = 1;
272: FinishParams();
273: watchDOG();
274:
275: }
276: void FinishParams(void)
277: {
278: unsigned char crc0,sum0,para;
279: char i;
280:
281: crc0 = 0x55;
282: I2C_Write(FM24C16addr,0,1,&crc0);
283: DelyNms(1);
284: sum0 = 0xaa;
285: I2C_Write(FM24C16addr,1,1,&sum0);
286: DelyNms(1);
287: crc0=0;
288: sum0=0;
289: for(i=4;i<DZSUM+4;i++)
290: {
291: I2C_Read(FM24C16addr,i,1,¶);
292: crc0^=para;
293: sum0^=para;
294: }
295: I2C_Write(FM24C16addr,2,1,&crc0);
296: DelyNms(1);
297: I2C_Write(FM24C16addr,3,1,&sum0);
298: DelyNms(1);
299: WP = 1;
300: }
301:
302: char LoadParameter(void) //调装置定值
303: {
304: if(CheckParameter()==FALSE)
305: {
306: Load_DefaultValue(); //调确省定值
307: if(CheckParameter()==FALSE)
308: {
309: return FALSE;
310: }
311: }
312: return TRUE;
313: }
314: unsigned char ReadParameter(void)
315: {
316: if(CheckParameter()==FALSE) Load_DefaultValue();
317: return TRUE; //调确省定值
318: }
319:
320: unsigned char WriteParameter(void)
321: {
322: unsigned char *P;
323: *P = &Para;
324: I2C_Write(FM24C16addr,0x04,4,P++);
325: DelyNms(1);
326: I2C_Write(FM24C16addr,8,2,P++);
327: DelyNms(1);
328: WP = 1;
329: watchDOG();
330: FinishParams();
331: watchDOG();
332: return TRUE;
333: }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -