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.

TM4C129ENCPDT: I2C2 - I2CMasterBusy(I2C2_BASE)

Part Number: TM4C129ENCPDT

Hi all,

I'm trying to get some data from an I2C slave, but the program gets stuck in I2CMasterBusy(I2C2_BASE), when using I2C2. I can't get any signal with the scope. I have pull-up resistors in SCL and SDA.

When I try to use I2C5, it works fine.

I can get some direction in this issue, please?

#include <stdbool.h>
#include <stdint.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

#define SLAVE_ADDRESS 0b10011010
#define REGISTER    0x00


//read specified register on slave device
uint32_t I2CReceive(uint8_t slave_addr, uint8_t reg)
{
    //specify that we are writing (a register address) to the
    //slave device
    I2CMasterSlaveAddrSet(I2C2_BASE, slave_addr, false);

    //specify register to be read
    I2CMasterDataPut(I2C2_BASE, reg);

    //send control byte and register address byte to slave device
    I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_START);

    SysCtlDelay(100);
    //wait for MCU to finish transaction
    while(!(I2CMasterBusy(I2C2_BASE)));
    SysCtlDelay(100);
    while(I2CMasterBusy(I2C2_BASE));

    //specify that we are going to read from slave device
    I2CMasterSlaveAddrSet(I2C2_BASE, slave_addr, true);

    //send control byte and read from the register we
    //specified
    I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);

    SysCtlDelay(100);
    //wait for MCU to finish transaction
    while(!(I2CMasterBusy(I2C2_BASE)));
    SysCtlDelay(100);
    while(I2CMasterBusy(I2C2_BASE));

    //return data pulled from the specified register
    return I2CMasterDataGet(I2C2_BASE);
}

//*****************************************************************************
//
// Configure the I2C5 master.
//
//*****************************************************************************
volatile uint32_t test = 0;
void
main(void)
{
    uint32_t ui32SysClock;

    ui32SysClock =     SysCtlClockFreqSet((SYSCTL_OSC_INT | SYSCTL_USE_PLL |
            SYSCTL_CFG_VCO_480), 120000000);

    //
    // The I2C2 peripheral must be enabled before use.
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C2))
    {}

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);

    GPIOPinConfigure(GPIO_PN4_I2C2SDA);
    GPIOPinConfigure(GPIO_PN5_I2C2SCL);

    GPIOPinTypeI2CSCL(GPIO_PORTN_BASE, GPIO_PIN_5);
    GPIOPinTypeI2C(GPIO_PORTN_BASE, GPIO_PIN_4);

    I2CMasterInitExpClk(I2C2_BASE, ui32SysClock, false);


    // Enable Power in External Conector
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
    GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE, GPIO_PIN_0);
    GPIOPinWrite(GPIO_PORTJ_BASE, GPIO_PIN_0, ~0);

    for(;;) {
        test = I2CReceive(REGISTER, ID_ADDRESS);
        SysCtlDelay(60000000); //~500 ms
    }

}

  • Hi Allef,
    If it works for I2C5 then it should work for I2C2. One thing curious is the call I2CReceive(REGISTER, ID_ADDRESS). Why are you passing REGISTER which is equal to 0 as the slave address? Also what is ID_ADDRESS defined to?
  • Hi, Charles!

    I'm sorry. I change the defines before I past here. I'm debugging the hardware now. Here is the correct code.

    #include <stdbool.h>
    #include <stdint.h>
    #include "inc/hw_i2c.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    #include "driverlib/i2c.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    
    #define SLAVE_ADDRESS 0b10011010
    #define REGISTER      0x01
    
    
    //read specified register on slave device
    uint32_t I2CReceive(uint8_t slave_addr, uint8_t reg)
    {
        //specify that we are writing (a register address) to the
        //slave device
        I2CMasterSlaveAddrSet(I2C2_BASE, slave_addr, false);
    
        //specify register to be read
        I2CMasterDataPut(I2C2_BASE, reg);
    
        //send control byte and register address byte to slave device
        I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_BURST_SEND_START);
    
        //wait for MCU to finish transaction
        while(!(I2CMasterBusy(I2C2_BASE)));
        while(I2CMasterBusy(I2C2_BASE));
    
        //specify that we are going to read from slave device
        I2CMasterSlaveAddrSet(I2C2_BASE, slave_addr, true);
    
        //send control byte and read from the register we
        //specified
        I2CMasterControl(I2C2_BASE, I2C_MASTER_CMD_SINGLE_RECEIVE);
    
        //wait for MCU to finish transaction
        while(!(I2CMasterBusy(I2C2_BASE)));
        while(I2CMasterBusy(I2C2_BASE));
    
        //return data pulled from the specified register
        return I2CMasterDataGet(I2C2_BASE);
    }
    
    //*****************************************************************************
    //
    // Configure the I2C5 master.
    //
    //*****************************************************************************
    volatile uint32_t test = 0;
    void
    main(void)
    {
        uint32_t ui32SysClock;
    
        ui32SysClock =     SysCtlClockFreqSet((SYSCTL_OSC_INT | SYSCTL_USE_PLL |
                SYSCTL_CFG_VCO_480), 120000000);
    
        //
        // The I2C2 peripheral must be enabled before use.
        //
        SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C2);
        while(!SysCtlPeripheralReady(SYSCTL_PERIPH_I2C2))
        {}
    
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    
        GPIOPinConfigure(GPIO_PN4_I2C2SDA);
        GPIOPinConfigure(GPIO_PN5_I2C2SCL);
    
        GPIOPinTypeI2CSCL(GPIO_PORTN_BASE, GPIO_PIN_5);
        GPIOPinTypeI2C(GPIO_PORTN_BASE, GPIO_PIN_4);
    
        I2CMasterInitExpClk(I2C2_BASE, ui32SysClock, false);
    
    
        // Enable Power in External Conector
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
        GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE, GPIO_PIN_0);
        GPIOPinWrite(GPIO_PORTJ_BASE, GPIO_PIN_0, ~0);
    
        for(;;) {
            test = I2CReceive(SLAVE_ADDRESS, REGISTER);
            SysCtlDelay(60000000); //~500 ms
        }
    
    }