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?
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;
}
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:
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!
-----------------------------------------------------------------------------------------------------------------------
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;
}
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?