📄 i2c.lst
字号:
228 2
229 2 }
230 1 else
231 1 {
232 2 Delay_0_5us(4);
233 2 Delay_0_5us(4);
234 2 }
235 1
236 1 WritePinSCL(); //9 clock
237 1
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 5
238 1 // ReadPinSDA(t) //first read
239 1
240 1 if(iHighMode)
241 1 Delay_0_5us(1);
242 1 else
243 1 Delay_0_5us(4);
244 1
245 1
246 1 t=ReadPinSDA(); //second read
247 1
248 1 if(t==1)
249 1 ack=0;
250 1 else
251 1 ack=1; /*判断是否接收到应答信号*/
252 1
253 1
254 1 if(iHighMode)
255 1 Delay_0_5us(1);
256 1 else
257 1 Delay_0_5us(4);
258 1 ClearPinSCL(); //钳住总线 9 clock end
259 1
260 1
261 1
262 1 if(iHighMode)
263 1 Delay_0_5us(1);
264 1 else
265 1 Delay_0_5us(4);
266 1 return ack;
267 1 }
268
269
270 /*******************************************************************
271 字节数据传送函数
272 函数原型: BYTE I2cRcvByte();
273 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
274 发完后请用应答函数。
275 ********************************************************************/
276 static BYTE I2cRcvByte()
277 {
278 1 BYTE retc;
279 1 BYTE BitCnt;
280 1 BOOL t;
281 1
282 1 retc=0;
283 1
284 1 WritePinSDA(); /*置数据线为输入方式*/
285 1 setSDAin();
286 1 for(BitCnt=0;BitCnt<8;BitCnt++)
287 1 {
288 2 ClearPinSCL(); /*置时钟线为低,准备接收数据位*/
289 2 if(iHighMode) /*保证时钟高电平周期大于4μs*/
290 2 Delay_0_5us(2);
291 2 else
292 2 Delay_0_5us(8);
293 2
294 2
295 2 WritePinSCL(); /*置时钟线为高使数据线上数据有效*/
296 2
297 2 if(iHighMode)
298 2 Delay_0_5us(2);
299 2 else
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 6
300 2 Delay_0_5us(8);
301 2
302 2 retc=retc<<1;
303 2 t=ReadPinSDA();
304 2
305 2 if(t==1)
306 2 retc=retc+1; /*读数据位,接收的数据位放入retc中 */
307 2
308 2 }
309 1 ClearPinSCL();
310 1 Delay_0_5us(2);
311 1 return(retc);
312 1 }
313
314
315
316 /********************************************************************
317 应答子函数
318 原型: void Ack_I2c(BOOL a);
319
320 功能:主控器进行应答信号,(可以是应答或非应答信号)
321 ********************************************************************/
322 static void Ack_I2c(BOOL a)
323 {
324 1 setSDAout();
325 1 if(a==0)
326 1 ClearPinSDA(); /*在此发出应答或非应答信号 */
327 1 else
328 1 WritePinSDA();
329 1 Delay_0_5us(3);
330 1
331 1 WritePinSCL();
332 1 Delay_0_5us(10);
333 1 /*时钟低电平周期大于4μs*/
334 1 ClearPinSCL(); /*清时钟线,钳住I2C总线以便继续接收*/
335 1 Delay_0_5us(2);
336 1 }
337
338
339
340 /*******************************************************************
341 向有子地址器件发送多字节数据函数
342 函数原型: BOOL I2c_SendStr(BYTE sla,BYTE *s,WORD no);
343 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
344 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
345 如果返回1表示操作成功,否则操作有误。
346 注意: 使用前必须已结束总线。
347 ********************************************************************/
348 BYTE I2c_SendStr(BYTE sla,BYTE *s,WORD no)
349 {
350 1 BYTE i;
351 1 BOOL ack;
352 1
353 1 #if COMENINT==1
vDisableIsrs();//add
#endif
356 1 Start_I2c(); /*启动总线*/
357 1 sla = sla;// << 1;
358 1 ack = I2cSendByte(sla); /*发送器件地址*/
359 1 if(ack==0)
360 1 {
361 2 Stop_I2c();
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 7
362 2 #if COMENINT==1
vEnableIsrs();//add
#endif
365 2 return 0xff; //slave ack not exist
366 2 }
367 1
368 1 for(i=0;i<no;i++)
369 1 {
370 2 ack=I2cSendByte(*s); /*发送数据*/
371 2 /* if(ack==0)
372 2 {
373 2 Stop_I2c();
374 2 #if COMENINT==1
375 2 vEnableIsrs();//add
376 2 #endif
377 2 return(i+1); //error byte index
378 2 } */
379 2 s++;
380 2 }
381 1 Stop_I2c(); /*结束总线*/
382 1 #if COMENINT==1
vEnableIsrs();//add
#endif
385 1 return(0);
386 1 }
387
388
389 /*******************************************************************
390 向有子地址器件读取多字节数据函数
391 函数原型: BOOL I2c_RcvStr(BYTE sla,BYTE *s,WORD Len);
392 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
393 地址sla,子地址suba,读出的内容放入s指向的存储区,读Len个字节。
394 如果返回1表示操作成功,否则操作有误。
395 注意: 使用前必须已结束总线。
396 ********************************************************************/
397 BYTE I2c_RcvStr(BYTE sla,BYTE *s,WORD Len)
398 {
399 1 WORD i;
400 1 BOOL ack;
401 1
402 1 #if COMENINT==1
vDisableIsrs();//add
#endif
405 1 Start_I2c(); /*启动总线*/
406 1 sla=sla+1;
407 1 ack=I2cSendByte(sla);
408 1 if(ack==0) //slave ack not exist
409 1 {
410 2 Stop_I2c();
411 2 #if COMENINT==1
vEnableIsrs();//add
#endif
414 2 return(0xff);
415 2 }
416 1
417 1
418 1 for(i=0;i<Len-1;i++)
419 1 {
420 2 *s=I2cRcvByte(); /*读取数据*/
421 2 Ack_I2c(0); /*发送就答位*/
422 2 s++;
423 2 }
C51 COMPILER V7.02b I2C 08/28/2006 18:59:06 PAGE 8
424 1 *s=I2cRcvByte();
425 1 Ack_I2c(1); /*发送非应位*/
426 1 Stop_I2c(); /*结束总线*/
427 1
428 1 #if COMENINT==1
vEnableIsrs();//add
#endif
431 1 return(0);
432 1 }
433
434 #elif (IIC_USED==0 )//!SW_IIC both SW_IIC and HW_IIC are not needed, define dummy functions
BYTE BusSlvAdr=0x62; //default I2c bus slave address for communiction
void I2c_Init( )
{
}
void I2c_Sel( BYTE SlvAdr,BOOL isHigh)
{
}
BYTE I2c_SendStr(BYTE sla,BYTE *s,WORD no)
{
}
BYTE I2c_RcvStr(BYTE sla,BYTE *s,WORD no)
{
}
#endif //SW_IIC
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 586 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 2 15
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -