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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值