?? 51 c
字號:
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\obj\i2c.obj
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND PRINT(.\obj\i2c.lst) OBJECT(.\obj\i2c.obj)
stmt level source
1 /*-----------------------------------------------
2 名稱:IIC協議
3 論壇:www.doflye.net
4 編寫:shifang
5 修改:無
6 內容:函數是采用軟件延時的方法產生SCL脈沖,固對高晶振頻率要作 一定的修改....(本例是1us機器
7 周期,即晶振頻率要小于12MHZ)
8 ------------------------------------------------*/
9
10
11 #include "i2c.h"
12 #include "delay.h"
13
14 #define _Nop() _nop_() //定義空指令
15
16 bit ack; //應答標志位
17
18 sbit SDA=P2^1;
19 sbit SCL=P2^0;
20
21 /*------------------------------------------------
22 啟動總線
23 ------------------------------------------------*/
24 void Start_I2c()
25 {
26 1 SDA=1; //發送起始條件的數據信號
27 1 _Nop();
28 1 SCL=1;
29 1 _Nop(); //起始條件建立時間大于4.7us,延時
30 1 _Nop();
31 1 _Nop();
32 1 _Nop();
33 1 _Nop();
34 1 SDA=0; //發送起始信號
35 1 _Nop(); //起始條件鎖定時間大于4μ
36 1 _Nop();
37 1 _Nop();
38 1 _Nop();
39 1 _Nop();
40 1 SCL=0; //鉗住I2C總線,準備發送或接收數據
41 1 _Nop();
42 1 _Nop();
43 1 }
44 /*------------------------------------------------
45 結束總線
46 ------------------------------------------------*/
47 void Stop_I2c()
48 {
49 1 SDA=0; //發送結束條件的數據信號
50 1 _Nop(); //發送結束條件的時鐘信號
51 1 SCL=1; //結束條件建立時間大于4μ
52 1 _Nop();
53 1 _Nop();
54 1 _Nop();
55 1 _Nop();
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 2
56 1 _Nop();
57 1 SDA=1; //發送I2C總線結束信號
58 1 _Nop();
59 1 _Nop();
60 1 _Nop();
61 1 _Nop();
62 1 }
63
64
65
66
67 /*----------------------------------------------------------------
68 字節數據傳送函數
69 函數原型: void SendByte(unsigned char c);
70 功能: 將數據c發送出去,可以是地址,也可以是數據,發完后等待應答,并對
71 此狀態位進行操作.(不應答或非應答都使ack=0 假)
72 發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
73 ------------------------------------------------------------------*/
74 void SendByte(unsigned char c)
75 {
76 1 unsigned char BitCnt;
77 1
78 1 for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
79 1 {
80 2 if((c<<BitCnt)&0x80)SDA=1; //判斷發送位
81 2 else SDA=0;
82 2 _Nop();
83 2 SCL=1; //置時鐘線為高,通知被控器開始接收數據位
84 2 _Nop();
85 2 _Nop(); //保證時鐘高電平周期大于4μ
86 2 _Nop();
87 2 _Nop();
88 2 _Nop();
89 2 SCL=0;
90 2 }
91 1
92 1 _Nop();
93 1 _Nop();
94 1 SDA=1; //8位發送完后釋放數據線,準備接收應答位
95 1 _Nop();
96 1 _Nop();
97 1 SCL=1;
98 1 _Nop();
99 1 _Nop();
100 1 _Nop();
101 1 if(SDA==1)ack=0;
102 1 else ack=1; //判斷是否接收到應答信號
103 1 SCL=0;
104 1 _Nop();
105 1 _Nop();
106 1 }
107
108
109
110
111
112
113
114 /*----------------------------------------------------------------
115 字節數據傳送函數
116 函數原型: unsigned char RcvByte();
117 功能: 用來接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 3
118 發完后請用應答函數。
119 ------------------------------------------------------------------*/
120 unsigned char RcvByte()
121 {
122 1 unsigned char retc;
123 1 unsigned char BitCnt;
124 1
125 1 retc=0;
126 1 SDA=1; //置數據線為輸入方式
127 1 for(BitCnt=0;BitCnt<8;BitCnt++)
128 1 {
129 2 _Nop();
130 2 SCL=0; //置時鐘線為低,準備接收數據位
131 2 _Nop();
132 2 _Nop(); //時鐘低電平周期大于4.7us
133 2 _Nop();
134 2 _Nop();
135 2 _Nop();
136 2 SCL=1; //置時鐘線為高使數據線上數據有效
137 2 _Nop();
138 2 _Nop();
139 2 retc=retc<<1;
140 2 if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
141 2 _Nop();
142 2 _Nop();
143 2 }
144 1 SCL=0;
145 1 _Nop();
146 1 _Nop();
147 1 return(retc);
148 1 }
149
150
151
152 /*----------------------------------------------------------------
153 應答子函數
154 原型: void Ack_I2c(void);
155
156 ----------------------------------------------------------------*/
157 /*void Ack_I2c(void)
158 {
159
160 SDA=0;
161 _Nop();
162 _Nop();
163 _Nop();
164 SCL=1;
165 _Nop();
166 _Nop(); //時鐘低電平周期大于4μ
167 _Nop();
168 _Nop();
169 _Nop();
170 SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收
171 _Nop();
172 _Nop();
173 }*/
174 /*----------------------------------------------------------------
175 非應答子函數
176 原型: void NoAck_I2c(void);
177
178 ----------------------------------------------------------------*/
179 void NoAck_I2c(void)
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 4
180 {
181 1
182 1 SDA=1;
183 1 _Nop();
184 1 _Nop();
185 1 _Nop();
186 1 SCL=1;
187 1 _Nop();
188 1 _Nop(); //時鐘低電平周期大于4μ
189 1 _Nop();
190 1 _Nop();
191 1 _Nop();
192 1 SCL=0; //清時鐘線,鉗住I2C總線以便繼續接收
193 1 _Nop();
194 1 _Nop();
195 1 }
196
197
198
199
200
201
202 /*----------------------------------------------------------------
203 向無子地址器件發送字節數據函數
204 函數原型: bit ISendByte(unsigned char sla,ucahr c);
205 功能: 從啟動總線到發送地址,數據,結束總線的全過程,從器件地址sla.
206 如果返回1表示操作成功,否則操作有誤。
207 注意: 使用前必須已結束總線。
208 ----------------------------------------------------------------*/
209 /*bit ISendByte(unsigned char sla,unsigned char c)
210 {
211 Start_I2c(); //啟動總線
212 SendByte(sla); //發送器件地址
213 if(ack==0)return(0);
214 SendByte(c); //發送數據
215 if(ack==0)return(0);
216 Stop_I2c(); //結束總線
217 return(1);
218 }
219 */
220
221 /*----------------------------------------------------------------
222 向有子地址器件發送多字節數據函數
223 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
224 功能: 從啟動總線到發送地址,子地址,數據,結束總線的全過程,從器件
225 地址sla,子地址suba,發送內容是s指向的內容,發送no個字節。
226 如果返回1表示操作成功,否則操作有誤。
227 注意: 使用前必須已結束總線。
228 ----------------------------------------------------------------*/
229 /*bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
230 {
231 unsigned char i;
232 for(i=0;i<no;i++)
233 {
234 Start_I2c(); //啟動總線
235 SendByte(sla); //發送器件地址
236 if(ack==0)return(0);
237 SendByte(suba); //發送器件子地址
238 if(ack==0)return(0);
239
240 SendByte(*s); //發送數據
241 if(ack==0)return(0);
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 5
242 Stop_I2c(); //結束總線
243 DelayMs(1); //必須延時等待芯片內部自動處理數據完畢
244 s++;
245 suba++;
246 }
247 return(1);
248 }
249 */
250 /*----------------------------------------------------------------
251 向無子地址器件讀字節數據函數
252 函數原型: bit IRcvByte(unsigned char sla,ucahr *c);
253 功能: 從啟動總線到發送地址,讀數據,結束總線的全過程,從器件地
254 址sla,返回值在c.
255 如果返回1表示操作成功,否則操作有誤。
256 注意: 使用前必須已結束總線。
257 ----------------------------------------------------------------*/
258 /*bit IRcvByte(unsigned char sla,unsigned char *c)
259 {
260 Start_I2c(); //啟動總線
261 SendByte(sla+1); //發送器件地址
262 if(ack==0)return(0);
263 *c=RcvByte(); //讀取數據
264 NoAck_I2c(); //發送非就答位
265 Stop_I2c(); //結束總線
266 return(1);
267 }
268
269 */
270 /*----------------------------------------------------------------
271 向有子地址器件讀取多字節數據函數
272 函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
273 功能: 從啟動總線到發送地址,子地址,讀數據,結束總線的全過程,從器件
274 地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個字節。
275 如果返回1表示操作成功,否則操作有誤。
276 注意: 使用前必須已結束總線。
277 ----------------------------------------------------------------*/
278 /*bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
279 {
280 unsigned char i;
281
282 Start_I2c(); //啟動總線
283 SendByte(sla); //發送器件地址
284 if(ack==0)return(0);
285 SendByte(suba); //發送器件子地址
286 if(ack==0)return(0);
287
288 Start_I2c();
289 SendByte(sla+1);
290 if(ack==0)return(0);
291
292 for(i=0;i<no-1;i++)
293 {
294 *s=RcvByte(); //發送數據
295 Ack_I2c(); //發送就答位
296 s++;
297 }
298 *s=RcvByte();
299 NoAck_I2c(); //發送非應位
300 Stop_I2c(); //結束總線
301 return(1);
302 }
303 */
C51 COMPILER V7.06 I2C 06/08/2010 12:52:36 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 152 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -