📄 i2c.lst
字号:
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c OMF2 BROWSE DEBUG
line level source
1 /**********************************************************************
2 *File Name : eeprom.c
3 *Creat Time : 2002/02/11
4 *Program Author : mqli
5 *File Discreption :
6 *
7 ************************************************************************/
8
9
10 #include "common.h"
11 #include "Var.h"
12 #include "main.h"
13 #include "i2c.h"
14 #include "lcd.h"
15
16
17
18
19
20 #define I2C_CLK_0 I2C_CLK=0
21 #define I2C_CLK_1 I2C_CLK=1
22
23 #define I2C_DATA_0 I2C_DATA=0
24 #define I2C_DATA_1 I2C_DATA=1
25
26 BOOL IICWriteWaitAcknowlodge(void);
27
28 unsigned char IICrxbyte(void);
29
30 void IICstart(void);
31 void IICstop(void);
32 void IICReadAcknowledge(void);
33 void IICtxbyte(U8 DateByte);
34 U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value);
35
36
37
38 void IICstart(void)
39 {
40 1
41 1
42 1
43 1
44 1 // I2C_CLK_0;
45 1 //Delay_xuS(1);
46 1
47 1 I2C_DATA_1;
48 1 Delay_xuS(1);
49 1 I2C_CLK_1;
50 1 Delay_xuS(1);
51 1 I2C_DATA_0;
52 1 Delay_xuS(1);
53 1 I2C_CLK_0;
54 1 Delay_xuS(1);
55 1
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 2
56 1
57 1 }
58
59 void IICstop(void)
60 {
61 1
62 1 Delay_xuS(1);
63 1 I2C_CLK_0;
64 1 Delay_xuS(1);
65 1 I2C_DATA_0;
66 1 Delay_xuS(1);
67 1 I2C_CLK_1;
68 1 Delay_xuS(1);
69 1 I2C_DATA_1;
70 1 Delay_xuS(1);
71 1
72 1 }
73 void IICReadAcknowledge(void)
74 {
75 1 I2C_CLK_0;
76 1 I2C_DATA_0;
77 1 Delay_xuS(1);
78 1 I2C_CLK_1;
79 1 Delay_xuS(1);
80 1 I2C_CLK_0;
81 1 I2C_DATA_1;
82 1 }
83
84 BOOL IICWriteWaitAcknowlodge(void)
85 {
86 1
87 1 BOOL WriteSuccessFlag=FALSE;
88 1
89 1 I2C_CLK_1;
90 1 WriteSuccessFlag=(I2C_DATA)?FALSE:TRUE;
91 1 I2C_CLK_0;
92 1 if ( WriteSuccessFlag==FALSE )
93 1 {
94 2 Delay_xuS(1);
95 2 }
96 1 return WriteSuccessFlag;
97 1
98 1 }
99
100 void IICtxbyte(U8 DataByte)
101 {
102 1
103 1 DE_DATA U8 BitMast;
104 1
105 1
106 1 for(BitMast=0x80;BitMast>0;BitMast>>=1)
107 1
108 1
109 1 {
110 2
111 2 if (DataByte&BitMast)
112 2 I2C_DATA_1;
113 2 else
114 2 I2C_DATA_0;
115 2 Delay_xuS(1);
116 2 Delay_xuS(1);
117 2 I2C_CLK_1;
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 3
118 2 Delay_xuS(1);
119 2 Delay_xuS(1);
120 2 I2C_CLK_0;
121 2 }
122 1 I2C_DATA_1;
123 1
124 1
125 1 }
126
127 unsigned char IICrxbyte(void)
128 {
129 1 DE_DATA U8 ReceiveByte=0,i;
130 1 I2C_DATA_1;
131 1 for(i=0;i<8;i++)
132 1 {
133 2 I2C_CLK_1;
134 2 ReceiveByte<<=1;
135 2 ReceiveByte|=I2C_DATA;
136 2 I2C_CLK_0;
137 2 Delay_xuS(1);
138 2
139 2 }
140 1 return ReceiveByte;
141 1
142 1
143 1 }
144
145
146
147
148 /* Read EEPROM content */
149 U8 I2C_Read_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer,
- U8 bytes_counter)
150 {
151 1 DE_DATA unsigned char errcnt;
152 1
153 1 errcnt=0;
154 1 while(1)
155 1 {
156 2 IICstart();
157 2 IICtxbyte(device_address);
158 2 if (IICWriteWaitAcknowlodge()==TRUE) break;
159 2 errcnt++;
160 2 if (errcnt>5)
161 2 {
162 3 IICstop();
163 3 return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
164 3 }
165 2 }
166 1
167 1 do{
168 2 IICtxbyte(*register_adrress);
169 2 if(IICWriteWaitAcknowlodge()==FALSE)
170 2 return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
171 2 register_address_length--;
172 2 register_adrress++;
173 2 }while(register_address_length);
174 1
175 1
176 1 IICstart();
177 1 IICtxbyte(device_address|0x01);
178 1 if(IICWriteWaitAcknowlodge()==FALSE)
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 4
179 1 return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
180 1
181 1 while (1)
182 1 {
183 2 *buffer_pointer=0;
184 2 *buffer_pointer=IICrxbyte();
185 2 bytes_counter--;
186 2 if (bytes_counter==0) break;
187 2 IICReadAcknowledge();
188 2 buffer_pointer++;
189 2 }
190 1 Delay_xuS(1);
191 1 IICstop();
192 1
193 1 return I2C_COMMUNICATION_OK;
194 1
195 1 }
196
197
198
199
200 /*******************************************************
201 for fast write fuction
202 care that some chip limit the total bytes of one write cycle
203 1K,2K=8 4K,8K,16K=16
204 ************************************************************/
205
206
207
208
209
210 U8 I2C_Write_Bytes(U8 device_address,U8* register_adrress, U8 register_address_length,U8 * buffer_pointer
-, U8 bytes_counter)
211 {
212 1 DE_DATA unsigned char errcnt,temp;
213 1
214 1 errcnt=0;
215 1 while(1)
216 1 {
217 2 IICstart(); // IIC start condition
218 2 IICtxbyte(device_address);
219 2 if (IICWriteWaitAcknowlodge()==TRUE) break;
220 2 errcnt++;
221 2 if (errcnt>5)
222 2 {
223 3 IICstop();
224 3 return I2C_WRITE_DEVICE_ADDRESS_NO_ACKNOLOGE;
225 3 }
226 2 }
227 1 do{
228 2 temp=*register_adrress;
229 2 IICtxbyte(temp);
230 2 //IICtxbyte(*register_adrress); //write the address onchip
231 2 if(IICWriteWaitAcknowlodge()==FALSE)
232 2 return I2C_WRITE_REGISTER_ADDRESS_NO_ACKNOLOGE;
233 2 register_address_length--;
234 2 register_adrress++;
235 2 }while(register_address_length);
236 1
237 1 while(bytes_counter)
238 1 {
239 2 temp=*buffer_pointer;
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 5
240 2 IICtxbyte(temp); // transmit EEPROM data
241 2 if(IICWriteWaitAcknowlodge()==FALSE)
242 2 return I2C_WRITE_REGISTER_DATA_NO_ACKNOLOGE;
243 2 buffer_pointer++;
244 2 bytes_counter--;
245 2 }
246 1 IICstop(); // IIC stop condition
247 1
248 1 return I2C_COMMUNICATION_OK;
249 1 }
250
251
252
253
254
255
256 /************************************************************
257 * The followed is the application for IIC bus
258 *
259 *****************************************************************/
260 #define EEPROM_I2C_DEVICE_ADDRESS 0xA0
261
262
263 /* Read EEPROM content */
264 U8 ReadXEEprom(U8 * buffer_pointer, U16 register_address, U8 bytes_counter)
265 {
266 1 DE_DATA U8 result,temp_register_address;
267 1 temp_register_address=(U8)(register_address);
268 1
269 1 result= I2C_Read_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
270 1 &temp_register_address, 1,buffer_pointer, bytes_counter);
271 1 Delay_xmS(10);
272 1 if(result!=I2C_COMMUNICATION_OK)
273 1 Scroll_Promote_Information("READ EEP ERR:",result);
274 1 return result;
275 1 }
276
277
278
279
280
281 /*******************************************************
282 for fast write fuction
283 care that some chip limit the total bytes of one write cycle
284 1K,2K=8 4K,8K,16K=16
285 ************************************************************/
286
287
288 U8 WriteXEEprom(U8 * bufptr, U16 register_address, U8 bytes_counter)
289 {
290 1
291 1 DE_DATA U8 result,temp_register_address;
292 1 temp_register_address=(U8)(register_address);
293 1 result= I2C_Write_Bytes(EEPROM_I2C_DEVICE_ADDRESS+((U8)(register_address/128)&0x0e),
294 1 & temp_register_address,1,bufptr,bytes_counter);
295 1 if(result!=I2C_COMMUNICATION_OK)
296 1 Scroll_Promote_Information("WRITE I'C COMM ERR:", result);
297 1 Delay_xmS(10);
298 1 return result;
299 1 }
300
301
C51 COMPILER V8.02 I2C 10/16/2006 17:42:28 PAGE 6
302
303 void Check_EEProm_Var_Validity(void)
304 {
305 1
306 1 //Comfirm_Var_Validity
307 1 }
308
309
310 U8 Comfirm_Var_Validity(U8 *var_address,U8 Max_Value,U8 Min_Value, U8 Normal_Value)
311 {
312 1 if( (*var_address>Max_Value)||(*var_address<Min_Value) )
313 1 {
314 2 *var_address=Normal_Value;
315 2 return 0;
316 2 }
317 1 else
318 1 {
319 2 return 1;
320 2 }
321 1 }
322
323
324
325
326
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 656 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 47
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -