⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.lst

📁 使用于克隆器
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -