This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/TM4C1294NCPDT: I2C Communication not working

Part Number: TM4C1294NCPDT

Tool/software: Code Composer Studio

Dear Team,

I have I2C example not working. Can anyone tell me anything i missed out.

i2ceeprom.c

#define Board_EEPROMADDRESS (0x54)

#define Board_EEPROMPAGESIZE (0x40)
#define Board_EEPROMADDRESSIZE (0x02)
#define Board_EEPROMSTARTADDR (0)

extern UART_Handle uart5;


I2C_Handle i2c;
UChar txBuffer[Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE];
UChar rxBuffer[Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE];

/*
 * ======== writeEEPROM ========
 * Function performs a write operation onto the EERPOM
 *
 * IMPORTANT:
 * The transmitBuffer must include the EEPROMs internal address pointer of
 * size txAddressLength at the beginning of the transmitBuffer array.
 * To send a 64 bytes of data, the transmitBuffer and writeCount must be 64
 * bytes + txAddressLength bytes in size.
 */
UInt writeEEPROM(UChar slaveAddress, UChar *transmitBuffer,
		UInt txAddressLength, UInt txDataLength)
{
	UInt transferOK;
	I2C_Transaction i2cTransaction;

	i2cTransaction.slaveAddress = slaveAddress; /* 7-bit slave address */
	i2cTransaction.writeBuf = transmitBuffer; /* txBuffer to be TX'd */
	/* Number of bytes to be TX'd */
	i2cTransaction.writeCount = txAddressLength + txDataLength;
	i2cTransaction.readBuf = NULL; /* rxBuffer to be RX'd */
	i2cTransaction.readCount = 0; /* Number of bytes to be RX'd */
	transferOK = I2C_transfer(i2c, &i2cTransaction); /* Perform I2C transfer */

	return (transferOK);
}

/*
 * ======== readEEPROM ========
 * Function performs a read operation from the EEPROM
 *
 * IMPORTANT:
 * The receiveBuffer must include the EEPROMs internal address pointer of
 * size rxAddressLength at the beginning of the receiveBuffer array.
 * To receive 64 bytes of data, the receiveBuffer must be 64 bytes +
 * rxAddressLength bytes in size.
 */
UInt readEEPROM(UChar slaveAddress, UChar *receiveBuffer,
		UInt rxAddressLength, UInt rxDataLength)
{
	UInt transferOK;
	I2C_Transaction i2cTransaction;

	/* Read the Erased Page in the EEPROM */
	i2cTransaction.slaveAddress = slaveAddress; /* 7-bit slave address */
	i2cTransaction.writeBuf = receiveBuffer; /* txBuffer to be TX'd */
	i2cTransaction.writeCount = rxAddressLength; /* Number of bytes to TX */
	/* rxBuffer to be RX'd */
	i2cTransaction.readBuf = receiveBuffer + rxAddressLength;
	i2cTransaction.readCount = rxDataLength; /* Number of bytes to RX */
	transferOK = I2C_transfer(i2c, &i2cTransaction); /* Perform I2C transfer */

	return (transferOK);
}

/*
 * ======== waitEEPROM ========
 * The waitEEPROM function polls the EEPROM to determine if it's ready receive
 * another I2C command immediately after a write function has been called.
 *
 * EEPROMs require some significant amount of time to complete a write
 * operation, therefore we need to check when its ready for the next command.
 */
Void waitEEPROM(UChar slaveAddress)
{
	UChar txBuffer[1];
	I2C_Transaction i2cTransaction;

	/* Wait for the EEPROM to be ready for the next read/write operation */
	txBuffer[0] = 0x00; /* Some dummy value */
	i2cTransaction.slaveAddress = slaveAddress; /* 7-bit slave address */
	i2cTransaction.writeBuf = txBuffer; /* txBuffer to be TX'd */
	i2cTransaction.writeCount = 1; /* Number of bytes to be TX'd */
	i2cTransaction.readBuf = NULL; /* rxBuffer to be RX'd */
	i2cTransaction.readCount = 0; /* Number of bytes to be RX'd */
	/*
	 * Perform I2C transfer until a good I2C has been ACK'd by the slave
	 * indicating that the I2C slave is now ready for the next command
	 */
	while (!I2C_transfer(i2c, &i2cTransaction)) {
	}
}



void I2C_callback(I2C_Handle hI2C, I2C_Transaction *i2cTrans, bool b)
{
	System_printf("I2C CallBack");
}
Void taskFxn(UArg arg0, UArg arg1)
{
	UInt i;
	UInt transferOK;
	I2C_Params i2cParams;

	/* Create I2C for usage */
	I2C_Params_init(&i2cParams);
	i2cParams.bitRate = I2C_400kHz;
	i2c = I2C_open(Board_I2C_EEPROM, &i2cParams);
	if (i2c == NULL) {
		System_abort("Error Initializing I2C\n");
	}
	else {
		System_printf("I2C Initialized!\n");
	}

	/* Set txBuffer and rxBuffer EEPROM byte address */
	for (i = 0; i < Board_EEPROMADDRESSIZE; i++) {
		txBuffer[i] = Board_EEPROMSTARTADDR >> (i * 8); /* EEPROM TX Address */
		rxBuffer[i] = Board_EEPROMSTARTADDR >> (i * 8); /* EEPROM RX Address */
	}

	/* Write a page with all 0xFF's into the EEPROM */
	for (i = Board_EEPROMADDRESSIZE;
			i < Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE; i++) {
		/* Fill with "Erased" content */
		txBuffer[i] = 0xFF;
	}
	transferOK = writeEEPROM(Board_EEPROMADDRESS, txBuffer,
			Board_EEPROMADDRESSIZE, Board_EEPROMPAGESIZE);
	if (!transferOK) {
		System_abort("Error in I2C Transfer\n");
	}

	waitEEPROM(Board_EEPROMADDRESS);

	/* Read a page from the EEPROM */
	transferOK = readEEPROM(Board_EEPROMADDRESS, rxBuffer,
			Board_EEPROMADDRESSIZE, Board_EEPROMPAGESIZE);
	if (!transferOK) {
		System_abort("Error in I2C Transfer\n");
	}

	/* Compare memory contents */
	if (memcmp(txBuffer, rxBuffer,
			Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE) == 0) {
		System_printf("Page has been erased\n");
	}
	else {
		System_printf("Page was NOT erased\n");
	}


	/* Write a page with incremented values into the EEPROM */
	for (i = Board_EEPROMADDRESSIZE;
			i < Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE; i++) {
		txBuffer[i] = i - Board_EEPROMADDRESSIZE;
	}
	transferOK = writeEEPROM(Board_EEPROMADDRESS, txBuffer,
			Board_EEPROMADDRESSIZE, Board_EEPROMPAGESIZE);
	if (!transferOK) {
		System_abort("Error in I2C Transfer\n");
	}

	waitEEPROM(Board_EEPROMADDRESS);


	/* Read a page from the EEPROM */
	transferOK = readEEPROM(Board_EEPROMADDRESS, rxBuffer,
			Board_EEPROMADDRESSIZE, Board_EEPROMPAGESIZE);
	if (!transferOK) {
		System_abort("Error in I2C Transfer\n");
	}

	/* Compare memory contents */
	if (memcmp(txBuffer, rxBuffer,
			Board_EEPROMADDRESSIZE + Board_EEPROMPAGESIZE) == 0) {
		System_printf("Page was successfully written with data\n");
	}
	else {
		System_printf("Page was NOT written with data\n");
	}

	/* Deinitialized I2C */
	I2C_close(i2c);
	System_printf("I2C Deinitialized!\n");

	System_printf("Done\n");

	System_flush();

	/*
	 * Spin to avoid SDOCM00105002 "TI-RTOS examples with no heap get an error
	 * if they call BIOS_exit"
	 */
	while(true);
}

i2ctest_main.c

int main(void)
{
	/* Call board init functions */
	Board_initGeneral();
	Board_initGPIO();
	Board_initUART();
	Board_initI2C();

	taskFxn(1,1);
	/* Start BIOS */
	BIOS_start();
}

EK_TM4C1294XL.c

void EK_TM4C1294XL_initI2C(void)
{
	/* I2C 0 */
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
	while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOB));
	SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
	while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C0));

	GPIOPinConfigure(GPIO_PB2_I2C0SCL);
	GPIOPinConfigure(GPIO_PB3_I2C0SDA);
	GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
	GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);

	I2C_init();
}

  • Hello Foresight,

    You are going to need to provide more details here to work with. What isn't working? Are you getting a compile error? Is the problem locking up or faulting at all?

    If there are no errors you can see then have you checked to see if there are pull-up resistors on your I2C lines?

    Do you have an oscilloscope to check the I2C lines and monitor the output?

  • Hello Ralph,

    Is it not poetic that in 'hindsight' - more & proper details are (surely) required?

  • Hello Foresight,

    I haven't heard back from you, so I’m assuming you were able to resolve your issue.

    I will close this thread now, but if you have not solved this issue then post a reply below (or open a new thread if the thread has locked due to time-out).

    Please be sure to address my questions from my post on August 28 if you do need help with this still as we need more information to provide support.