/*! * \file i2c.c * * \brief I2C driver implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * ______ _ * / _____) _ | | * ( (____ _____ ____ _| |_ _____ ____| |__ * \____ \| ___ | (_ _) ___ |/ ___) _ \ * _____) ) ____| | | || |_| ____( (___| | | | * (______/|_____)_|_|_| \__)_____)\____)_| |_| * (C)2013-2017 Semtech * * \endcode * * \author Miguel Luis ( Semtech ) * * \author Gregory Cristian ( Semtech ) */ #include #include "utilities.h" #include "i2c-board.h" /*! * Flag to indicates if the I2C is initialized */ static bool I2cInitialized = false; void I2cInit( I2c_t *obj, I2cId_t i2cId, PinNames scl, PinNames sda ) { if( I2cInitialized == false ) { I2cInitialized = true; I2cMcuInit( obj, i2cId, scl, sda ); I2cMcuFormat( obj, MODE_I2C, I2C_DUTY_CYCLE_2, true, I2C_ACK_ADD_7_BIT, 400000 ); } } void I2cDeInit( I2c_t *obj ) { I2cInitialized = false; I2cMcuDeInit( obj ); } void I2cResetBus( I2c_t *obj ) { I2cMcuResetBus( obj ); } LmnStatus_t I2cWrite( I2c_t *obj, uint8_t deviceAddr, uint8_t data ) { if( I2cInitialized == true ) { if( I2cMcuWriteBuffer( obj, deviceAddr, &data, 1 ) == LMN_STATUS_ERROR ) { // if first attempt fails due to an IRQ, try a second time if( I2cMcuWriteBuffer( obj, deviceAddr, &data, 1 ) == LMN_STATUS_ERROR ) { return LMN_STATUS_ERROR; } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cWriteBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size ) { if( I2cInitialized == true ) { if( I2cMcuWriteBuffer( obj, deviceAddr, buffer, size ) == LMN_STATUS_ERROR ) { // if first attempt fails due to an IRQ, try a second time if( I2cMcuWriteBuffer( obj, deviceAddr, buffer, size ) == LMN_STATUS_ERROR ) { return LMN_STATUS_ERROR; } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cWriteMem( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t data ) { if( I2cInitialized == true ) { if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, &data, 1 ) == LMN_STATUS_ERROR ) { // if first attempt fails due to an IRQ, try a second time if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, &data, 1 ) == LMN_STATUS_ERROR ) { return LMN_STATUS_ERROR; } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cWriteMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size ) { if( I2cInitialized == true ) { if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, buffer, size ) == LMN_STATUS_ERROR ) { // if first attempt fails due to an IRQ, try a second time if( I2cMcuWriteMemBuffer( obj, deviceAddr, addr, buffer, size ) == LMN_STATUS_ERROR ) { return LMN_STATUS_ERROR; } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_OK; } } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cRead( I2c_t *obj, uint8_t deviceAddr, uint8_t *data ) { if( I2cInitialized == true ) { return( I2cMcuReadBuffer( obj, deviceAddr, data, 1 ) ); } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cReadBuffer( I2c_t *obj, uint8_t deviceAddr, uint8_t *buffer, uint16_t size ) { if( I2cInitialized == true ) { return( I2cMcuReadBuffer( obj, deviceAddr, buffer, size ) ); } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cReadMem( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *data ) { if( I2cInitialized == true ) { return( I2cMcuReadMemBuffer( obj, deviceAddr, addr, data, 1 ) ); } else { return LMN_STATUS_ERROR; } } LmnStatus_t I2cReadMemBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size ) { if( I2cInitialized == true ) { return( I2cMcuReadMemBuffer( obj, deviceAddr, addr, buffer, size ) ); } else { return LMN_STATUS_ERROR; } }