The MCUXpresso SDK provides a peripheral driver for the Inter-Integrated Circuit (I2C) module of MCUXpresso SDK devices.
The I2C driver includes functional APIs and transactional APIs.
Functional APIs are feature/property target low-level APIs. Functional APIs can be used for the I2C master/slave initialization/configuration/operation for optimization/customization purpose. Using the functional APIs requires the knowledge of the I2C master peripheral and how to organize functional APIs to meet the application requirements. The I2C functional operation groups provide the functional APIs set.
Transactional APIs are transaction target high-level APIs. The transactional APIs can be used to enable the peripheral quickly and also in the application if the code size and performance of transactional APIs satisfy the requirements. If the code size and performance are critical requirements, see the transactional API implementation and write custom code using the functional APIs or accessing the hardware registers.
Transactional APIs support asynchronous transfer. This means that the functions I2C_MasterTransferNonBlocking() set up the interrupt non-blocking transfer. When the transfer completes, the upper layer is notified through a callback function with the status.
Typical use case
Master Operation in functional method
uint8_t status;
uint8_t txBuff[BUFFER_SIZE];
I2C_MasterInit(EXAMPLE_I2C_MASTER_BASEADDR, &masterConfig, I2C_MASTER_CLK);
while(!((status = I2C_GetStatusFlag(EXAMPLE_I2C_MASTER_BASEADDR)) & kI2C_IntPendingFlag))
{
}
if(status & kI2C_ReceiveNakFlag)
{
}
if(result)
{
return result;
}
while(!(I2C_GetStatusFlag(EXAMPLE_I2C_MASTER_BASEADDR) & kI2C_IntPendingFlag))
{
}
Master Operation in interrupt transactional method
volatile bool g_MasterCompletionFlag = false;
uint8_t status;
uint8_t txBuff[BUFFER_SIZE];
{
{
g_MasterCompletionFlag = true;
}
}
I2C_MasterInit(EXAMPLE_I2C_MASTER_BASEADDR, &masterConfig, I2C_MASTER_CLK);
masterXfer.
data = txBuff;
while (!g_MasterCompletionFlag)
{
}
g_MasterCompletionFlag = false;
Master Operation in DMA transactional method
volatile bool g_MasterCompletionFlag = false;
uint8_t txBuff[BUFFER_SIZE];
{
{
g_MasterCompletionFlag = true;
}
}
I2C_MasterInit(EXAMPLE_I2C_MASTER_BASEADDR, &masterConfig, I2C_MASTER_CLK);
masterXfer.
data = txBuff;
while (!g_MasterCompletionFlag)
{
}
g_MasterCompletionFlag = false;
Slave Operation in functional method
uint8_t status;
slaveConfig.slaveAddr = 7-bit address
slaveConfig.addressingMode = kI2C_Address7bit/kI2C_RangeMatch;
while(!((status = I2C_GetStatusFlag(EXAMPLE_I2C_SLAVE_BASEADDR)) & kI2C_AddressMatchFlag))
{
}
if (status & kI2C_TransferDirectionFlag)
{
}
else
{
}
return result;
Slave Operation in interrupt transactional method
volatile bool g_SlaveCompletionFlag = false;
{
{
xfer->data = g_slave_buff;
xfer->dataSize = I2C_DATA_LENGTH;
break;
xfer->data = g_slave_buff;
xfer->dataSize = I2C_DATA_LENGTH;
break;
g_SlaveCompletionFlag = true;
break;
default:
g_SlaveCompletionFlag = true;
break;
}
}
slaveConfig.slaveAddr = 7-bit address
slaveConfig.addressingMode = kI2C_Address7bit/kI2C_RangeMatch;
while (!g_SlaveCompletionFlag)
{
}
g_SlaveCompletionFlag = false;