📄 i2c.lst
字号:
332 /////////////////////////////////////////////////////////////////
333 void i2cBurstReadBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE* pBuf, BYTE ucBufLen)
334 {
335 1 BYTE ucDummy; // loop dummy
336 1
337 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
338 1 while (ucDummy--)
339 1 {
340 2 if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
341 2 continue;
342 2
343 2 if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
344 2 continue;
345 2
346 2 if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
347 2 continue;
348 2
349 2 while (ucBufLen--) // loop to burst read
350 2 {
351 3 *pBuf = i2c_ReceiveByte(ucBufLen); // receive byte
352 3
353 3 pBuf++; // next byte pointer
354 3 } // while
355 2
356 2 break;
357 2 } // while
358 1
359 1 i2c_Stop();
360 1 //Delay1ms(8);
361 1 }
362
363 /////////////////////////////////////////////////////////////////
C51 COMPILER V7.50 I2C 07/03/2006 14:17:07 PAGE 7
364 // I2C write bytes to device.
365 //
366 // Arguments: ucSlaveAdr - slave address
367 // ucSubAdr - sub address
368 // pBuf - pointer of buffer
369 // ucBufLen - length of buffer
370 /////////////////////////////////////////////////////////////////
371 void i2cBurstWriteBytes(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE* pBuf, BYTE ucBufLen)
372 {
373 1 BYTE ucDummy; // loop dummy
374 1
375 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
376 1 while (ucDummy--)
377 1 {
378 2 if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_WRITE) == FALSE)
379 2 {
380 3 //printf("\r\nIIC[%x] NG", ucSlaveAdr);
381 3 continue;
382 3 }
383 2
384 2 if (i2c_SendByte(ucSubAdr) == I2C_NON_ACKNOWLEDGE) // check non-acknowledge
385 2 continue;
386 2
387 2 while (ucBufLen--) // loop of writting data
388 2 {
389 3 i2c_SendByte(*pBuf); // send byte
390 3
391 3 pBuf++; // next byte pointer
392 3 } // while
393 2
394 2 break;
395 2 } // while
396 1
397 1 i2c_Stop();
398 1 }
399
400 /////////////////////////////////////////////////////////////////
401 // I2C read a byte from device.
402 //
403 // Arguments: ucSlaveAdr - slave address
404 // ucSubAdr - sub address
405 // Return value: read byte
406 /////////////////////////////////////////////////////////////////
407 BYTE i2cReadByte(BYTE ucSlaveAdr, BYTE ucSubAdr)
408 {
409 1 BYTE ucBuf; // byte buffer
410 1
411 1 i2cBurstReadBytes(ucSlaveAdr, ucSubAdr, &ucBuf, 1);
412 1 return ucBuf;
413 1 }
414
415 /////////////////////////////////////////////////////////////////
416 // I2C write a byte from device.
417 //
418 // Arguments: ucSlaveAdr - slave address
419 // ucSubAdr - sub address
420 // ucVal - write byte
421 /////////////////////////////////////////////////////////////////
422 void i2cWriteByte(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE ucVal)
423 {
424 1 i2cBurstWriteBytes(ucSlaveAdr, ucSubAdr, &ucVal, 1);
425 1 }
C51 COMPILER V7.50 I2C 07/03/2006 14:17:07 PAGE 8
426 # if 1
427 /////////////////////////////////////////////////////////////////
428 // I2C read a current byte from device.
429 //
430 // Arguments: ucSlaveAdr - slave address
431 // Return value: read byte
432 /////////////////////////////////////////////////////////////////
433 BYTE i2cReadCurrent(BYTE ucSlaveAdr)
434 {
435 1 BYTE ucDummy; // loop dummy
436 1 BYTE ucByte; // byte buffer
437 1
438 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
439 1 while (ucDummy--)
440 1 {
441 2 if (i2c_AccessStart(ucSlaveAdr, I2C_TRANS_READ) == FALSE)
442 2 continue;
443 2
444 2 ucByte = i2c_ReceiveByte(FALSE); // receive byte
445 2
446 2 break;
447 2 } // while
448 1
449 1 i2c_Stop();
450 1
451 1 return ucByte;
452 1 }
453
454 /////////////////////////////////////////////////////////////////
455 // I2C write a current byte to device.
456 //
457 // Arguments: ucSlaveAdr - slave address
458 // ucVal - write byte
459 /////////////////////////////////////////////////////////////////
460 #if (_DEBUG_TESTCOMMAND_EN_)
461 void i2cWriteCurrent(BYTE ucSlaveAdr, BYTE ucVal)
462 {
463 1 i2cBurstWriteBytes(ucSlaveAdr, ucVal, NULL, 0);
464 1 }
465 #endif
466
467 #endif
468 //////////////////////////////////////////////////////////////////////////////
469 // <Name>: msWrite2Bytes
470 //
471 // <Description>: Program i2c register bytes.
472 //
473 // <Parameter>: - <Flow> - <Description>
474 // ---------------------------------------------------------------------------
475 // ucSlaveAdr - In - slave address
476 // pTable - In - table pointer
477 //////////////////////////////////////////////////////////////////////////////
478 #if 1
479 void i2cWriteRegsTbl(BYTE ucSlaveAdr, RegUnitType code* pTable)
480 {
481 1 BYTE ucIndex; // register index
482 1
483 1 while (1)
484 1 {
485 2 ucIndex = pTable->ucIndex; // get register index
486 2 if (ucIndex == _END_OF_TBL_) // check end of table
487 2 break;
C51 COMPILER V7.50 I2C 07/03/2006 14:17:07 PAGE 9
488 2
489 2 i2cBurstWriteBytes(ucSlaveAdr, ucIndex, &pTable->ucValue, 1); // write register
490 2
491 2 pTable++; // next
492 2 } // while
493 1 }
494 #endif
495
496 static bit wait_IIC()
497 {
498 1 bit err = 0;
499 1 BYTE counter = 0;
500 1
501 1 while ((INTFLG & 0x01) == 0) // Wait for MBUFl
502 1 {
503 2 if (++counter > 80)
504 2 {
505 3 err = 1;
506 3 break;
507 3 }
508 2 }
509 1
510 1 if ((IICSTUSL & 0x01) != 0) // No Ack receieved from IIC slave device
511 1 err = 1;
512 1
513 1 INTFLG = 0;
514 1
515 1 return(err);
516 1 }
517
518 static NOP()
519 {
520 1 }
521 #if 1///520
522 BYTE i2cReadByte2(BYTE ucSlaveAdr, BYTE ucSubAdr)
523 {
524 1 bit error;BYTE temp;
525 1 PADMOD2 = 0x47;
526 1 OPTION = 0x62;
527 1
528 1 INTFLG = INTFLG & 0xfe;//Clear Master IIC bus interrupt flag
529 1 //start
530 1 IICCTR = 0x00; // S=0,P=0
531 1 MBUF = ucSlaveAdr; // slave address (dummy write)
532 1 NOP();
533 1 IICCTR = 0x01; // S=1,P=0
534 1 error = wait_IIC();
535 1 MBUF = ucSubAdr; //address
536 1 error = wait_IIC();
537 1 //restart
538 1 IICCTR = IICCTR & 0xfe; // S set 0
539 1 MBUF = ucSlaveAdr | 0x01; //restart + slave address (read)
540 1 NOP();
541 1 IICCTR = IICCTR | 0x01; // S set 1
542 1 error = wait_IIC();
543 1 IICCTR = 0x05; //Ack=1
544 1 //dummy read
545 1 temp = MBUF;
546 1 error = wait_IIC();
547 1
548 1 temp = MBUF;
549 1 IICCTR = 0x00;
C51 COMPILER V7.50 I2C 07/03/2006 14:17:07 PAGE 10
550 1 NOP();
551 1 IICCTR = IICCTR | 0x02; //P rise
552 1
553 1 PADMOD2 = 0x07;
554 1
555 1 i2cSCL_PIN = 1;//P7_7
556 1 i2cSDA_PIN = 1;//P3_4
557 1
558 1 return(temp);
559 1 }
560 #endif
561
562 #if( ENABLE_CC_VCHIP )
563 void i2cBurstReadBytes2(BYTE ucSlaveAdr, BYTE ucSubAdr, BYTE* pBuf, BYTE ucBufLen)
564 {
565 1 BYTE ucDummy; // loop dummy
566 1 bit error;
567 1 PADMOD2 = 0x47;
568 1 OPTION = 0x62;
569 1
570 1 ucDummy = I2C_ACCESS_DUMMY_TIME;
571 1 while (ucDummy--)
572 1 {
573 2 INTFLG = INTFLG & 0xfe;//Clear Master IIC bus interrupt flag
574 2 //start
575 2 IICCTR = 0x00; // S=0,P=0
576 2 MBUF = ucSlaveAdr; // slave address (dummy write)
577 2 NOP();
578 2 IICCTR = 0x01; // S=1,P=0
579 2 error = wait_IIC();
580 2 if (error)
581 2 continue;
582 2 MBUF = ucSubAdr; //address
583 2 error = wait_IIC();
584 2 if (error)
585 2 continue;
586 2 //restart
587 2 IICCTR = IICCTR & 0xfe; // S set 0
588 2 MBUF = ucSlaveAdr | 0x01; //restart + slave address (read)
589 2 NOP();
590 2 IICCTR = IICCTR | 0x01; // S set 1
591 2 error = wait_IIC();
592 2 if (error)
593 2 continue;
594 2
595 2 //dummy read
596 2 *pBuf = MBUF;
597 2 error = wait_IIC();
598 2 if (error)
599 2 continue;
600 2 ucBufLen--;
601 2 while (ucBufLen--) // loop to burst read
602 2 {
603 3 if (ucBufLen == 0)
604 3 IICCTR = 0x05; //Ack=1
605 3 *pBuf++ = MBUF; // receive byte
606 3 error = wait_IIC();
607 3 if (error)
608 3 break;
609 3 } // while
610 2 if (error)
611 2 continue;
C51 COMPILER V7.50 I2C 07/03/2006 14:17:07 PAGE 11
612 2 //stop
613 2 IICCTR = 0x00;
614 2 NOP();
615 2 IICCTR = IICCTR | 0x02; //P rise
616 2 break;
617 2 } // while
618 1
619 1
620 1 PADMOD2 = 0x07;
621 1
622 1 i2cSCL_PIN = 1;//P7_7
623 1 i2cSDA_PIN = 1;//P3_4
624 1 }
625 #endif
626
627 #if 0//_EEPROM_TYPE == RM_TYPE_24C32)
#if ((ENABLE_HDMI_SOURCE))
BOOL PingIC(BYTE ucSlaveAdr)
{
BOOL bStatus = TRUE;
//printf("\r\n Slave=%x", ucSlaveAdr);
if ((ucSlaveAdr & 0xF0) == 0xA0)//RM_DEVICE_ADR
s_I2CSel = 1;
else
s_I2CSel = 0;//default
//ucSlaveAdr &= (~_BIT0); // read
if (i2c_Start() == FALSE)
{
bStatus = FALSE;
//putstr("\r\n start error");
}
if (i2c_SendByte(ucSlaveAdr) == _HIGH)
{
bStatus = FALSE;
//putstr("\r\n ping error");
}
i2c_Stop();
return bStatus;
}
#endif
#endif
656
657
658
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1075 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 31
IDATA SIZE = ---- ----
BIT SIZE = ---- 8
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -