92. _delay_5us(5); 93.
94. GPIO_WriteHigh(I2C_PORT, I2CSCL); 95.
96. _delay_5us(5); 97.
98. GPIO_WriteHigh(I2C_PORT, I2CSDA);
99. 100. } 101.
102. //*************************************************************** 103.
104. //ROUTINE NAME : I2C_Ack 105.
106. //INPUT/OUTPUT : None. 107.
108. //DESCRIPTION : Acknoledge generation from now. 109.
110. //COMMENTS : Transfer sequence = DATA, ACK.
111.
112. //*************************************************************** 113.
114. void I2C_Rack(void) 115. 116. { 117.
118. GPIO_WriteLow(I2C_PORT, I2CSDA); 119.
120. _delay_5us(5); 121.
122. GPIO_WriteHigh(I2C_PORT, I2CSCL);
123.
124. _delay_5us(5); 125.
126. GPIO_WriteLow(I2C_PORT, I2CSCL); 127.
128. _delay_5us(5); 129. 130. } 131. 132.
133. //*************************************************************** 134.
135. //ROUTINE NAME : I2C_nAck 136.
137. //INPUT/OUTPUT : None. 138.
139. //DESCRIPTION : Non acknoledge generation from now. 140.
141. //COMMENTS : Transfer sequence = DATA, NACK. 142.
143. //*************************************************************** 144.
145. void I2C_nAck (void) 146. 147. { 148.
149. GPIO_WriteHigh(I2C_PORT, I2CSDA); 150.
151. _delay_5us(5); 152.
153. GPIO_WriteHigh(I2C_PORT, I2CSCL); 154.
155. _delay_5us(5); 156.
157. GPIO_WriteLow(I2C_PORT, I2CSCL); 158.
159. _delay_5us(5); 160. 161. }
162.
163. //*************************************************************** 164.
165. // Send a byte to the slave 写一个数据没有应答
166.
167. // return I2C_ERR OR I2C_CRR 168.
169. //*************************************************************** 170.
171. bool SendByte(UCHAR I2cData) 172. 173. {
174.
175. UCHAR i; 176.
177. bool I2CStatus; 178. 179.
180. for(i=0; i<8; i++) 181. 182. { 183.
184. GPIO_WriteLow(I2C_PORT, I2CSCL); 185.
186. _delay_5us(5); 187.
188. if(I2cData & 0x80) 189.
190. {GPIO_WriteHigh(I2C_PORT, I2CSDA);} 191.
192. else 193.
194. {GPIO_WriteLow(I2C_PORT, I2CSDA);} 195.
196. GPIO_WriteHigh(I2C_PORT, I2CSCL); 197.
198. _delay_5us(5); 199.
200. I2cData <<= 1;
201. 202. } 203.
204. GPIO_WriteLow(I2C_PORT, I2CSCL); 205.
206. GPIO_WriteHigh(I2C_PORT, I2CSDA);//发送完一字节,接收应答 207. 208. 209.
210. I2CDataInOut(I2CDataIn); 211. 212.
213. GPIO_WriteHigh(I2C_PORT, I2CSCL); 214.
215. _delay_5us(5); 216.
217. if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 0) 218.
219. { 220.
221. I2CStatus = I2C_CRR; 222.
223. } 224.
225. else 226.
227. { 228.
229. I2CStatus = I2C_ERR; 230.
231. } 232.
233. I2CDataInOut(I2CDataOut); 234.
235. return I2CStatus; 236.
237. } 238. 239.
240. //*************************************************************** 241.
242. //ROUTINE NAME : I2Cm_RxData 243.
244. //INPUT/OUTPUT : Last byte to receive flag (active high)/Received data byte
.
245.
246. //DESCRIPTION : Receive a data byte. 247.
248. //COMMENTS : Transfer sequence = DATA, ACK, EV7... 249.
250. //*************************************************************** 251.
252. UCHAR RcvByte(void) 253.
254. { 255.
256. UCHAR i; 257.
258. UCHAR ReadByte=0; 259.
260. GPIO_WriteHigh(I2C_PORT, I2CSDA); 261. 262.
263. I2CDataInOut(I2CDataIn); 264.
265. _delay_5us(10); 266.
267. for(i=0; i<8; i++) 268. 269. { 270.
271. ReadByte <<= 1; 272.
273. GPIO_WriteLow(I2C_PORT, I2CSCL); 274.
275. _delay_5us(5); 276.
277. GPIO_WriteHigh(I2C_PORT, I2CSCL); 278.
279. _delay_5us(5); 280. 281.
282. if(GPIO_ReadInputPin(I2C_PORT,I2CSDA) == 1) 283.
284. {ReadByte |= 0x01;} 285.
286. _delay_5us(5);
287.
288. } 289.
290. GPIO_WriteLow(I2C_PORT, I2CSCL); 291.
292. I2CDataInOut(I2CDataOut); 293.
294. _delay_5us(10);
295.
296. return ReadByte; 297. 298. } 299. 300.
301. /******************************************************* 302.
303. 读N个数据,参数:?
304.
305. wrDAdr: write device-address 写器件地址?? 306.
307. wordAdr: word address 读数据的寄存器地址?? 308.
309. rdDAdr: read device-address 读器件地址 310.
311. *pRdDat: p->read data 读数据指针 312.
313. num: number 需要读数据的个数
314.
315. *******************************************************/ 316.
317. bool I2C_Read(UCHAR wrDAdr,UCHAR wordAdr,UCHAR *pRdDat,UCHAR num) 318. 319. { 320.
321. bool I2CAck; 322.
323. UCHAR i=0; 324.
325. UCHAR rdDAdr;
326.
327. rdDAdr = wrDAdr+1; //读器件地址为写地址加1 328.
329. I2C_Start(); /*启动I2C*/
330.
331. _delay_5us(5); 332.
333. I2CAck = SendByte(wrDAdr); /*发写器件地址*/ 334.
335. if(!I2CAck) 336. 337. {
338.
339. return I2C_ERR; 340. 341. } 342.
343. I2CAck = SendByte(wordAdr); /*发寄存器地址*/ 344.
345. if(!I2CAck)