CC264X I2C

来源:互联网 发布:台湾旅游软件 编辑:程序博客网 时间:2024/05/16 18:48
/********************************************************************************  Filename:       bsp_i2c.c*  Revised:        $Date: $*  Revision:       $Revision: $**  Description:    Layer added on top of RTOS driver for backward*                  compatibility with non RTOS I2C driver.**  Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/**  Redistribution and use in source and binary forms, with or without*  modification, are permitted provided that the following conditions*  are met:**    Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.**    Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.**    Neither the name of Texas Instruments Incorporated nor the names of*    its contributors may be used to endorse or promote products derived*    from this software without specific prior written permission.**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************/#ifdef TI_DRIVERS_I2C_INCLUDED/******************************************************************************* * INCLUDES */#include <ti/sysbios/BIOS.h>#include <ti/sysbios/knl/Semaphore.h>#include <ti/sysbios/knl/Task.h>#include <ti/sysbios/family/arm/cc26xx/Power.h>#include <ti/drivers/i2c/I2CCC26XX.h>#include <driverlib/prcm.h>#include "Board.h"#include "sensor.h"#include "bsp_i2c.h"/******************************************************************************* * CONSTANTS */#define I2C_TIMEOUT 2500/* I2C */#define Board_I2C0_SDA0             IOID_5#define Board_I2C0_SCL0             IOID_6#define Board_I2C0_SDA1             IOID_8#define Board_I2C0_SCL1             IOID_9/******************************************************************************* * GLOBAL variables */extern I2CCC26XX_HWAttrs i2cCC26xxHWAttrs[];/******************************************************************************* * LOCAL variables */static volatile uint8_t slaveAddr;static volatile uint8_t interface;static I2C_Handle i2cHandle;static I2C_Params i2cParams;static Semaphore_Struct mutex;static const I2CCC26XX_I2CPinCfg pinCfg1 ={   // Pin configuration for I2C interface 1  .pinSDA = Board_I2C0_SDA1,  .pinSCL = Board_I2C0_SCL1};/******************************************************************************* * @fn          bspI2cWrite * * @brief       Burst write to an I2C device * * @param       data - pointer to data buffer * @param       len - number of bytes to write * * @return      true if success */bool bspI2cWrite(uint8_t *data, uint8_t len){  I2C_Transaction masterTransaction;  masterTransaction.writeCount   = len;  masterTransaction.writeBuf     = data;  masterTransaction.readCount    = 0;  masterTransaction.readBuf      = NULL;  masterTransaction.slaveAddress = slaveAddr;  return I2C_transfer(i2cHandle, &masterTransaction) == TRUE;}/******************************************************************************* * @fn          bspI2cWriteSingle * * @brief       Single byte write to an I2C device * * @param       data - byte to write * * @return      true if success */bool bspI2cWriteSingle(uint8_t data){  uint8_t d;  d = data;  return bspI2cWrite(&d, 1);}/******************************************************************************* * @fn          bspI2cRead * * @brief       Burst read from an I2C device * * @param       data - pointer to data buffer * @param       len - number of bytes to write * * @return      true if success */bool bspI2cRead(uint8_t *data, uint8_t len){  I2C_Transaction masterTransaction;  masterTransaction.writeCount   = 0;  masterTransaction.writeBuf     = NULL;  masterTransaction.readCount    = len;  masterTransaction.readBuf      = data;  masterTransaction.slaveAddress = slaveAddr;  return I2C_transfer(i2cHandle, &masterTransaction) == TRUE;}/******************************************************************************* * @fn          bspI2cWriteRead * * @brief       Burst write/read from an I2C device * * @param       wdata - pointer to write data buffer * @param       wlen - number of bytes to write * @param       rdata - pointer to read data buffer * @param       rlen - number of bytes to read * * @return      true if success */bool bspI2cWriteRead(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen){  I2C_Transaction masterTransaction;  masterTransaction.writeCount   = wlen;  masterTransaction.writeBuf     = wdata;  masterTransaction.readCount    = rlen;  masterTransaction.readBuf      = rdata;  masterTransaction.slaveAddress = slaveAddr;  return I2C_transfer(i2cHandle, &masterTransaction) == TRUE;}/******************************************************************************* * @fn          bspI2cSelect * * @brief       Select an I2C interface and slave * * @param       newInterface - selected interface * @param       address - slave address  * * @return      true if success */bool bspI2cSelect(uint8_t newInterface, uint8_t address){  // Acquire I2C resource  if (!Semaphore_pend(Semaphore_handle(&mutex),MS_2_TICKS(I2C_TIMEOUT)))  {    return false;  }  // Store new slave address  slaveAddr = address;  // Interface changed ?  if (newInterface != interface)  {    // Store new interface    interface = newInterface;    // Shut down RTOS driver    I2C_close(i2cHandle);    // Sets custom to NULL, selects I2C interface 0    I2C_Params_init(&i2cParams);    // Assign I2C data/clock pins according to selected I2C interface 1    if (interface == BSP_I2C_INTERFACE_1)    {      i2cParams.custom = (void*)&pinCfg1;    }    // Re-open RTOS driver with new bus pin assignment    i2cHandle = I2C_open(Board_I2C, &i2cParams);  }  return true;}/******************************************************************************* * @fn          bspI2cDeselect * * @brief       Allow other tasks to access the I2C driver * * @param       none * * @return      none */void bspI2cDeselect(void){  // Release I2C resource  Semaphore_post(Semaphore_handle(&mutex));}/******************************************************************************* * @fn          bspI2cInit * * @brief       Initialize the RTOS I2C driver (must be called only once) * * @param       none * * @return      none */void bspI2cInit(void){  Semaphore_Params semParamsMutex;  // Create protection semaphore  Semaphore_Params_init(&semParamsMutex);  semParamsMutex.mode = Semaphore_Mode_BINARY;  Semaphore_construct(&mutex, 1, &semParamsMutex);  // Reset the I2C controller  HapiResetPeripheral(PRCM_PERIPH_I2C0);  I2C_init();  I2C_Params_init(&i2cParams);  i2cParams.bitRate = I2C_400kHz;  i2cHandle = I2C_open(Board_I2C, &i2cParams);  // Initialize local variables  slaveAddr = 0xFF;  interface = BSP_I2C_INTERFACE_0;  if (i2cHandle == NULL)  {    Task_exit();  }}/******************************************************************************* * @fn          bspI2cReset * * @brief       Reset the RTOS I2C driver * * @param       none * * @return      none */void bspI2cReset(void){  // Acquire I2C resource */  if (!Semaphore_pend(Semaphore_handle(&mutex),MS_2_TICKS(I2C_TIMEOUT)))  {    return;  }  // Close the driver  I2C_close(i2cHandle);  // Reset the I2C controller  HapiResetPeripheral(PRCM_PERIPH_I2C0);  // Reset local variables  slaveAddr = 0xFF;  interface = BSP_I2C_INTERFACE_0;  // Open driver  i2cHandle = I2C_open(Board_I2C, &i2cParams);  // Release I2C resource  Semaphore_post(Semaphore_handle(&mutex));}#endif
/********************************************************************************  Filename:       bsp_i2c.h*  Revised:        $Date: $*  Revision:       $Revision: $**  Description:    Layer added above TI-RTOS driver managing switching between*                  I2C-buses as well as an API that is compatible with the*                  DriverLib only version.**  Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/**  Redistribution and use in source and binary forms, with or without*  modification, are permitted provided that the following conditions*  are met:**    Redistributions of source code must retain the above copyright*    notice, this list of conditions and the following disclaimer.**    Redistributions in binary form must reproduce the above copyright*    notice, this list of conditions and the following disclaimer in the*    documentation and/or other materials provided with the distribution.**    Neither the name of Texas Instruments Incorporated nor the names of*    its contributors may be used to endorse or promote products derived*    from this software without specific prior written permission.**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************/#ifndef BSP_I2C_H#define BSP_I2C_H#ifdef __cplusplusextern "C"{#endif/********************************************************************* * INCLUDES */#include "stdbool.h"#include "stdint.h"#include <inc/hw_memmap.h>/********************************************************************* * CONSTANTS */#define BSP_I2C_INTERFACE_0     0#define BSP_I2C_INTERFACE_1     1#define BSP_I2C_INTERFACE_NONE  -1/********************************************************************* * TYPEDEFS *//********************************************************************* * FUNCTIONS */void bspI2cInit(void);bool bspI2cSelect(uint8_t interface, uint8_t slaveAddress);bool bspI2cRead(uint8_t *data, uint8_t len);bool bspI2cWrite(uint8_t *data, uint8_t len);bool bspI2cWriteSingle(uint8_t data);bool bspI2cWriteRead(uint8_t *wdata, uint8_t wlen, uint8_t *rdata, uint8_t rlen);void bspI2cDeselect(void);void bspI2cDisable(void);void bspI2cReset(void);/////////////////////////////////////////////////////////////////////////////////#ifdef __cplusplus}#endif#endif /* BSP_I2C_H */