📄 i2c.lst
字号:
C51 COMPILER V7.20 I2C 06/30/2005 14:02:56 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil51\C51\BIN\c51.exe I2C.c DB OE SMALL ROM(LARGE)
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 "..\..\inc\globedef.h"
9 #include "..\..\inc\i2c.h"
10 #include "..\..\inc\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.20 I2C 06/30/2005 14:02:56 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 void I2C_Ack (void)
72 {
73
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
89 //***************************************************************
90 //ROUTINE NAME : I2C_nAck
91 //INPUT/OUTPUT : None.
92 //DESCRIPTION : Non acknoledge generation from now.
93 //COMMENTS : Transfer sequence = DATA, NACK.
94 //***************************************************************
95 void I2C_nAck (void)
96 {
97 1 Pin_I2CSCL = 0;
98 1 Delay5US();
99 1 Pin_I2CSDA = 1;
100 1 Delay5US();
101 1 Pin_I2CSCL = 1;
102 1 Delay5US();
103 1 Delay5US();
104 1 Delay5US();
105 1 Pin_I2CSCL = 0;
106 1 Delay5US();
107 1 Pin_I2CSDA = 1;
108 1 }
109
110 //***************************************************************
111 // Send a byte to the slave
112 // return I2C_ERROR on error
113 //***************************************************************
114 void I2C_TxData (BYTE i2c_data)
115 {
116 1 BYTE send_i;
117 1
C51 COMPILER V7.20 I2C 06/30/2005 14:02:56 PAGE 3
118 1 for(send_i=0; send_i<8; send_i++)
119 1 {
120 2 Pin_I2CSCL = 0;
121 2 Delay5US();
122 2 if(i2c_data & 0x80)
123 2 Pin_I2CSDA = 1;
124 2 else
125 2 Pin_I2CSDA = 0;
126 2 Delay5US();
127 2 Pin_I2CSCL = 1;
128 2 Delay5US();
129 2 i2c_data <<= 1;
130 2 }
131 1
132 1 }
133
134 //***************************************************************
135 //ROUTINE NAME : I2Cm_RxData
136 //INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte.
137 //DESCRIPTION : Receive a data byte.
138 //COMMENTS : Transfer sequence = DATA, ACK, EV7...
139 //***************************************************************
140 BYTE I2C_RxData (void)
141 {
142 1 BYTE read_i;
143 1 BYTE readbyte=0;
144 1 Pin_I2CSCL = 0;
145 1 Pin_I2CSDA = 1;
146 1 Delay5US();
147 1
148 1 for(read_i=0; read_i<8; read_i++)
149 1 {
150 2 Pin_I2CSCL = 1;
151 2 readbyte <<= 1;
152 2 Delay5US();
153 2 if(Pin_I2CSDA)
154 2 readbyte |= 0x01;
155 2
156 2 Pin_I2CSCL = 0;
157 2 Delay5US();
158 2
159 2 }
160 1 return readbyte;
161 1
162 1 }
163 //***************************************************************
164 //ROUTINE NAME : I2Cm_SetAddr
165 //INPUT/OUTPUT : external I2C device address / None.
166 //DESCRIPTION : Generates Start-bit and transmits the address byte.
167 //COMMENTS : Transfer sequence = START, EV5, ADD, ACK...
168 //***************************************************************
169 void I2C_SetAddr(char i2c_addr)
170 {
171 1 I2C_TxData (i2c_addr);
172 1 }
173
174
175
176 //***************************************************************
177 // Send a byte to the slave and acknowledges the transfer
178 // return I2C_ERROR, or I2C_OK
179 //***************************************************************
C51 COMPILER V7.20 I2C 06/30/2005 14:02:56 PAGE 4
180
181
182 void I2C_PutByte(BYTE DevAddr,BYTE subAddr, BYTE ucData)
183 {
184 1 I2C_Start();
185 1 I2C_SetAddr(DevAddr);
186 1 I2C_Rack();
187 1 I2C_SetAddr(subAddr);
188 1 I2C_Rack();
189 1 I2C_TxData(ucData);
190 1 I2C_Rack();
191 1 I2C_Stop();
192 1 }
193
194
195 //***************************************************************
196 // Get a byte from the slave and acknowledges the transfer
197 // return I2C_OK or I2C_ERROR
198 //***************************************************************
199
200
201 BYTE I2C_GetByte(BYTE DevAddr,BYTE subAddr)
202 {
203 1 BYTE ucData;
204 1
205 1 I2C_Start ();
206 1 I2C_SetAddr(DevAddr);
207 1 I2C_Rack();
208 1 I2C_SetAddr(subAddr);
209 1 I2C_Rack();
210 1
211 1 I2C_Start ();
212 1 I2C_SetAddr(DevAddr+1);
213 1 I2C_Rack();
214 1 ucData = I2C_RxData();
215 1
216 1 I2C_nAck();
217 1
218 1 I2C_Stop();
219 1 return(ucData);
220 1 }
221
222 //***************************************************************
223 // Send an array of bytes to the slave
224 // -and acknowledges the transfer
225 // return I2C_OK or I2C_ERROR
226 //***************************************************************
227
228 /*
229 void I2C_PutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
230 {
231 BYTE send_cc;
232 send_cc = 0;
233 I2C_Start ();
234 I2C_SetAddr(DevAddr);
235 I2C_Rack();
236 I2C_SetAddr(subAddr);
237 I2C_Rack();
238
239 while(length)
240 {
241 I2C_TxData(*str);
C51 COMPILER V7.20 I2C 06/30/2005 14:02:56 PAGE 5
242 I2C_Rack();
243 length--;
244 send_cc++;
245 if(length > 0)
246 str++;
247
248
249 if((send_cc % 8 == 0) && (length > 0))
250 {
251 I2C_Stop();
252 DelayX1ms(4);
253
254 {
255 I2C_Start ();
256 I2C_SetAddr(DevAddr);
257 I2C_Rack();
258 I2C_SetAddr(subAddr+send_cc);
259 I2C_Rack();
260 }
261
262 }
263 }
264 I2C_Stop();
265 }
266
267 */
268
269 /*
270 void I2C_OutString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE length)
271 {
272 BYTE CCC;
273 I2C_Start ();
274 I2C_SetAddr(DevAddr);
275 I2C_Rack();
276 I2C_SetAddr(subAddr);
277 I2C_Rack();
278
279 while(length)
280 {
281
282 I2C_TxData(*str);
283 I2C_Rack();
284 length--;
285
286 if(length > 0)
287 str++;
288 }
289 I2C_Stop();
290 for(CCC = 0; CCC <2;CCC++)
291 ;
292
293 }
294 */
295 //***************************************************************
296 // Reads number bytes from the slave, stores them at str
297 // -and acknowledges the transfer
298 // return I2C_OK or I2C_ERROR not successfully read
299 //***************************************************************
300
301 /*
302 void I2C_GetString(BYTE DevAddr,BYTE subAddr, BYTE *str, BYTE number)
303 {
C51 COMPILER V7.20 I2C 06/30/2005 14:02:56 PAGE 6
304 I2C_Start ();
305 I2C_SetAddr(DevAddr);
306 I2C_Rack();
307 I2C_SetAddr(subAddr);
308 I2C_Rack();
309
310 I2C_Start ();
311 I2C_SetAddr(DevAddr+1);
312 I2C_Rack();
313
314 while(number)
315 {
316 *str = I2C_RxData();
317 if (number==1)
318 I2C_nAck();
319 else
320 I2C_Ack();
321 str++;
322 number -= 1;
323 }
324 I2C_Stop();
325 }
326 */
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
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 + -