?? i2c.lst
字號:
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN ..\..\1out\i2c.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\msFunc\i2c.c BROWSE INCDIR(..\..\inc;..\..\mslib;..\..\Device;..\..\k
-ernal;..\..\msFunc;..\..\pc;..\..\tv) DEBUG OBJECTEXTEND PRINT(..\..\1out\i2c.lst) OBJECT(..\..\1out\i2c.obj)
line level source
1 #define _I2C_C_
2
3 #include "types.h"
4 #include "board.h"
5 #include "global.h"
6 #include "DEBUG.h"
7 #include "misc.h"
8 #include "i2c.h"
9
10 /////////////////////////////////////////
11 // Set I2C SCL pin high/low.
12 //
13 // Arguments: bSet - high/low bit
14 /////////////////////////////////////////
15 void i2cSetSCL_Chk(bit bSet)
16 {
17 1 BYTE ucDummy; // loop dummy
18 1
19 1 i2cSetSCL(bSet); // set SCL pin
20 1
21 1 if (bSet == _HIGH) // if set pin high
22 1 {
23 2 ucDummy = I2C_CHECK_PIN_DUMMY; // initialize dummy
24 2 while ((i2cSCL_PIN_STATUS() == _LOW) && (ucDummy--)) ; // check SCL pull high
25 2 }
26 1 }
27
28 /////////////////////////////////////////
29 // Set I2C SDA pin high/low
30 //
31 // Arguments: bSet - high/low bit
32 /////////////////////////////////////////
33 void i2cSetSDA_Chk(bit bSet)
34 {
35 1 BYTE ucDummy; // loop dummy
36 1
37 1 i2cSetSDA(bSet); // set SDA pin
38 1
39 1 if (bSet == _HIGH) // if set pin high
40 1 {
41 2 ucDummy = I2C_CHECK_PIN_DUMMY; // initialize dummy
42 2 while ((i2cSDA_PIN_STATUS() == _LOW) && (ucDummy--)) ; // check SDA pull high
43 2 }
44 1 }
45 //////////////////////////////////////////////////////////////
46 // Delay 4us
47 //////////////////////////////////////////////////////////////
48 void i2c_Delay(void)
49 {
50 1 _nop_();
51 1 _nop_();
52 1 _nop_();
53 1 _nop_();
54 1 _nop_();
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 2
55 1 _nop_();
56 1 _nop_();
57 1 _nop_();
58 1 }
59 //////////////////////////////////////////////////////
60 // I2C start signal.
61 // <comment>
62 // SCL ________
63 // \_________
64 // SDA _____
65 // \____________
66 //
67 // Return value: None
68 //////////////////////////////////////////////////////
69 BOOL i2c_Start(void)
70 {
71 1 BOOL bStatus = TRUE; // success status
72 1
73 1 i2cSetSDA_Chk(_HIGH);
74 1 i2c_Delay();
75 1 i2cSetSCL_Chk(_HIGH);
76 1 i2c_Delay();
77 1
78 1 if ((i2cSCL_PIN_STATUS() == _LOW) || (i2cSDA_PIN_STATUS() == _LOW))
79 1 {
80 2 bStatus = FALSE;
81 2 }
82 1 else
83 1 {
84 2 i2cSetSDA(_LOW);
85 2 i2c_Delay();
86 2 i2cSetSCL(_LOW);
87 2 }
88 1
89 1 return bStatus;
90 1 }
91 /////////////////////////////////////////
92 // I2C stop signal.
93 // <comment>
94 // ____________
95 // SCL _______/
96 // _________
97 // SDA __________/
98 /////////////////////////////////////////
99 void i2c_Stop(void)
100 {
101 1 i2cSetSCL(_LOW);
102 1 i2c_Delay();
103 1 i2cSetSDA(_LOW);
104 1 i2c_Delay();
105 1 i2cSetSCL(_HIGH);
106 1 i2c_Delay();
107 1 i2cSetSDA(_HIGH);
108 1 i2c_Delay();
109 1 }
110
111 //////////////////////////////////////////////////////////////////////////
112 // I2C send byte to device.
113 //
114 // Arguments: ucVal - send byte
115 // Return value: I2C acknowledge bit
116 // I2C_ACKNOWLEDGE/I2C_NON_ACKNOWLEDGE
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 3
117 //////////////////////////////////////////////////////////////////////////
118 BOOL i2c_SendByte(BYTE ucVal)
119 {
120 1 BYTE ucMask = 0x80;
121 1 BOOL bAck; // acknowledge bit
122 1
123 1 while(ucMask)
124 1 {
125 2 if (ucVal & ucMask)
126 2 i2cSetSDA_Chk(_HIGH);
127 2 else
128 2 i2cSetSDA_Chk(_LOW);
129 2 i2c_Delay();
130 2 i2cSetSCL_Chk(_HIGH); // clock
131 2 i2c_Delay();
132 2 i2cSetSCL(_LOW);
133 2 i2c_Delay();
134 2
135 2 ucMask >>= 1; // next
136 2 } // while
137 1
138 1 // recieve acknowledge
139 1 i2cSetSDA(_HIGH);
140 1 i2c_Delay();
141 1 i2cSetSCL(_HIGH);
142 1 i2c_Delay();
143 1 bAck = i2cSDA_PIN_STATUS(); // recieve acknowlege
144 1 i2cSetSCL(_LOW);
145 1
146 1 return (bAck);
147 1 }
148 //////////////////////////////////////////////////////////////////////////
149 // I2C receive byte from device.
150 //
151 // Return value: receive byte
152 //////////////////////////////////////////////////////////////////////////
153 BYTE i2c_ReceiveByte(BOOL bAck)
154 {
155 1 BYTE ucReceive = 0;
156 1 BYTE ucMask = 0x80;
157 1
158 1 while(ucMask)
159 1 {
160 2 i2cSetSDA(_HIGH);
161 2 i2cSetSCL(_HIGH);
162 2
163 2 if(i2cSDA_PIN_STATUS() == _HIGH)
164 2 ucReceive |= ucMask;
165 2
166 2 i2cSetSCL(_LOW);
167 2 i2c_Delay();
168 2
169 2 ucMask >>= 1;
170 2 } // while
171 1
172 1 if (bAck) // acknowledge
173 1 i2cSetSDA_Chk(I2C_ACKNOWLEDGE);
174 1 else // non-acknowledge
175 1 i2cSetSDA_Chk(I2C_NON_ACKNOWLEDGE);
176 1
177 1 i2c_Delay();
178 1 i2cSetSCL(_HIGH);
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 4
179 1 i2c_Delay();
180 1 i2cSetSCL(_LOW);
181 1
182 1 return ucReceive;
183 1 }
184
185 //////////////////////////////////////////////////////////////////////////
186 // I2C access start.
187 //
188 // Arguments: ucSlaveAdr - slave address
189 // trans_t - I2C_TRANS_WRITE/I2C_TRANS_READ
190 //////////////////////////////////////////////////////////////////////////
191 BOOL i2c_AccessStart(BYTE ucSlaveAdr, I2C_Direction trans_t)
192 {
193 1 BYTE ucDummy; // loop dummy
194 1
195 1 if (trans_t == I2C_READ) // check i2c read or write
196 1 ucSlaveAdr = I2C_DEVICE_ADR_READ(ucSlaveAdr); // read
197 1 else
198 1 ucSlaveAdr = I2C_DEVICE_ADR_WRITE(ucSlaveAdr); // write
199 1
200 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
201 1 while (ucDummy--)
202 1 {
203 2 i2c_Delay();
204 2 if (i2c_Start() == FALSE)
205 2 continue;
206 2
207 2 if (i2c_SendByte(ucSlaveAdr) == I2C_ACKNOWLEDGE) // check acknowledge
208 2 return TRUE;
209 2 //printf("ucSlaveAdr====%x", ucSlaveAdr);
210 2 i2c_Stop();
211 2 Delay1ms(1);
212 2 }
213 1
214 1 return FALSE;
215 1 }
216 /////////////////////////////////////////////////////////////////
217 // I2C write bytes to device.
218 //
219 // Arguments: ucSlaveAdr - slave address
220 // ucSubAdr - sub address
221 // pBuf - pointer of buffer
222 // ucBufLen - length of buffer
223 /////////////////////////////////////////////////////////////////
224 void i2cBurstWriteBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
225 {
226 1 BYTE ucDummy; // loop dummy
227 1
228 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
229 1 while(ucDummy--)
230 1 {
231 2 if (i2c_AccessStart(ucSlaveAdr, I2C_WRITE) == FALSE)
232 2 continue;
233 2 if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
234 2 continue;
235 2
236 2 while(ucBufLen--) // loop of writting data
237 2 {
238 3 i2c_SendByte(*pBuf); // send byte
239 3 pBuf++; // next byte pointer
240 3 } // while
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 5
241 2
242 2 break;
243 2 } // while
244 1
245 1 i2c_Stop();
246 1 }
247
248 /////////////////////////////////////////////////////////////////
249 // I2C read bytes from device.
250 //
251 // Arguments: ucSlaveAdr - slave address
252 // ucSubAdr - sub address
253 // pBuf - pointer of buffer
254 // ucBufLen - length of buffer
255 /////////////////////////////////////////////////////////////////
256
257 void i2cBurstReadBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE *pBuf, BYTE ucBufLen)
258 {
259 1 BYTE ucDummy; // loop dummy
260 1
261 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
262 1 while(ucDummy--)
263 1 {
264 2 if (i2c_AccessStart(ucSlaveAdr, I2C_WRITE) == FALSE)
265 2 continue;
266 2
267 2 if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
268 2 continue;
269 2
270 2 if (i2c_AccessStart(ucSlaveAdr, I2C_READ) == FALSE)
271 2 continue;
272 2
273 2 while(ucBufLen--) // loop to burst read
274 2 {
275 3 *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte
276 3
277 3 pBuf++; // next byte pointer
278 3 } // while
279 2
280 2 break;
281 2 } // while
282 1
283 1 i2c_Stop();
284 1 }
285
286 void i2c_WriteTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
287 {
288 1 i2cBurstWriteBytes( deviceID, addr,buffer, count);
289 1 }
290
291 #if 0
void i2c_ReadTBL(BYTE deviceID, WORD addr, BYTE *buffer, BYTE count)
{
i2cBurstReadBytes(deviceID, addr,buffer,count);
}
#endif
297
298 #if TUNER_2IN1
299 /////////////////////////////////////////////////////////////////
300 // I2C read current bytes from device.
301 //
302 // Arguments: ucSlaveAdr - slave address
C51 COMPILER V8.01 I2C 11/28/2006 08:08:07 PAGE 6
303 // pBuf - pointer of buffer
304 // ucBufLen - length of buffer
305 /////////////////////////////////////////////////////////////////
306 void i2cBurstCurrentBytes(BYTE ucSlaveAdr, BYTE *pBuf, BYTE ucBufLen)
307 {
308 1 BYTE ucDummy; // loop dummy
309 1
310 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
311 1 while(ucDummy--)
312 1 {
313 2 if (i2c_AccessStart(ucSlaveAdr, I2C_READ) == FALSE)
314 2 continue;
315 2
316 2 while(ucBufLen--) // loop to burst read
317 2 {
318 3 *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte
319 3
320 3 pBuf++; // next byte pointer
321 3 } // while
322 2
323 2 break;
324 2 } // while
325 1
326 1 i2c_Stop();
327 1 }
328
329 void i2cWriteByte(BYTE deviceID, BYTE addr, BYTE value)
330 {
331 1 i2c_WriteTBL(deviceID, addr, &value, 1);
332 1 }
333
334 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 516 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 30
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -