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
}
}