si1147_i2c.c

Go to the documentation of this file.
00001 /***************************************************************************/
00018 #include "i2cdrv.h"
00019 #include "si1147_i2c.h"
00020 
00021 /*******************************************************************************
00022  *******************************   DEFINES   ***********************************
00023  ******************************************************************************/
00024 
00025 
00026 /*******************************************************************************
00027  **************************   GLOBAL FUNCTIONS   *******************************
00028  ******************************************************************************/
00029 
00030 
00031 
00032 /**************************************************************************/
00047 int Si1147_Read_Register (I2C_TypeDef *i2c,uint8_t addr, uint8_t reg, uint8_t *data)
00048 {
00049   I2C_TransferSeq_TypeDef    seq;
00050   I2C_TransferReturn_TypeDef ret;
00051   uint8_t i2c_write_data[1];
00052 
00053   /* Unused parameter */
00054   (void) i2c;
00055 
00056   seq.addr  = addr;
00057   seq.flags = I2C_FLAG_WRITE_READ;
00058   /* Select register to start reading from */
00059   i2c_write_data[0] = reg;
00060   seq.buf[0].data = i2c_write_data;
00061   seq.buf[0].len  = 1;
00062   /* Select length of data to be read */
00063   seq.buf[1].data = data;
00064   seq.buf[1].len  = 1;
00065 
00066   ret = I2CDRV_Transfer(&seq);
00067   if (ret != i2cTransferDone)
00068   {
00069     *data = 0xff;
00070     return((int) ret);
00071   }
00072 
00073   return((int) 1);
00074 }
00075 
00076 /**************************************************************************/
00091 int Si1147_Write_Register (I2C_TypeDef *i2c,uint8_t addr, uint8_t reg, uint8_t data)
00092 {
00093   I2C_TransferSeq_TypeDef    seq;
00094   I2C_TransferReturn_TypeDef ret;
00095   uint8_t i2c_write_data[2];
00096   uint8_t i2c_read_data[1];
00097   /* Unused parameter */
00098   (void) i2c;
00099 
00100   seq.addr  = addr;
00101   seq.flags = I2C_FLAG_WRITE;
00102   /* Select register and data to write */
00103   i2c_write_data[0] = reg;
00104   i2c_write_data[1] = data;
00105   seq.buf[0].data = i2c_write_data;
00106   seq.buf[0].len  = 2;
00107   seq.buf[1].data = i2c_read_data;
00108   seq.buf[1].len  = 0;
00109 
00110   ret = I2CDRV_Transfer(&seq);
00111   if (ret != i2cTransferDone)
00112   {
00113     return((int) ret);
00114   }
00115 
00116   return((int) 0);
00117 }
00118 
00119 /**************************************************************************/
00136 int Si1147_Write_Block_Register (I2C_TypeDef *i2c,uint8_t addr, uint8_t reg, uint8_t length, uint8_t const *data)
00137 {
00138   I2C_TransferSeq_TypeDef    seq;
00139   I2C_TransferReturn_TypeDef ret;
00140   uint8_t i2c_write_data[10];
00141   uint8_t i2c_read_data[1];
00142   int i;
00143   /* Unused parameter */
00144   (void) i2c;
00145 
00146   seq.addr  = addr;
00147   seq.flags = I2C_FLAG_WRITE;
00148   /* Select register to start writing to*/
00149   i2c_write_data[0] = reg;
00150   for (i=0; i<length;i++)
00151   {
00152     i2c_write_data[i+1] = data[i];
00153   }
00154   seq.buf[0].data = i2c_write_data;
00155   seq.buf[0].len  = 1+length;
00156   seq.buf[1].data = i2c_read_data;
00157   seq.buf[1].len  = 0;
00158 
00159   ret = I2CDRV_Transfer(&seq);
00160   if (ret != i2cTransferDone)
00161   {
00162     return((int) ret);
00163   }
00164 
00165   return((int) 0);
00166 }
00167 
00168 /**************************************************************************/
00185 int Si1147_Read_Block_Register (I2C_TypeDef *i2c,uint8_t addr, uint8_t reg, uint8_t length, uint8_t *data)
00186 {
00187   I2C_TransferSeq_TypeDef    seq;
00188   I2C_TransferReturn_TypeDef ret;
00189   uint8_t i2c_write_data[1];
00190   /* Unused parameter */
00191   (void) i2c;
00192 
00193   seq.addr  = addr;
00194   seq.flags = I2C_FLAG_WRITE_READ;
00195   /* Select register to start reading from */
00196   i2c_write_data[0] = reg;
00197   seq.buf[0].data = i2c_write_data;
00198   seq.buf[0].len  = 1;
00199   /* Select length of data to be read */
00200   seq.buf[1].data = data;
00201   seq.buf[1].len  = length;
00202   ret = I2CDRV_Transfer(&seq);
00203   if (ret != i2cTransferDone)
00204   {
00205     return((int) ret);
00206   }
00207 
00208   return((int) length);
00209 }
00210