/*
* Copyright (c) 2024, Texas Instruments Incorporated
* All rights reserved.
*
* 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.
*/
/*!****************************************************************************
* @file i2c_comm_controller.h
* @brief I2C communication Module
*
*
* @anchor i2c_comm_controller
* # Overview
*
* APIs for I2C communication module
*
*
******************************************************************************/
#ifndef I2C_COMM_CONTROLLER_H_
#define I2C_COMM_CONTROLLER_H_
#include "ti_msp_dl_config.h"
#include
#ifdef __cplusplus
extern "C" {
#endif
/* FRAME STRUCTURE */
/* Control Byte */
/*! @brief Control index */
#define CTRL_IDX (0)
/*! @brief Control size */
#define CTRL_SIZE (1)
/*! @brief Control mask */
#define CMD_MASK (0x80)
/*! @brief CRC mask */
#define CRC_MASK (0x40)
/*! @brief Length mask */
#define LEN_MASK (0x3F)
/*! @brief Write command */
#define WRITE_CMD (0x80)
/*! @brief Read command */
#define READ_CMD (0x00)
/*! @brief Error Mask */
#define ERROR_MASK (0x80)
/* Address */
/*! @brief Address index */
#define ADDR_IDX (CTRL_IDX + CTRL_SIZE)
/*! @brief Address size */
#define ADDR_SIZE (4)
/*! @brief Address range start */
#define ADDR_RANGE_START (0x20100000)
/*! @brief Address range end */
#define ADDR_RANGE_END (0x20307FFF)
/* Data */
/*! @brief Command Data index */
#define DATA_IDX (ADDR_IDX + ADDR_SIZE)
/*! @brief Response Data index */
#define RESP_DATA_IDX (CTRL_IDX + CTRL_SIZE)
/*! @brief Maximum data size */
#define MAX_DATA_SIZE (64)
/* OFFSET is from the end of frame */
/* CRC */
/*! @brief CRC offset */
#define CRC_OFFSET (0)
/*! @brief CRC size */
#define CRC_SIZE (2)
/*! @brief Maximum buffer size */
#define MAX_BUFFER_SIZE (CTRL_SIZE + ADDR_SIZE + MAX_DATA_SIZE + CRC_SIZE)
/*! @brief Maximum response size */
#define MAX_RESP_SIZE (CTRL_SIZE + MAX_DATA_SIZE + CRC_SIZE)
/*! I2C Target Addr configured in the example */
/*! @brief Default Target Address */
#define DEF_TARGET_ADDR (0x68)
/*! @brief Buffer Info structure */
typedef struct
{
/*! Buffer array */
_Alignas(uint32_t) uint8_t buffer[MAX_BUFFER_SIZE];
/*! Pointer */
uint8_t ptr;
/*! Length */
uint8_t len;
} BufferInfo;
/*! @brief Frame Info structure*/
typedef struct
{
/*! CRC */
uint16_t crc;
/*! Control Byte */
uint8_t ctrl;
/*! Data */
uint8_t data[MAX_DATA_SIZE];
} FrameInfo;
/*! @brief I2C status */
typedef enum
{
/*! I2C IDLE state */
I2C_STATUS_IDLE = 0,
/*! I2C Tx Started state */
I2C_STATUS_TX_STARTED,
/*! I2C Tx in Progress state */
I2C_STATUS_TX_INPROGRESS,
/*! I2C Tx Complete state */
I2C_STATUS_TX_COMPLETE,
/*! I2C Rx Started state */
I2C_STATUS_RX_STARTED,
/*! I2C Rx in Progress state */
I2C_STATUS_RX_INPROGRESS,
/*! I2C Rx Complete state */
I2C_STATUS_RX_COMPLETE,
/*! I2C Error state */
I2C_STATUS_ERROR,
} I2C_Status;
typedef enum
{
/*! No error */
ERROR_TYPE_NONE = 0x00,
/*! Mismatch CRC error */
ERROR_TYPE_MISMATCH_CRC = 0xE1,
/*! Error in Address range */
ERROR_TYPE_ADDR_RANGE = 0xE2,
} ErrorType;
/*! @brief I2C instance */
typedef struct
{
/*! Transmit message */
BufferInfo txMsg;
/*! Receive message */
BufferInfo rxMsg;
/*! Data length */
uint8_t dataLen;
/*! CRC enabled */
_Bool isCrc;
/*! I2C status */
I2C_Status status;
/*! I2C error type */
ErrorType error;
} I2C_Instance;
/*! @brief I2C Command types */
typedef enum
{
/*! I2C Read Command */
READ_COMMAND = 0x00,
/*! I2C Write Command */
WRITE_COMMAND = 0x80,
} CommandType;
/*! @brief I2C Command Info */
typedef struct
{
/*! Target Address */
uint32_t targetAddr;
/*! I2C Command Type */
CommandType commandType;
/*! Address */
uint32_t addr;
/*! Pointer to array of Data */
uint8_t* dataArray;
/*! Data Size */
uint8_t dataSize;
/*! CRC Enable*/
bool crcEnable;
} I2C_CommandInfo;
/*! @brief I2C Response Info */
typedef struct
{
/*! Response Frame Info */
FrameInfo frame;
/*! Response data size */
uint8_t dataSize;
/*! Response error status */
ErrorType status;
/*! Response received */
bool received;
} I2C_ResponseInfo;
/**
* @brief Initializes I2C_Instance Handle
* @param[in] I2C_handle Pointer to I2C_Instance
*/
void I2C_init(I2C_Instance *I2C_handle);
/**
* @brief Prepares I2C Command frame and stores in TX Buffer to transmit
* @param[in] I2C_handle Pointer to I2C_Instance
* @param[in] command Pointer to I2C_CommandInfo
*/
void I2C_sendCommand(I2C_Instance *I2C_handle,I2C_CommandInfo *command);
/**
* @brief Sends I2C Read command to get the response from target
* @param[in] I2C_handle Pointer to I2C_Instance
* @param[in] targetAddr I2C Target Address
*/
void I2C_getResponse(I2C_Instance* I2C_handle,uint32_t targetAddr);
/**
* @brief Decodes the received data in Rx Buffer for response
* @param[in] I2C_handle Pointer to I2C_Instance
* @param[in] response Pointer to I2C_ResponseInfo
*/
void I2C_decodeResponse(I2C_Instance *I2C_handle,I2C_ResponseInfo *response);
#ifdef __cplusplus
}
#endif
#endif /* I2C_COMM_CONTROLLER_H_ */