/*******************************************************************************
*
* DESCRIPTION
* This file defines routines for i2c master with gpio, port from linux kernel
*
******************************************************************************/
*
* DESCRIPTION
* This file defines routines for i2c master with gpio, port from linux kernel
*
******************************************************************************/
#include <pio.h>
#include <i2c.h>
#include <debug.h>
#include "sensor.h"
#include <i2c.h>
#include <debug.h>
#include "sensor.h"
static bool TSCI2cInit(void)
{
I2cEnable(FALSE);
I2cInit(21, 20, I2C_POWER_PIO_UNDEFINED, pio_mode_strong_pull_up);
I2cConfigClock(I2C_SCL_400KBPS_HIGH_PERIOD, I2C_SCL_400KBPS_LOW_PERIOD);
I2cEnable(TRUE);
return TRUE;
}
{
I2cEnable(FALSE);
I2cInit(21, 20, I2C_POWER_PIO_UNDEFINED, pio_mode_strong_pull_up);
I2cConfigClock(I2C_SCL_400KBPS_HIGH_PERIOD, I2C_SCL_400KBPS_LOW_PERIOD);
I2cEnable(TRUE);
return TRUE;
}
bool TSCWrite(uint8 addr, uint16 reg, uint16 *buf, uint16 size)
{
sys_status rval;
uint16 i;
{
sys_status rval;
uint16 i;
TSCI2cInit();
I2cRawStart(TRUE);
rval = I2cRawWriteByte(addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg>>8);
I2cRawWaitAck(TRUE);
I2cRawStart(TRUE);
rval = I2cRawWriteByte(addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg>>8);
I2cRawWaitAck(TRUE);
for(i=0; i<size; i++)
{
rval = I2cRawWriteByte(buf[i]&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(buf[i]>>8);
I2cRawWaitAck(TRUE);
}
I2cRawStop(TRUE);
{
rval = I2cRawWriteByte(buf[i]&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(buf[i]>>8);
I2cRawWaitAck(TRUE);
}
I2cRawStop(TRUE);
I2cEnable(FALSE);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
return !rval;
}
}
bool TSCRead(uint8 addr, uint16 reg, uint16 *buf, uint16 size)
{
sys_status rval;
uint16 i;
uint8 val = 0;
TSCI2cInit();
I2cRawStart(TRUE);
rval = I2cRawWriteByte(addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg>>8);
I2cRawWaitAck(TRUE);
I2cRawRestart(TRUE);
rval = I2cRawWriteByte(addr+1);
I2cRawWaitAck(TRUE);
{
sys_status rval;
uint16 i;
uint8 val = 0;
TSCI2cInit();
I2cRawStart(TRUE);
rval = I2cRawWriteByte(addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg&0xff);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(reg>>8);
I2cRawWaitAck(TRUE);
I2cRawRestart(TRUE);
rval = I2cRawWriteByte(addr+1);
I2cRawWaitAck(TRUE);
for(i=0; i<size; i++)
{
rval = I2cRawReadByte(&val);
I2cRawSendAck(TRUE);
buf[i] = val;
{
rval = I2cRawReadByte(&val);
I2cRawSendAck(TRUE);
buf[i] = val;
rval = I2cRawReadByte(&val);
I2cRawSendAck(TRUE);
buf[i] |= val<<8;
}
I2cRawStop(TRUE);
I2cRawSendAck(TRUE);
buf[i] |= val<<8;
}
I2cRawStop(TRUE);
I2cEnable(FALSE);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
return !rval;
}
}
bool Read_N_Bytes(uint8 dev_addr, uint8 l_data, uint8 h_data, uint8 *buffer, uint16 n)
{
sys_status rval;
uint16 i;
{
sys_status rval;
uint16 i;
TSCI2cInit();
I2cRawStart(TRUE);
rval = I2cRawWriteByte(dev_addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(l_data);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(h_data);
I2cRawWaitAck(TRUE);
I2cRawRestart(TRUE);
rval = I2cRawWriteByte(dev_addr+1);
I2cRawWaitAck(TRUE);
for(i=0; i<n; i++)
{
rval = I2cRawReadByte(&buffer[i]);
I2cRawSendAck(TRUE);
}
I2cRawStop(TRUE);
I2cRawStart(TRUE);
rval = I2cRawWriteByte(dev_addr);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(l_data);
I2cRawWaitAck(TRUE);
rval = I2cRawWriteByte(h_data);
I2cRawWaitAck(TRUE);
I2cRawRestart(TRUE);
rval = I2cRawWriteByte(dev_addr+1);
I2cRawWaitAck(TRUE);
for(i=0; i<n; i++)
{
rval = I2cRawReadByte(&buffer[i]);
I2cRawSendAck(TRUE);
}
I2cRawStop(TRUE);
I2cEnable(FALSE);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
PioSetMode(21, pio_mode_user);
PioSetMode(20, pio_mode_user);
return !rval;
}
}