?? i2c.lst
字號:
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 I2C.c
3 標(biāo)準(zhǔn)80C51單片機模擬I2C總線的主機程序
4 Copyright (c) 2006,廣州周立功單片機發(fā)展有限公司
5 All rights reserved.
6 本程序僅供學(xué)習(xí)參考,不提供任何可靠性方面的擔(dān)保;請勿用于商業(yè)目的
7 */
8
9
10 #include "I2C.h"
11
12
13 //定義延時變量,用于宏I2C_Delay()
14 unsigned char data I2C_Delay_t;
15
16 /*
17 宏定義:I2C_Delay()
18 功能:延時,模擬I2C總線專用
19 */
20 #define I2C_Delay()\
21 {\
22 I2C_Delay_t = (I2C_DELAY_VALUE);\
23 while ( --I2C_Delay_t != 0 );\
24 }
25
26
27 /*
28 函數(shù):I2C_Init()
29 功能:I2C總線初始化,使總線處于空閑狀態(tài)
30 說明:在main()函數(shù)的開始處,通常應(yīng)當(dāng)要執(zhí)行一次本函數(shù)
31 */
32 void I2C_Init()
33 {
34 1 I2C_SCL = 1;
35 1 I2C_Delay();
36 1 I2C_SDA = 1;
37 1 I2C_Delay();
38 1 }
39
40
41 /*
42 函數(shù):I2C_Start()
43 功能:產(chǎn)生I2C總線的起始狀態(tài)
44 說明:
45 SCL處于高電平期間,當(dāng)SDA出現(xiàn)下降沿時啟動I2C總線
46 不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生起始狀態(tài)
47 本函數(shù)也可以用來產(chǎn)生重復(fù)起始狀態(tài)
48 本函數(shù)執(zhí)行后,I2C總線處于忙狀態(tài)
49 */
50 void I2C_Start()
51 {
52 1 I2C_SDA = 1;
53 1 I2C_Delay();
54 1 I2C_SCL = 1;
55 1 I2C_Delay();
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 2
56 1 I2C_SDA = 0;
57 1 I2C_Delay();
58 1 I2C_SCL = 0;
59 1 I2C_Delay();
60 1 }
61
62
63 /*
64 函數(shù):I2C_Write()
65 功能:向I2C總線寫1個字節(jié)的數(shù)據(jù)
66 參數(shù):
67 dat:要寫到總線上的數(shù)據(jù)
68 */
69 void I2C_Write(unsigned char dat)
70 {
71 1 unsigned char t = 8;
72 1 do
73 1 {
74 2 I2C_SDA = (bit)(dat & 0x80);
75 2 dat <<= 1;
76 2 I2C_SCL = 1;
77 2 I2C_Delay();
78 2 I2C_SCL = 0;
79 2 I2C_Delay();
80 2 } while ( --t != 0 );
81 1 }
82
83
84 /*
85 函數(shù):I2C_Read()
86 功能:從從機讀取1個字節(jié)的數(shù)據(jù)
87 返回:讀取的一個字節(jié)數(shù)據(jù)
88 */
89 unsigned char I2C_Read()
90 {
91 1 unsigned char dat;
92 1 unsigned char t = 8;
93 1 I2C_SDA = 1; //在讀取數(shù)據(jù)之前,要把SDA拉高
94 1 do
95 1 {
96 2 I2C_SCL = 1;
97 2 I2C_Delay();
98 2 dat <<= 1;
99 2 if ( I2C_SDA ) dat |= 0x01;
100 2 I2C_SCL = 0;
101 2 I2C_Delay();
102 2 } while ( --t != 0 );
103 1 return dat;
104 1 }
105
106
107 /*
108 函數(shù):I2C_GetAck()
109 功能:讀取從機應(yīng)答位
110 返回:
111 0:從機應(yīng)答
112 1:從機非應(yīng)答
113 說明:
114 從機在收到每個字節(jié)的數(shù)據(jù)后,要產(chǎn)生應(yīng)答位
115 從機在收到最后1個字節(jié)的數(shù)據(jù)后,一般要產(chǎn)生非應(yīng)答位
116 */
117 bit I2C_GetAck()
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 3
118 {
119 1 bit ack;
120 1 I2C_SDA = 1;
121 1 I2C_Delay();
122 1 I2C_SCL = 1;
123 1 I2C_Delay();
124 1 ack = I2C_SDA;
125 1 I2C_SCL = 0;
126 1 I2C_Delay();
127 1 return ack;
128 1 }
129
130
131 /*
132 函數(shù):I2C_PutAck()
133 功能:主機產(chǎn)生應(yīng)答位或非應(yīng)答位
134 參數(shù):
135 ack=0:主機產(chǎn)生應(yīng)答位
136 ack=1:主機產(chǎn)生非應(yīng)答位
137 說明:
138 主機在接收完每一個字節(jié)的數(shù)據(jù)后,都應(yīng)當(dāng)產(chǎn)生應(yīng)答位
139 主機在接收完最后一個字節(jié)的數(shù)據(jù)后,應(yīng)當(dāng)產(chǎn)生非應(yīng)答位
140 */
141 void I2C_PutAck(bit ack)
142 {
143 1 I2C_SDA = ack;
144 1 I2C_Delay();
145 1 I2C_SCL = 1;
146 1 I2C_Delay();
147 1 I2C_SCL = 0;
148 1 I2C_Delay();
149 1 }
150
151
152 /*
153 函數(shù):I2C_Stop()
154 功能:產(chǎn)生I2C總線的停止?fàn)顟B(tài)
155 說明:
156 SCL處于高電平期間,當(dāng)SDA出現(xiàn)上升沿時停止I2C總線
157 不論SDA和SCL處于什么電平狀態(tài),本函數(shù)總能正確產(chǎn)生停止?fàn)顟B(tài)
158 本函數(shù)執(zhí)行后,I2C總線處于空閑狀態(tài)
159 */
160 void I2C_Stop()
161 {
162 1 unsigned int t = I2C_STOP_WAIT_VALUE;
163 1 I2C_SDA = 0;
164 1 I2C_Delay();
165 1 I2C_SCL = 1;
166 1 I2C_Delay();
167 1 I2C_SDA = 1;
168 1 I2C_Delay();
169 1 while ( --t != 0 ); //在下一次產(chǎn)生Start之前,要加一定的延時
170 1 }
171
172
173 /*
174 函數(shù):I2C_Puts()
175 功能:主機通過I2C總線向從機發(fā)送多個字節(jié)的數(shù)據(jù)
176 參數(shù):
177 SlaveAddr:從機地址(高7位是從機地址,最低位是寫標(biāo)志0)
178 SubAddr:從機的子地址
179 Size:數(shù)據(jù)的字節(jié)數(shù)
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 4
180 *dat:要發(fā)送的數(shù)據(jù)
181 返回:
182 0:發(fā)送成功
183 1:在發(fā)送過程中出現(xiàn)異常
184 */
185 bit I2C_Puts(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
186 {
187 1 //檢查長度
188 1 if ( Size == 0 ) return 0;
189 1 //確保從機地址最低位是0
190 1 SlaveAddr &= 0xFE;
191 1 //啟動I2C總線
192 1 I2C_Start();
193 1 //發(fā)送從機地址
194 1 I2C_Write(SlaveAddr);
195 1 if ( I2C_GetAck() )
196 1 {
197 2 I2C_Stop();
198 2 return 1;
199 2 }
200 1 //發(fā)送子地址
201 1 I2C_Write(SubAddr);
202 1 if ( I2C_GetAck() )
203 1 {
204 2 I2C_Stop();
205 2 return 1;
206 2 }
207 1 //發(fā)送數(shù)據(jù)
208 1 do
209 1 {
210 2 I2C_Write(*dat++);
211 2 if ( I2C_GetAck() )
212 2 {
213 3 I2C_Stop();
214 3 return 1;
215 3 }
216 2 } while ( --Size != 0 );
217 1 //發(fā)送完畢,停止I2C總線,并返回結(jié)果
218 1 I2C_Stop();
219 1 return 0;
220 1 }
221
222
223 /*
224 函數(shù):I2C_Put()
225 功能:主機通過I2C總線向從機發(fā)送1個字節(jié)的數(shù)據(jù)
226 參數(shù):
227 SlaveAddr:從機地址(高7位是從機地址,最低位是寫標(biāo)志0)
228 SubAddr:從機的子地址
229 dat:要發(fā)送的數(shù)據(jù)
230 返回:
231 0:發(fā)送成功
232 1:在發(fā)送過程中出現(xiàn)異常
233 */
234 bit I2C_Put(unsigned char SlaveAddr, unsigned char SubAddr, char dat)
235 {
236 1 return I2C_Puts(SlaveAddr,SubAddr,1,&dat);
237 1 }
238
239
240 /*
241 函數(shù):I2C_Gets()
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 5
242 功能:主機通過I2C總線從從機接收多個字節(jié)的數(shù)據(jù)
243 參數(shù):
244 SlaveAddr:從機地址(高7位是從機地址,最低位是讀標(biāo)志1)
245 SubAddr:從機的子地址
246 Size:數(shù)據(jù)的字節(jié)數(shù)
247 *dat:保存接收到的數(shù)據(jù)
248 返回:
249 0:接收成功
250 1:在接收過程中出現(xiàn)異常
251 */
252 bit I2C_Gets(unsigned char SlaveAddr, unsigned char SubAddr, unsigned char Size, char *dat)
253 {
254 1 //檢查長度
255 1 if ( Size == 0 ) return 0;
256 1 //確保從機地址最低位是0
257 1 SlaveAddr &= 0xFE; //確保最低位是0
258 1 //啟動I2C總線
259 1 I2C_Start();
260 1 //發(fā)送從機地址
261 1 I2C_Write(SlaveAddr);
262 1 if ( I2C_GetAck() )
263 1 {
264 2 I2C_Stop();
265 2 return 1;
266 2 }
267 1 //發(fā)送子地址
268 1 I2C_Write(SubAddr);
269 1 if ( I2C_GetAck() )
270 1 {
271 2 I2C_Stop();
272 2 return 1;
273 2 }
274 1 //發(fā)送重復(fù)起始條件
275 1 I2C_Start();
276 1 //發(fā)送從機地址
277 1 SlaveAddr |= 0x01;
278 1 I2C_Write(SlaveAddr);
279 1 if ( I2C_GetAck() )
280 1 {
281 2 I2C_Stop();
282 2 return 1;
283 2 }
284 1 //接收數(shù)據(jù)
285 1 for (;;)
286 1 {
287 2 *dat++ = I2C_Read();
288 2 if ( --Size == 0 )
289 2 {
290 3 I2C_PutAck(1);
291 3 break;
292 3 }
293 2 I2C_PutAck(0);
294 2 }
295 1 //接收完畢,停止I2C總線,并返回結(jié)果
296 1 I2C_Stop();
297 1 return 0;
298 1 }
299
300
301 /*
302 函數(shù):I2C_Get()
303 功能:主機通過I2C總線從從機接收1個字節(jié)的數(shù)據(jù)
C51 COMPILER V7.09 I2C 12/05/2007 16:14:14 PAGE 6
304 參數(shù):
305 SlaveAddr:從機地址(高7位是從機地址,最低位是讀標(biāo)志1)
306 SubAddr:從機的子地址
307 *dat:保存接收到的數(shù)據(jù)
308 返回:
309 0:接收成功
310 1:在接收過程中出現(xiàn)異常
311 */
312 bit I2C_Get(unsigned char SlaveAddr, unsigned char SubAddr, char *dat)
313 {
314 1 return I2C_Gets(SlaveAddr,SubAddr,1,dat);
315 1 }
316
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 415 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 16
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -