Using Accelerometer(MMA8652FC) of lpc54618 eval-kit

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Using Accelerometer(MMA8652FC) of lpc54618 eval-kit

1,255 Views
subodhmankar
Contributor II

Hi,

I am referring :- MMA8652FC - Bare metal example project  for developing application based on accelerometer.

Following is the code which I am trying to use to read data from sensor.

#define EXAMPLE_I2C_MASTER_BASE (I2C2_BASE)                  /*FLEXCOMM2 I2C*/

#define I2C_MASTER_CLOCK_FREQUENCY (12000000)   

#define I2C_SLAVE_CLOCK_FREQUENCY (12000000)

#define EXAMPLE_I2C_MASTER ((I2C_Type *)EXAMPLE_I2C_MASTER_BASE)

#define I2C_MASTER_SLAVE_ADDR_7BIT (0x1DU)

#define I2C_BAUDRATE (100000) /* 100K */

#define I2C_DATA_LENGTH (8) /* MAX is 256 */

.

.

.

i2c_master_config_t masterConfig;

I2C_MasterGetDefaultConfig(&masterConfig);

/* Change the default baudrate configuration */

masterConfig.baudRate_Bps = I2C_BAUDRATE;

/* Initialize the I2C master peripheral */

I2C_MasterInit(EXAMPLE_I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY);

/* Create the I2C handle for the non-blocking transfer */   

I2C_MasterTransferCreateHandle(EXAMPLE_I2C_MASTER, &g_m_handle, NULL, NULL);

/* Setup the master transfer */

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Read;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = g_master_buff;

masterXfer.dataSize = I2C_DATA_LENGTH;

masterXfer.flags = kI2C_TransferDefaultFlag;

/* Send master non-blocking data to slave */

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

if (reVal != kStatus_Success)

{

   break;

}

/* Receive Data. */

if ((masterXfer.direction == kI2C_Read) && (masterXfer.dataSize > 0))

{

   result = I2C_MasterReadBlocking(EXAMPLE_I2C_MASTER, &g_master_buff, masterXfer.dataSize, masterXfer.flags);

}

I am still unable to read data from sensor.

What should I use to initialize sensor and get data from it?? [just like example provided in MMA8652FC - Bare metal example project]

As shown in document :- MMA8652FC - Bare metal example project

void MMA8652FC_Init (void)

{

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG2, 0x40); // Reset all registers to POR values

   Pause(0x631); // ~1ms delay

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, XYZ_DATA_CFG_REG, 0x00); // +/-2g range with ~0.977mg/LSB

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG2, 0x02); // High Resolution mode

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG3, 0x00); // Push-pull, active low interrupt

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG4, 0x01); // Enable DRDY interrupt

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG5, 0x01); // DRDY interrupt routed to INT1 - PTA5

   I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG1, 0x39); // ODR = 1.56Hz, Active mode

}

PINMUX SETUP:-

const uint32_t port3_pin23_config = (

IOCON_PIO_FUNC1 | /* Pin is configured as FC2_TXD_SCL_MISO */

IOCON_PIO_MODE_PULLUP | /* Selects pull-up function */

IOCON_PIO_INV_DI | /* Input function is not inverted */

IOCON_PIO_DIGITAL_EN | /* Enables digital function */

IOCON_PIO_INPFILT_OFF | /* Input filter disabled */

IOCON_PIO_OPENDRAIN_DI /* Open drain is disabled */

);

IOCON_PinMuxSet(IOCON, PORT3_IDX, PIN23_IDX, port3_pin23_config); /* PORT3 PIN22 (coords: N5) is configured as FC2_TXD_SCL_MISO */

const uint32_t port3_pin24_config = (

IOCON_PIO_FUNC1 | /* Pin is configured as FC2_TXD_SCL_MISO */

IOCON_PIO_MODE_PULLUP | /* Selects pull-up function */

IOCON_PIO_INV_DI | /* Input function is not inverted */

IOCON_PIO_DIGITAL_EN | /* Enables digital function */

IOCON_PIO_INPFILT_OFF | /* Input filter disabled */

IOCON_PIO_OPENDRAIN_DI /* Open drain is disabled */

);

IOCON_PinMuxSet(IOCON, PORT3_IDX, PIN24_IDX, port3_pin24_config); /* PORT3 PIN22 (coords: N5) is configured as FC2_TXD_SCL_MISO */

const uint32_t port3_pin4_config = (

IOCON_PIO_FUNC0 | /* Pin is configured as PIO3_14 */

IOCON_PIO_MODE_PULLUP | /* Selects pull-up function */

IOCON_PIO_INV_DI | /* Input function is not inverted */

IOCON_PIO_DIGITAL_EN | /* Enables digital function */

IOCON_PIO_INPFILT_OFF | /* Input filter disabled */

IOCON_PIO_SLEW_STANDARD | /* Standard mode, output slew rate control is enabled */

IOCON_PIO_OPENDRAIN_DI /* Open drain is disabled */

);

IOCON_PinMuxSet(IOCON, PORT3_IDX, PIN4_IDX, port3_pin4_config); /* PORT3 PIN14 (coords: E3) is configured as PIO3_14 */

Where should I modify my code so that I can make it work with sdk2.2 for lpc54618?

0 Kudos
4 Replies

799 Views
subodhmankar
Contributor II

Hi soledad,

I have written following code to read data from MMA8652 accelerometer register.

It's now showing any error while using function but I am not getting proper data

Please guide me on it.

static void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)

{

/* Signal transfer success when received success status. */

if (status == kStatus_Success)

{

   g_MasterCompletionFlag = true;

}

}

uint32_t mma8652_i2c_register_read(uint8_t first_reg_address, uint8_t * p_destination, uint8_t num_bytes)

{

status_t reVal = kStatus_Fail;

txBuff[0] = first_reg_address;

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Write;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = txBuff;               // REGISTER

masterXfer.dataSize = 1;

masterXfer.flags = kI2C_TransferNoStopFlag;

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

if (reVal != kStatus_Success)

{

   return -1;

}

/* Wait for transfer completed. */

while (!g_MasterCompletionFlag)

{

}

g_MasterCompletionFlag = false;

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Read;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = p_destination;           // buffer where we read data

masterXfer.dataSize = num_bytes;

masterXfer.flags = kI2C_TransferDefaultFlag;

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

if (reVal != kStatus_Success)

{

   return -1;

}

return reVal;

}

0 Kudos

799 Views
soledad
NXP Employee
NXP Employee

Hi,

This example was developed using a Kinetis KL25 device.

If you want to use this example for a LPC device then you need to replace the i2c functions in order to use the LPC i2c driver.

For example:

pastedImage_1.png

The MCUXpresso SDK contents i2c driver examples thjat you can use as reference.

Have a nice day!

Sol

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos

799 Views
subodhmankar
Contributor II

Hi soledad,

I have written following code to read data from MMA8652 accelerometer register.

It's now showing any error while using function but I am not getting proper data

Please guide me on it.

static void i2c_master_callback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData)

{

/* Signal transfer success when received success status. */

if (status == kStatus_Success)

{

   g_MasterCompletionFlag = true;

}

}

 

uint32_t mma8652_i2c_register_read(uint8_t first_reg_address, uint8_t * p_destination, uint8_t num_bytes)

{

status_t reVal = kStatus_Fail;

 

txBuff[0] = first_reg_address;

 

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Write;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = txBuff;               // REGISTER

masterXfer.dataSize = 1;

masterXfer.flags = kI2C_TransferNoStopFlag;

 

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

 

if (reVal != kStatus_Success)

{

   return -1;

}

 

/* Wait for transfer completed. */

while (!g_MasterCompletionFlag)

{

}

g_MasterCompletionFlag = false;

 

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Read;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = p_destination;           // buffer where we read data

masterXfer.dataSize = num_bytes;

masterXfer.flags = kI2C_TransferDefaultFlag;

 

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

 

if (reVal != kStatus_Success)

{

   return -1;

}

 

return reVal;

}

0 Kudos

799 Views
subodhmankar
Contributor II

Hi,

I2C_WriteRegister(MMA8652FC_I2C_ADDRESS, CTRL_REG2, 0x40); // Reset all registers to POR values

I replaced above code with following code

g_master_buff[0] = CTRL_REG2;

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Write;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = g_master_buff;

masterXfer.dataSize = 1;

masterXfer.flags = kI2C_TransferDefaultFlag;

/* Send master non-blocking data to slave */

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

if (reVal != kStatus_Success)

{

PRINTF("\r\n error in writing");

return ;

}

vTaskDelay(1);

g_master_buff[0] = 0x40U;

masterXfer.slaveAddress = I2C_MASTER_SLAVE_ADDR_7BIT;

masterXfer.direction = kI2C_Write;

masterXfer.subaddress = 0;

masterXfer.subaddressSize = 0;

masterXfer.data = g_master_buff;

masterXfer.dataSize = 1;

masterXfer.flags = kI2C_TransferDefaultFlag;

/* Send master non-blocking data to slave */

reVal = I2C_MasterTransferNonBlocking(EXAMPLE_I2C_MASTER, &g_m_handle, &masterXfer);

if (reVal != kStatus_Success)

{

PRINTF("\r\n error in writing");

return ;

}

Are these same? will it work properly? are there any remaining configurations?

0 Kudos