/*
* I2C_Infrared_sensor.c
*
* Created on: Oct 9, 2012
* Author: Aspire 4736G
*/
#include "stdio.h"
#include "math.h"
#include "lpc17xx_pinsel.h"
#include "lpc17xx_i2c.h"
//#include "lpc17xx_timer.h"
//#include "lpc17xx_gpio.h"
#define TRUE 1
#define FALSE 0
#define I2CDEV LPC_I2C2
#define vcnl4000_i2c_addr 0x13
#define vcnl4000_1r0 0x80
#define vcnl4000_1r1 0x81
#define vcnl4000_1r3 0x83
#define vcnl4000_1r4 0x84
#define vcnl4000_1r5 0x85
#define vcnl4000_1r6 0x86
#define vcnl4000_1r7 0x87
#define vcnl4000_1r8 0x88
#define vcnl4000_1r9 0x89
#define vcnl4000_1r10 0x8A
static void vcnl4000_init();
static void vcnl4000_read();
static int I2CWrite(uint8_t addr, uint8_t* buf, uint32_t len)
{
I2C_M_SETUP_Type txsetup;
txsetup.sl_addr7bit = addr;
txsetup.tx_data = buf;
txsetup.tx_length = len;
txsetup.rx_data = NULL;
txsetup.rx_length = 0;
txsetup.retransmissions_max = 3;
if (I2C_MasterTransferData(I2CDEV, &txsetup, I2C_TRANSFER_POLLING) == SUCCESS){
return (0);
} else {
return (-1);
}
}
static int I2CRead(uint8_t addr, uint8_t* buf, uint32_t len)
{
I2C_M_SETUP_Type rxsetup;
rxsetup.sl_addr7bit = addr;
rxsetup.tx_data = NULL;// Get address to read at writing address
rxsetup.tx_length = 0;
rxsetup.rx_data = buf;
rxsetup.rx_length = len;
rxsetup.retransmissions_max = 3;
if (I2C_MasterTransferData(I2CDEV, &rxsetup, I2C_TRANSFER_POLLING) == SUCCESS){
return (0);
} else {
return (-1);
}
}
static void init_i2c(void)
{
PINSEL_CFG_Type PinCfg;
/* Initialize I2C2 pin connect */
PinCfg.Funcnum = 2;
PinCfg.Pinnum = 10;
PinCfg.Portnum = 0;
PINSEL_ConfigPin(&PinCfg);
PinCfg.Pinnum = 11;
PINSEL_ConfigPin(&PinCfg);
// Initialize I2C peripheral
I2C_Init(LPC_I2C2, 100000);
/* Enable I2C1 operation */
I2C_Cmd(LPC_I2C2, ENABLE);
}
int main(void)
{
init_i2c();
vcnl4000_init();
while(1)
vcnl4000_read();
return 0;
}
static void vcnl4000_init()
{
uint8_t buf_w[1],buf_r[1],buf_set[2];
buf_r[0] = 0x00;
buf_w[0] = vcnl4000_1r0; // reading register 0
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
buf_set[0] = vcnl4000_1r0;
buf_set[1] = buf_r[0] | 0x18;
I2CWrite(vcnl4000_i2c_addr,buf_set,2); // set bits 3 and 4 to 1 to start reading
buf_w[0] = vcnl4000_1r3; // reading register 3
buf_r[0] = 0x00; // clear
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
buf_set[0] = vcnl4000_1r3;
buf_set[1] = buf_r[0] | 0x0A;
I2CWrite(vcnl4000_i2c_addr,buf_set,2); // set bits 0 t0 5 for led current
buf_w[0] = vcnl4000_1r4; // reading register 4
buf_r[0] = 0x00; // clear
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
buf_set[0] = vcnl4000_1r4;
buf_set[1] = buf_r[0] | 0x0F;
I2CWrite(vcnl4000_i2c_addr,buf_set,2); // set bits 0 t0 3
buf_w[0] = vcnl4000_1r9; // reading register 9
buf_r[0] = 0x00; // clear
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
buf_set[0] = vcnl4000_1r9;
buf_set[1] = buf_r[0] | 0x00;
I2CWrite(vcnl4000_i2c_addr,buf_set,2); //
buf_w[0] = vcnl4000_1r10; // reading register 10
buf_r[0] = 0x00; // clear
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
buf_set[0] = vcnl4000_1r10;
buf_set[1] = buf_r[0] | 0x81;
I2CWrite(vcnl4000_i2c_addr,buf_set,2); //
return;
}
static void vcnl4000_read()
{
uint8_t buf_w[1],buf_r[1],temp_r[1],read_cond[1],buf_light_w[1],buf_light[2];
uint8_t buf_infrared_w[1],buf_infrared[2];
uint16_t light,infrared;
temp_r[0] = 0x00;
buf_w[0] = vcnl4000_1r0;
I2CWrite(vcnl4000_i2c_addr,buf_w,1);
I2CRead(vcnl4000_i2c_addr,buf_r,1);
temp_r[0] = temp_r[0] | buf_r[0]; // copy over to temp
read_cond[0] = temp_r[0] & 0xFF;
if(read_cond[0] == 0xFF) // read only if bits are 5 and 6 are 1
{
buf_light_w[0] = vcnl4000_1r5; // reading light
I2CWrite(vcnl4000_i2c_addr,buf_light_w,1);
I2CRead(vcnl4000_i2c_addr,buf_light,2);
light = (buf_light[0] << 8) | buf_light[1];
buf_infrared_w[0] = vcnl4000_1r7; // reading infrared
I2CWrite(vcnl4000_i2c_addr,buf_infrared_w,1);
I2CRead(vcnl4000_i2c_addr,buf_infrared,2);
infrared = (buf_infrared[0] << 8) | buf_infrared[1];
printf("light = %d\n",light);
printf("Infrared = %d\n",infrared);
}
else // data unavailable
{
printf("value not ready yet\n");
return;
}
return;
}
|