📄 i2c.lst
字号:
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //***************************************************************
2 // I2C functions for ST72321 - master mode only
3 // Function : Delay10us
4 // Description : delay 10us each time is called
5 // can be modified for different CPU speed
6 // **************************************************************
7 #include "reg52.h"
8 #include "globedef.h"
9 #include "i2c.h"
10 #include "delay.h"
11
12
13 //***************************************************************
14 // Send start condition
15 // ensure data is high then issue a start condition
16 // see also i2c_Start() macro
17 //***************************************************************
18 void I2C_Start (void)
19 {
20 1 Pin_I2CSDA = 1;
21 1 Delay5US();
22 1 Delay5US();
23 1 Pin_I2CSCL = 1;
24 1 Delay5US();
25 1 Delay5US();
26 1 Pin_I2CSDA = 0;
27 1 Delay5US();
28 1 Delay5US();
29 1 Delay5US();
30 1 Pin_I2CSCL = 0;
31 1 }
32
33 //***************************************************************
34 // Send stop condition
35 // data low-high while clock high
36 //***************************************************************
37 void I2C_Stop (void)
38 {
39 1 Pin_I2CSDA = 0;
40 1 Delay5US();
41 1 Pin_I2CSCL = 1;
42 1 Delay5US();
43 1 Delay5US();
44 1 Pin_I2CSDA = 1;
45 1 }
46
47 //***************************************************************
48 //ROUTINE NAME : I2C_Ack
49 //INPUT/OUTPUT : None.
50 //DESCRIPTION : Acknoledge generation from now.
51 //COMMENTS : Transfer sequence = DATA, ACK.
52 //***************************************************************
53
54 void I2C_Rack(void)
55 {
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 2
56 1
57 1 Pin_I2CSCL = 0;
58 1 Pin_I2CSDA = 1;
59 1 Delay5US();
60 1 Delay5US();
61 1 Pin_I2CSCL = 1;
62 1 Delay5US();
63 1 Delay5US();
64 1 Delay5US();
65 1 Pin_I2CSDA = 0;
66 1 Pin_I2CSCL = 0;
67 1 Delay5US();
68 1
69 1 }
70
71
72 /*
73 void I2C_Ack (void)
74 {
75 Pin_I2CSCL = 0;
76 Delay5US();
77 Pin_I2CSDA = 0;
78 Delay5US();
79 Pin_I2CSCL = 1;
80 Delay5US();
81 Pin_I2CSCL = 0;
82 Delay5US();
83 Pin_I2CSDA = 1;
84 }
85
86 */
87 //***************************************************************
88 //ROUTINE NAME : I2C_nAck
89 //INPUT/OUTPUT : None.
90 //DESCRIPTION : Non acknoledge generation from now.
91 //COMMENTS : Transfer sequence = DATA, NACK.
92 //***************************************************************
93 void I2C_nAck (void)
94 {
95 1 Pin_I2CSCL = 0;
96 1 Delay5US();
97 1 Pin_I2CSDA = 1;
98 1 Delay5US();
99 1 Pin_I2CSCL = 1;
100 1 Delay5US();
101 1 Delay5US();
102 1 Delay5US();
103 1 Pin_I2CSCL = 0;
104 1 Delay5US();
105 1 Pin_I2CSDA = 1;
106 1 }
107
108 //***************************************************************
109 // Send a byte to the slave
110 // return I2C_ERROR on error
111 //***************************************************************
112 void I2C_TxData (BYTE i2c_data)
113 {
114 1 BYTE send_i;
115 1
116 1 for(send_i=0; send_i<8; send_i++)
117 1 {
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 3
118 2 Pin_I2CSCL = 0;
119 2 Delay5US();
120 2 if(i2c_data & 0x80)
121 2 Pin_I2CSDA = 1;
122 2 else
123 2 Pin_I2CSDA = 0;
124 2 Delay5US();
125 2 Pin_I2CSCL = 1;
126 2 Delay5US();
127 2 i2c_data <<= 1;
128 2 }
129 1
130 1 }
131
132 //***************************************************************
133 //ROUTINE NAME : I2Cm_RxData
134 //INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte.
135 //DESCRIPTION : Receive a data byte.
136 //COMMENTS : Transfer sequence = DATA, ACK, EV7...
137 //***************************************************************
138 BYTE I2C_RxData (void)
139 {
140 1 BYTE read_i;
141 1 BYTE readbyte=0;
142 1 Pin_I2CSCL = 0;
143 1 Pin_I2CSDA = 1;
144 1 Delay5US();
145 1
146 1 for(read_i=0; read_i<8; read_i++)
147 1 {
148 2 Pin_I2CSCL = 1;
149 2 readbyte <<= 1;
150 2 Delay5US();
151 2 if(Pin_I2CSDA)
152 2 readbyte |= 0x01;
153 2
154 2 Pin_I2CSCL = 0;
155 2 Delay5US();
156 2
157 2 }
158 1 return readbyte;
159 1
160 1 }
161 //***************************************************************
162 //ROUTINE NAME : I2Cm_SetAddr
163 //INPUT/OUTPUT : external I2C device address / None.
164 //DESCRIPTION : Generates Start-bit and transmits the address byte.
165 //COMMENTS : Transfer sequence = START, EV5, ADD, ACK...
166 //***************************************************************
167 void I2C_SetAddr(char i2c_addr)
168 {
169 1 I2C_TxData (i2c_addr);
170 1 }
171
172
173
174 //***************************************************************
175 // Send a byte to the slave and acknowledges the transfer
176 // return I2C_ERROR, or I2C_OK
177 //***************************************************************
178
179
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 4
180 void I2C_PutByte(BYTE DevAddr,BYTE subAddr, BYTE ucData)
181 {
182 1 I2C_Start();
183 1 I2C_SetAddr(DevAddr);
184 1 I2C_Rack();
185 1 I2C_SetAddr(subAddr);
186 1 I2C_Rack();
187 1 I2C_TxData(ucData);
188 1 I2C_Rack();
189 1 I2C_Stop();
190 1 }
191
192 void I2C_ChangeVol(BYTE DevAddr,BYTE ucData)
193 {
194 1 I2C_Start();
195 1 I2C_SetAddr(DevAddr);
196 1 I2C_Rack();
197 1 I2C_SetAddr(ucData);
198 1 I2C_Rack();
199 1 I2C_Stop();
200 1 }
201
202 //***************************************************************
203 // Get a byte from the slave and acknowledges the transfer
204 // return I2C_OK or I2C_ERROR
205 //***************************************************************
206
207
208 BYTE I2C_GetByte(BYTE DevAddr,BYTE subAddr)
209 {
210 1 BYTE ucData;
211 1
212 1 I2C_Start ();
213 1 I2C_SetAddr(DevAddr);
214 1 I2C_Rack();
215 1 I2C_SetAddr(subAddr);
216 1 I2C_Rack();
217 1
218 1 I2C_Start ();
219 1 I2C_SetAddr(DevAddr+1);
220 1 I2C_Rack();
221 1 ucData = I2C_RxData();
222 1
223 1 I2C_nAck();
224 1
225 1 I2C_Stop();
226 1 return(ucData);
227 1 }
228
229 //***************************************************************
230 // Send an array of bytes to the slave
231 // -and acknowledges the transfer
232 // return I2C_OK or I2C_ERROR
233 //***************************************************************
234
235 /*
236 void I2C_PutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
237 {
238 BYTE send_cc;
239 send_cc = 0;
240 I2C_Start ();
241 I2C_SetAddr(DevAddr);
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 5
242 I2C_Rack();
243 I2C_SetAddr(subAddr);
244 I2C_Rack();
245
246 while(length)
247 {
248 I2C_TxData(*str);
249 I2C_Rack();
250 length--;
251 send_cc++;
252 if(length > 0)
253 str++;
254
255
256 if((send_cc % 8 == 0) && (length > 0))
257 {
258 I2C_Stop();
259 DelayX1ms(4);
260
261 {
262 I2C_Start ();
263 I2C_SetAddr(DevAddr);
264 I2C_Rack();
265 I2C_SetAddr(subAddr+send_cc);
266 I2C_Rack();
267 }
268
269 }
270 }
271 I2C_Stop();
272 }
273
274 */
275
276 /*
277 void I2C_OutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
278 {
279 BYTE CCC;
280 I2C_Start ();
281 I2C_SetAddr(DevAddr);
282 I2C_Rack();
283 I2C_SetAddr(subAddr);
284 I2C_Rack();
285
286 while(length)
287 {
288
289 I2C_TxData(*str);
290 I2C_Rack();
291 length--;
292
293 if(length > 0)
294 str++;
295 }
296 I2C_Stop();
297 for(CCC = 0; CCC <2;CCC++)
298 ;
299
300 }
301 */
302
303 //***************************************************************
C51 COMPILER V7.50 I2C 06/16/2005 21:32:11 PAGE 6
304 // Reads number bytes from the slave, stores them at str
305 // -and acknowledges the transfer
306 // return I2C_OK or I2C_ERROR not successfully read
307 //***************************************************************
308
309 /*
310 void I2C_GetString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE number)
311 {
312 I2C_Start ();
313 I2C_SetAddr(DevAddr);
314 I2C_Rack();
315 I2C_SetAddr(subAddr);
316 I2C_Rack();
317
318 I2C_Start ();
319 I2C_SetAddr(DevAddr+1);
320 I2C_Rack();
321
322 while(number)
323 {
324 *str = I2C_RxData();
325 if (number==1)
326 I2C_nAck();
327 else
328 I2C_Ack();
329 str++;
330 number -= 1;
331 }
332 I2C_Stop();
333 }
334 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 310 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -