Jump to main content

##

# 2.110.84 SERCOMx_I2C_CommandSet Function

## C

    /* x = SERCOM instance number */

    /* I2C slave mode */

    void SERCOMx_I2C_CommandSet(SERCOM_I2C_SLAVE_COMMAND command)

## Summary

Sets I2C slave command

## Description

Sets I2C slave command. The I2C slave state machine takes action based on the set command.

## Precondition

SERCOMx_I2C_Initialize must have been called for the associated SERCOM I2C instance

## Parameters

Param | Description
--- | ---
SERCOM_I2C_SLAVE_COMMAND_SEND_ACK | Send ACK succeeded by reception of next byte
SERCOM_I2C_SLAVE_COMMAND_SEND_NAK | Send NAK succeeded by reception of next byte
SERCOM_I2C_SLAVE_COMMAND_RECEIVE_ACK_NAK | Execute a byte read operation followed by ACK/NACK reception
SERCOM_I2C_SLAVE_COMMAND_WAIT_FOR_START | Wait for any start (S/Sr) condition

## Returns

None.

## Example

The below code snippet shows how SERCOMx_I2C_CommandSet() API can be used when SERCOM I2C slave PLIB is used in polled mode (interrupt is disabled).

    static bool isFirstByteSent;
    static bool transferDir;
    // Define a flag that inidicates if the I2C slave application is busy or ready
    static bool isAppBusy;
    SERCOM_I2C_SLAVE_INTFLAG intFlags = SERCOM5_I2C_InterruptFlagsGet();

    if (intFlags & SERCOM_I2C_SLAVE_INTFLAG_AMATCH)
    {
        isFirstByteSent = false;

        // Read and save the transfer direction in a global variable.
        transferDir = SERCOM5_I2C_TransferDirGet();

        if (isAppBusy == true)
        {
            // I2C slave application is busy. Send NAK.
            SERCOM0_I2C_SendCommand(SERCOM_I2C_SLAVE_COMMAND_SEND_NAK);
        }
        else
        {
            // I2C slave application is ready. Send ACK succeeded by reception of next byte
            SERCOM0_I2C_SendCommand(SERCOM_I2C_SLAVE_COMMAND_SEND_ACK);
        }
    }
    else if (intFlags & SERCOM_I2C_SLAVE_INTFLAG_DRDY)
    {
        if (transferDir == SERCOM_I2C_SLAVE_TRANSFER_DIR_WRITE)
        {
            // I2C master is writing data to I2C slave. Read the received byte.
            rxByte = SERCOM0_I2C_ReadByte();

            // Execute acknowledge action succeeded by reception of next byte
            SERCOM0_I2C_SendCommand(SERCOM_I2C_SLAVE_COMMAND_SEND_ACK);
        }
        else
        {
            // I2C master is reading data from I2C slave. Check if the previous data
            // is acknowledged by the I2C master.

            if (isFirstByteSent == false)
            {
                SERCOM0_I2C_WriteByte(txData);
                isFirstByteSent = true;
            }
            else
            {
                if (SERCOM0_I2C_LastByteAckStatusGet() == SERCOM_I2C_SLAVE_ACK_STATUS_RECEIVED_ACK)
                {
                    // Last byte was acknowledged by the I2C master; send another byte.

                    SERCOM0_I2C_WriteByte(txData);

                    //Execute a byte read operation followed by ACK/NACK reception
                    SERCOM0_I2C_SendCommand(SERCOM_I2C_SLAVE_COMMAND_RECEIVE_ACK_NAK);
                }
                else
                {
                    // Last byte was NAK'd by the I2C master; wait for start condition.

                    //Wait for any start (S/Sr) condition
                    SERCOM0_I2C_SendCommand(SERCOM_I2C_SLAVE_COMMAND_WAIT_FOR_START);
                }
            }
        }
    }
    else if (intFlags & SERCOM_I2C_SLAVE_INTFLAG_PREC)
    {
        SERCOM0_I2C_InterruptFlagsClear(SERCOM_I2C_SLAVE_INTFLAG_PREC);
    }

## Remarks

This API is generated when Smart mode is disabled and is typically used when the SERCOM I2C slave PLIB is used in polled mode (interrupt is disabled).