i2c.c

/*******************************************************************************
 *
 *  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"

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;
}

bool TSCWrite(uint8 addr, uint16 reg, uint16 *buf, uint16 size)
{
    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);

    for(i=0; i<size; i++)
    {
        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);

    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);

    for(i=0; i<size; i++)
    {
        rval = I2cRawReadByte(&val);
        I2cRawSendAck(TRUE);
        buf[i] = val;

        rval = I2cRawReadByte(&val);
        I2cRawSendAck(TRUE);
        buf[i] |= val<<8;
    }
    I2cRawStop(TRUE);

    I2cEnable(FALSE);
    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;

    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);

    I2cEnable(FALSE);
    PioSetMode(21, pio_mode_user);
    PioSetMode(20, pio_mode_user);

    return !rval;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章