_iic.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:3k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. #include "_iic.h"      
  10. #define I2CDELAY(iterations)  {      
  11.     volatile Int j;                  
  12.     for(j = 0; j < iterations; j ++); 
  13. }   
  14. #define DELAY_TIME 1000
  15. static const I2C_Config EVM642VIDEOIIC_Config = {
  16.     0,  /* master mode,  i2coar;   */
  17.     0,  /* no interrupt, i2cimr;   */
  18.     (20-5), /* scl low time, i2cclkl;  */
  19.     (20-5), /* scl high time,i2cclkh;  */
  20.     1,  /* configure later, i2ccnt;*/
  21.     0,  /* configure later, i2csar;*/
  22.     0x4620, /* master tx mode,     */
  23.             /* i2c runs free,      */
  24.             /* 8-bit data + NACK   */
  25.             /* no repeat mode      */
  26.     (75-1), /* 4MHz clock, i2cpsc  */
  27. };
  28. /*
  29.  * ======== _IIC_write ========
  30.  * This function performs write operation via I2C bus.
  31.  */
  32. void _IIC_write(I2C_Handle hI2C,
  33.               Uint8 devAddress,
  34.               Uint32  subAddress,
  35.               Uint8 *data,
  36.               Uint16  numBytes
  37.               )
  38. {             
  39.     Int i;
  40.     I2C_Config prevIICConfig; 
  41.     
  42.     /* make sure handle is valid */
  43.     if(hI2C == INV) {
  44.         return;
  45.     }
  46.     
  47.     /* Wait until bus is free */
  48.     while (I2C_bb(hI2C));
  49.     /* save old settings */
  50.     I2C_getConfig(hI2C, &prevIICConfig);
  51.     /* set I2C mode register */
  52.     I2C_RSETH(hI2C, I2CMDR, EVM642VIDEOIIC_Config.i2cmdr);
  53.     
  54.     /* set I2C imr register  */
  55.     I2C_RSETH(hI2C, I2CIMR, EVM642VIDEOIIC_Config.i2cimr);
  56.     
  57.     /* configure the I2C slave address register */
  58.     I2C_RSETH(hI2C, I2CSAR, devAddress);
  59.     
  60.     /* set I2C count register */
  61.     I2C_RSETH(hI2C, I2CCNT, numBytes + 1);
  62.     
  63.     /* write the sub address */
  64.     I2C_RSETH(hI2C, I2CDXR, subAddress);
  65.     
  66.     /* Generate start condition */
  67.     I2C_start(hI2C);
  68.     
  69.     I2CDELAY(DELAY_TIME);
  70.     /* write the data */ 
  71.     for(i = 0; i < numBytes; i ++) {
  72.         while(!I2C_xrdy(hI2C));
  73.         I2C_writeByte(hI2C, *data ++);
  74.         I2CDELAY(DELAY_TIME);
  75.     }
  76.     /* Generate stop condition */
  77.     I2C_sendStop(hI2C); 
  78.     
  79.     I2CDELAY(DELAY_TIME);        
  80.     /* Wait until bus is free */
  81.     while (I2C_bb(hI2C));
  82.     I2CDELAY(DELAY_TIME);        
  83.     /* now restore the previous I2C settings */
  84.     
  85.     /* set I2C mode register */
  86.     I2C_RSETH(hI2C, I2CMDR, prevIICConfig.i2cmdr);
  87.     
  88.     /* set I2C imr register  */
  89.     I2C_RSETH(hI2C, I2CIMR, prevIICConfig.i2cimr);
  90.     
  91.     /* configure the I2C slave address register */
  92.     I2C_RSETH(hI2C, I2CSAR, prevIICConfig.i2csar);
  93.     
  94.     /* set I2C count register */
  95.     I2C_RSETH(hI2C, I2CCNT, prevIICConfig.i2ccnt);
  96.     I2CDELAY(DELAY_TIME);        
  97. }