Hi
I am using pdk_k2g_1_0_16 with K2Gx evaluation board on windows host pc. I am trying to create I2C bare metal example. I have imported I2C_BasicExample_evmK2G_armExampleProject and in that I have modified source file according to bare metal APIs. I am trying to read first page of EEPROM, but it is not reading any data.
I am not sure whether I2C has configured correctly or not. I have attached project and source file to cross verify at your end. Please let me know the solution.
8168.I2C_BasicExample_evmK2G_armExampleProject.rar
/**
* \file main_eeprom_read.c
*
* \brief Example application main file. This application will read the data
* from eeprom and compares it with the known data.
*
*/
/*
* Copyright (C) 2014 - 2017 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 BARE_METAL
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <xdc/runtime/System.h>
#include <xdc/runtime/Error.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
#endif
#include <stdio.h>
#include <string.h>
/* TI-RTOS Header files */
#include <ti/drv/i2c/I2C.h>
#include <ti/drv/i2c/soc/I2C_soc.h>
#include <ti/drv/i2c/test/eeprom_read/src/I2C_log.h>
#include <ti/drv/i2c/test/eeprom_read/src/I2C_board.h>
#include <ti/csl/csl_i2c.h>
#include <ti/csl/soc.h>
//#include <ti/csl/src/ip/i2c/V2/i2c.h>
//#include <ti/csl/src/ip/i2c/V2/hw_i2c.h>
#if defined (SOC_AM335X) || defined (SOC_AM437x)
/* EEPROM data -Board specific */
extern char eepromData[I2C_EEPROM_RX_LENGTH];
#endif
uint32_t I2CMasterIntRawStatusEx(uint32_t baseAddr, uint32_t intFlag);
void SetupI2C(void);
void I2CFIFOThresholdConfig(uint32_t baseAddr,
uint32_t thresholdVal,
uint32_t flag);
void I2CSoftReset(uint32_t baseAddr);
void I2CMasterEnableFreeRun(uint32_t baseAddr);
void I2CSyscInit(uint32_t baseAddr, uint32_t syscFlag);
uint32_t I2CSystemStatusGet(uint32_t baseAddr);
void sampleDelay(int32_t delay);
void I2CMasterControl_1(uint32_t baseAddr, uint32_t cmd);
void I2CFIFOClear(uint32_t baseAddr, uint32_t flag);
uint8_t I2CReceive(uint32_t BaseAddress,uint8_t SlaveAddress, uint16_t DataCountVal,uint8_t OffsetAddressCount,uint8_t *I2CReceivePointer);
void I2CMasterEnable_1(uint32_t baseAddr);
#define I2C0_BASE_ADDRESS 0x02530000
#define HSI2C_SLAVE_ADDR ((uint8_t) 0x50U)
#define I2C_TX_MODE ((uint32_t) 1U)
/**
* \brief I2C_RX_MODE - Receive mode.
*/
#define I2C_RX_MODE ((uint32_t) 0U)
#define I2C_OWN_ADDR 0x10
#define I2C_BUF (0x94U)
#define I2C_BUF_TXTRSH_SHIFT ((uint32_t)0U)
#define I2C_BUF_TXTRSH_MASK (0x0000003fU)
#define I2C_BUF_RXTRSH_SHIFT ((uint32_t)8U)
#define I2C_BUF_RXTRSH_MASK (0x00003f00U)
#define I2C_SYSC_SRST_SHIFT ((uint32_t)1U)
#define I2C_SYSC_SRST_MASK (0x00000002U)
#define I2C_SYSC_SRST_NMODE ((uint32_t)0U)
#define I2C_SYSC_SRST_RSTMODE ((uint32_t)1U)
#define I2C_SYSC (0x10U)
#define I2C_SYSTEST (0xbcU)
#define I2C_SYSTEST_FREE_SHIFT ((uint32_t)14U)
#define I2C_SYSTEST_FREE_MASK (0x00004000U)
#define I2C_SYSTEST_FREE_STOP ((uint32_t)0U)
#define I2C_SYSTEST_FREE_FREE ((uint32_t)1U)
#define I2C_SYSS (0x90U)
#define I2C_SYSS_RDONE_MASK (0x00000001U)
#define I2C_CON_TRX_SHIFT ((uint32_t)9U)
#define I2C_CON_TRX_MASK (0x00000200U)
#define I2C_CON_TRX_RCV ((uint32_t)0U)
#define I2C_CON_TRX_TRX ((uint32_t)1U)
#define I2C_CON_MST_SHIFT ((uint32_t)10U)
#define I2C_CON_MST_MASK (0x00000400U)
#define I2C_CON_MST_SLV ((uint32_t)0U)
#define I2C_CON_MST_MST ((uint32_t)1U)
#define I2C_CFG_MST_TX (((uint32_t) I2C_CON_TRX_MASK) | \
(uint32_t) (I2C_CON_MST_MASK))
#define I2C_INT_ALL ((uint32_t) 0x7FFFU)
#define I2C_CON (0xa4U)
#define I2C_CON_I2C_EN_SHIFT ((uint32_t)15U)
#define I2C_CON_I2C_EN_MASK (0x00008000U)
#define I2C_CON_I2C_EN_DISABLE ((uint32_t)0U)
#define I2C_CON_I2C_EN_ENABLE ((uint32_t)1U)
#define I2C_BUF_RXFIFO_CLR_SHIFT ((uint32_t)14U)
#define I2C_BUF_RXFIFO_CLR_MASK (0x00004000U)
#define I2C_BUF_RXFIFO_CLR_NMODE ((uint32_t)0U)
#define I2C_BUF_RXFIFO_CLR_RSTMODE ((uint32_t)1U)
#define I2C_BUF_TXFIFO_CLR_SHIFT ((uint32_t)6U)
#define I2C_BUF_TXFIFO_CLR_MASK (0x00000040U)
#define I2C_BUF_TXFIFO_CLR_NMODE ((uint32_t)0U)
#define I2C_BUF_TXFIFO_CLR_RSTMODE ((uint32_t)1U)
#define I2C_IRQSTATUS_RAW (0x24U)
#define I2C_CFG_MST_RX ((uint32_t) I2C_CON_MST_MASK)
/**********************************************************************
************************** Macros ************************************
**********************************************************************/
#define I2C_TRANSACTION_TIMEOUT (2000U)
/**********************************************************************
************************** Internal functions ************************
**********************************************************************/
/* Data compare function */
bool CompareData(char *expData, char *rxData, unsigned int length);
/**********************************************************************
************************** Global Variables **************************
**********************************************************************/
#if defined (idkAM572x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x32,
0x49, 0x44};
#elif defined(idkAM574x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x34,
0x49, 0x44};
#elif defined (idkAM571x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x31,
0x49, 0x44};
#elif defined (evmAM572x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4d, 0x35, 0x37, 0x32,
0x50, 0x4d};
#elif defined (evmDRA72x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x33, 0x55, 0xAA, 0x4A, 0x36, 0x45, 0x43, 0x4F,
0x43, 0x50};
#elif defined (evmDRA75x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0xEE, 0x33, 0x55, 0xAA, 0x35, 0x37, 0x37, 0x37,
0x78, 0x43};
#elif defined (evmDRA78x)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x33, 0x55, 0xAA, 0x41, 0x44, 0x41, 0x53, 0x2D,
0x4C, 0x4F};
#elif defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L) || defined (evmK2G) || defined (evmC6678) || defined (evmC6657) || defined (iceK2G) || defined (evmOMAPL137)
char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00};
#else
#endif
/*
* ======== Board_initI2C ========
*/
bool Board_initI2C(void)
{
Board_initCfg boardCfg;
Board_STATUS boardStatus;
#if defined (idkAM571x)
Board_IDInfo id;
#endif
I2C_HwAttrs i2c_cfg;
#if defined (evmK2G)
Board_SoCInfo socInfo;
#endif
/* Get the default I2C init configurations */
I2C_socGetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
/* Modify the default I2C configurations if necessary */
/* Set the default I2C init configurations */
I2C_socSetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
#if defined(evmK2E) || defined(evmC6678)
boardCfg = BOARD_INIT_MODULE_CLOCK |
BOARD_INIT_UART_STDIO;
#else
boardCfg = BOARD_INIT_PINMUX_CONFIG |
BOARD_INIT_MODULE_CLOCK |
BOARD_INIT_UART_STDIO;
#endif
boardStatus = Board_init(boardCfg);
if (boardStatus != BOARD_SOK)
{
return (false);
}
#if defined (idkAM571x)
boardStatus = Board_getIDInfo(&id);
if (boardStatus != BOARD_SOK)
{
return (false);
}
memcpy(eepromData, &id.header[I2C_EEPROM_TEST_ADDR],
BOARD_EEPROM_HEADER_LENGTH - I2C_EEPROM_TEST_ADDR);
memcpy(&eepromData[BOARD_EEPROM_HEADER_LENGTH - I2C_EEPROM_TEST_ADDR],
id.boardName,
I2C_EEPROM_TEST_LENGTH - BOARD_EEPROM_HEADER_LENGTH + I2C_EEPROM_TEST_ADDR);
#endif
#if defined (evmK2G)
/* Read the SoC info to get the System clock value */
Board_getSoCInfo(&socInfo);
if(socInfo.sysClock != BOARD_SYS_CLK_DEFAULT)
{
/* Get the default I2C init configurations */
I2C_socGetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
/* Update the I2C functional clock based on CPU clock - 1G or 600MHz */
i2c_cfg.funcClk = socInfo.sysClock/I2C_MODULE_CLOCK_DIVIDER;
/* Set the default I2C init configurations */
I2C_socSetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
}
I2CMasterInitExpClk(I2C0_BASE_ADDRESS, i2c_cfg.funcClk,
12000000, 100000);
#endif
return (true);
}
/*
* ======== test function ========
*/
void i2c_test(UArg arg0, UArg arg1)
{
I2C_Params i2cParams;
I2C_Handle handle = NULL;
I2C_Transaction i2cTransaction;
char txBuf[I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE] = {0x00, };
char rxBuf[I2C_EEPROM_TEST_LENGTH] = {0x00, };
bool status,test_pass=FALSE;
int16_t transferStatus;
/* Set the I2C EEPROM write/read address */
txBuf[0] = (I2C_EEPROM_TEST_ADDR >> 8) & 0xff; /* EEPROM memory high address byte */
txBuf[1] = I2C_EEPROM_TEST_ADDR & 0xff; /* EEPROM memory low address byte */
I2C_init();
I2C_Params_init(&i2cParams);
handle = I2C_open(I2C_EEPROM_INSTANCE, &i2cParams);
I2C_transactionInit(&i2cTransaction);
i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
i2cTransaction.timeout = I2C_TRANSACTION_TIMEOUT;
transferStatus = I2C_transfer(handle, &i2cTransaction);
if(I2C_STS_SUCCESS != transferStatus)
{
I2C_log("\n Data Transfer failed with transfer status %d \n",transferStatus);
test_pass=FALSE;
goto exit_test;
}
I2C_close(handle);
#if defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L) || defined (evmK2G) || defined (iceK2G) || defined (evmC6678) || defined (evmC6657) || defined (iceK2G) || defined (evmOMAPL137)
/* EEPROM not programmed on K2 EVMs, copy rx data to eepromData
so it can pass the test */
memcpy(eepromData, rxBuf, I2C_EEPROM_TEST_LENGTH);
#endif
status = CompareData(&eepromData[0], &rxBuf[0], I2C_EEPROM_TEST_LENGTH);
if(TRUE == status)
{
I2C_log("\n EEPROM data matched \n");
test_pass=TRUE;
}
else
{
test_pass=FALSE;
}
exit_test:
if(TRUE == test_pass)
{
UART_printStatus("\n All tests have passed. \n");
}
else
{
UART_printStatus("\n Some tests have failed. \n");
}
while (1) {
}
}
/*
* ======== main ========
*/
int main(void)
{
// Board_initCfg boardCfg;
char txBuf[I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE] = {0x00, };
char rxBuf[I2C_EEPROM_TEST_LENGTH] = {0x00, };
/* Set the I2C EEPROM write/read address */
txBuf[0] = (I2C_EEPROM_TEST_ADDR >> 8) & 0xff; /* EEPROM memory high address byte */
txBuf[1] = I2C_EEPROM_TEST_ADDR & 0xff; /* EEPROM memory low address byte */
// boardCfg = BOARD_INIT_PINMUX_CONFIG |
// BOARD_INIT_MODULE_CLOCK;
// BOARD_INIT_UART_STDIO;
// Board_init(boardCfg);
// SetupI2C();
// I2CReceive(I2C0_BASE_ADDRESS,I2C_EEPROM_ADDR,I2C_EEPROM_TEST_LENGTH,I2C_EEPROM_ADDR_SIZE,rxBuf);
if (Board_initI2C() == false)
{
return (0);
}
SetupI2C();
I2CReceive(I2C0_BASE_ADDRESS,I2C_EEPROM_ADDR,I2C_EEPROM_TEST_LENGTH,I2C_EEPROM_ADDR_SIZE,rxBuf);
#if defined (SOC_AM335X) || defined (SOC_AM437x) || defined (SOC_OMAPL137)
Task_Handle task;
Error_Block eb;
Error_init(&eb);
task = Task_create(i2c_test, NULL, &eb);
if (task == NULL) {
System_printf("Task_create() failed!\n");
BIOS_exit(0);
}
#endif
/* Start BIOS */
// BIOS_start();
return (0);
}
/*
* ======== CompareData ========
*/
bool CompareData(char *expData, char *rxData, unsigned int length)
{
uint32_t idx = 0;
uint32_t match = 1;
bool retVal = false;
for(idx = 0; ((idx < length) && (match != 0)); idx++)
{
if(*expData != *rxData) match = 0;
expData++;
rxData++;
}
if(match == 1) retVal = true;
return retVal;
}
void SetupI2C(void)
{
I2COwnAddressSet(I2C0_BASE_ADDRESS,
I2C_OWN_ADDR);
/* Do a software reset */
I2CSoftReset(I2C0_BASE_ADDRESS);
/* Enable i2c module */
I2CMasterEnable(I2C0_BASE_ADDRESS);
I2CMasterSlaveAddrSet(I2C0_BASE_ADDRESS, HSI2C_SLAVE_ADDR);
// while (I2CSystemStatusGet(I2C0_BASE_ADDRESS)) ;
while(I2CMasterBusBusy(I2C0_BASE_ADDRESS));
/* Put i2c in reset/disabled state */
// I2CMasterDisable(I2C0_BASE_ADDRESS);
/* Configure i2c bus speed to 100khz */
#if defined (SOC_AM574x) || defined (SOC_AM572x) || defined (SOC_AM571x)
I2CMasterInitExpClk(gI2cAddr, 96000000,
4000000U, 100000);
#else
//I2CMasterInitExpClk(I2C0_BASE_ADDRESS, 24000000,
// 8000000, 100000);
#endif
// I2COwnAddressSet(I2C0_BASE_ADDRESS, 0,
// I2C_OWN_ADDR);
// I2COwnAddressSet(I2C0_BASE_ADDRESS,
// I2C_OWN_ADDR);
// HW_WR_REG32(I2C0_BASE_ADDRESS + 0xA8u, I2C_OWN_ADDR);
// I2CSyscInit(I2C0_BASE_ADDRESS, 0x08);
/*Set Rx and Tx FIFO threshold value and reset the fifo*/
// I2CFIFOThresholdConfig(I2C0_BASE_ADDRESS, 0, I2C_TX_MODE);
// I2CFIFOThresholdConfig(I2C0_BASE_ADDRESS, 0, I2C_RX_MODE);
/* Set i2c slave address */
// I2CMasterSlaveAddrSet(I2C0_BASE_ADDRESS, HSI2C_SLAVE_ADDR);
/* Bring i2c out of reset */
// I2CMasterEnable(I2C0_BASE_ADDRESS);
/* Enable free run mode */
//I2CMasterEnableFreeRun(I2C0_BASE_ADDRESS);
}
void I2CFIFOThresholdConfig(uint32_t baseAddr,
uint32_t thresholdVal,
uint32_t flag)
{
if (I2C_TX_MODE == flag)
{
HW_WR_FIELD32(baseAddr + I2C_BUF, I2C_BUF_TXTRSH, thresholdVal);
}
else
{
HW_WR_FIELD32(baseAddr + I2C_BUF, I2C_BUF_RXTRSH, thresholdVal);
}
}
void I2CSoftReset(uint32_t baseAddr)
{
// HW_WR_FIELD32(baseAddr + I2C_SYSC, I2C_SYSC_SRST,
// I2C_SYSC_SRST_RSTMODE);
*(unsigned int *)(baseAddr+0x24) = 1<<5;
}
void I2CMasterEnableFreeRun(uint32_t baseAddr)
{
/* Set the I2C module in free running mode */
HW_WR_FIELD32(baseAddr + I2C_SYSTEST, I2C_SYSTEST_FREE,
I2C_SYSTEST_FREE_FREE);
}
void I2CSyscInit(uint32_t baseAddr, uint32_t syscFlag)
{
HW_WR_REG32(baseAddr + I2C_SYSC, syscFlag);
}
uint32_t I2CSystemStatusGet(uint32_t baseAddr)
{
//return (HW_RD_REG32(baseAddr + I2C_SYSS) & I2C_SYSS_RDONE_MASK);
return ((*(unsigned int *)(baseAddr + 0x08)) & 0x1000);
}
void SetupI2CTransmit(uint8_t *data, uint32_t numBytes)
{
uint32_t i;
I2CFIFOClear(I2C0_BASE_ADDRESS, I2C_TX_MODE);
I2CFIFOClear(I2C0_BASE_ADDRESS, I2C_RX_MODE);
/*Clear all interrupt status*/
I2CMasterIntClearEx(I2C0_BASE_ADDRESS, I2C_INT_ALL);
/* Set data count */
I2CSetDataCount(I2C0_BASE_ADDRESS, numBytes);
/*
** Configure i2c as master-transmitter and to generate stop condition
*/
I2CMasterControl_1(I2C0_BASE_ADDRESS, I2C_CFG_MST_TX);
/* generate start */
I2CMasterStart(I2C0_BASE_ADDRESS);
/* wait for bus busy */
while(I2CMasterBusBusy(I2C0_BASE_ADDRESS)==0)
{
}
for (i = 0; i < numBytes; i++)
{
/*Wait for transmit interrupt to occur*/
while (I2CMasterIntRawStatusEx(I2C0_BASE_ADDRESS,
I2C_INT_TRANSMIT_READY) != 0x10) ;
/* Send the data */
I2CMasterDataPut(I2C0_BASE_ADDRESS, data[i]);
/*Disable transmit ready and stop condition interrupt*/
I2CMasterIntClearEx(I2C0_BASE_ADDRESS, I2C_INT_TRANSMIT_READY);
}
/* generate stop when requested */
I2CMasterStop(I2C0_BASE_ADDRESS);
sampleDelay(5000);
/*Clear data buffer length*/
I2CSetDataCount(I2C0_BASE_ADDRESS, 0);
}
void sampleDelay(int32_t delay)
{
volatile int32_t i, j;
for (i = 0; i < delay; i++)
{
for (j = 0; j < 100; j++) ;
}
}
void I2CMasterControl_1(uint32_t baseAddr, uint32_t cmd)
{
HW_WR_REG32(baseAddr + I2C_CON, cmd | I2C_CON_I2C_EN_MASK);
}
void I2CFIFOClear(uint32_t baseAddr, uint32_t flag)
{
if (I2C_TX_MODE == flag)
{
HW_WR_FIELD32(baseAddr + I2C_BUF, I2C_BUF_TXFIFO_CLR,
I2C_BUF_TXFIFO_CLR_RSTMODE);
}
else
{
HW_WR_FIELD32(baseAddr + I2C_BUF, I2C_BUF_RXFIFO_CLR,
I2C_BUF_RXFIFO_CLR_RSTMODE);
}
}
uint32_t I2CMasterIntRawStatusEx(uint32_t baseAddr, uint32_t intFlag)
{
return (HW_RD_REG32(baseAddr + I2C_IRQSTATUS_RAW) & intFlag);
}
uint8_t I2CReceive(uint32_t BaseAddress,uint8_t SlaveAddress, uint16_t DataCountVal,uint8_t OffsetAddressCount,uint8_t *I2CReceivePointer)
{
//I2CMasterEnable(BaseAddress);
/*Check I2CReceivePointer is NULL or not*/
uint16_t n_txCount = 0;
uint16_t n_rxCount=0;
//I2CMasterSlaveAddrSet(BaseAddress, SlaveAddress);
I2CSetDataCount(BaseAddress, OffsetAddressCount);
/* Clear status of all interrupts */
I2CMasterIntClearEx(BaseAddress, 0x7FF);
/* Configure I2C controller in Master Transmitter mode. */
I2CMasterControl(BaseAddress, I2C_CON_TRX_MASK,I2C_CFG_MST_TX);
/* Generate Start Condition over I2C bus. */
I2CMasterStart(BaseAddress);
//I2C_Tick=TimerTick;
while(I2CMasterBusBusy(BaseAddress));
//I2C_Tick=TimerTick;
for(n_txCount=0;n_txCount<OffsetAddressCount;n_txCount++)
{
// while (0 == I2CMasterIntRawStatusEx(BaseAddress,I2C_INT_TRANSMIT_READY))
// {
//}
/*Put data to data transmit register of i2c*/
I2CMasterDataPut(BaseAddress, I2CReceivePointer[n_txCount]);
I2CMasterIntClearEx(BaseAddress, I2C_INT_TRANSMIT_READY);
}
//I2C_Tick=TimerTick;
/* Wait until I2C registers are ready to be accessed. */
// while(!(I2CMasterIntRawStatus(BaseAddress) & (I2C_INT_ADRR_READY_ACESS)))
// {
// }
// while(!((HW_RD_REG32(BaseAddress + I2C_IRQSTATUS_RAW)) & I2C_INT_ADRR_READY_ACESS));
I2CMasterIntClearEx(BaseAddress, 0x7FF);
/* Data Count specifies the number of bytes to be received. */
I2CSetDataCount(BaseAddress, DataCountVal);
I2CMasterControl(BaseAddress,I2C_CON_TRX_MASK, I2C_CFG_MST_RX);
/* Generate Start Condition over I2C bus */
I2CMasterStart(BaseAddress);
//I2C_Tick=TimerTick;
for(n_rxCount=0;n_rxCount<DataCountVal;n_rxCount++)
{
// while (0 == I2CMasterIntRawStatusEx(BaseAddress,I2C_INT_RECV_READY))
// {
// }
I2CReceivePointer[n_rxCount] = (unsigned char)I2CMasterDataGet(BaseAddress);
I2CMasterIntClearEx(BaseAddress, I2C_INT_RECV_READY);
}
I2CMasterStop(BaseAddress);
//I2C_Tick=TimerTick;
// while(0 == (I2CMasterIntRawStatus(BaseAddress) & I2C_INT_STOP_CONDITION))
// {
// }
// while(!((HW_RD_REG32(BaseAddress + I2C_IRQSTATUS_RAW)) & I2C_INT_STOP_CONDITION));
I2CMasterIntClearEx(BaseAddress, I2C_INT_STOP_CONDITION);
}
void I2CMasterEnable_1(uint32_t baseAddr)
{
/* Bring the I2C module out of reset */
HW_WR_FIELD32(baseAddr + I2C_CON, I2C_CON_I2C_EN,
I2C_CON_I2C_EN_ENABLE);
}
Regards,
Gaurav