I2C Master Implementation in PSoC® 5LP using Low-level APIs - KBA 223957

Version 2

    Version: **

     

    Question:

    How do I implement I2C Master in PSoC® 5LP using low-level APIs?

     

    Answer:

    In use cases of communication with I2C slave memory devices, use the following code snippets:

     

    1.  Write Transaction

    For example:

    Slave address of the memory device: 0x08

    Address of the memory location: 0x00

    Number of bytes to be transmitted: 5

    Data to be transmitted: 1, 2, 3, 4, 5

    #define SLAVE_ADDRESS (0x08u)

     

    #define SUB_ADDRESS_LOCATION (0x00u)

    #define SUB_ADDRESS_LENGTH (0x01u)

     

    #define WRITE_DATA_LENGTH (5u)

    #define WRITE_DATA_BUFFER_LENGTH (WRITE_DATA_LENGTH + SUB_ADDRESS_LENGTH)

     

    uint8 i = 0;

        uint8 status = 0;

     

    /* Load the write buffer with the sub-address location and data to be transmitted */

     

    uint8 write_data_buffer[WRITE_DATA_BUFFER_LENGTH] = { SUB_ADDRESS_LOCATION , 1 , 2 , 3 , 4 , 5 };

     

    /* Send start condition and slave address, followed by write bit */

     

          status = I2C_MasterSendStart(SLAVE_ADDRESS, I2C_WRITE_XFER_MODE);     

     

         /* Check if the master status is error free */

       

         if(status == I2C_MSTR_NO_ERROR)

         {

     

            for(i=0; i<WRITE_DATA_BUFFER_LENGTH; i++)

            {

     

    /* Transmit data to be written to the slave that was loaded into the write buffer initially */

               

                status = I2C_MasterWriteByte(write_data_buffer[i]);

     

                /* Check if the master status is error free */

               

                if(status != I2C_MSTR_NO_ERROR)

                {

                    break;

                }

            }

    }

     

    /* Send stop condition after the transaction is completed */

            

    I2C_MasterSendStop();

     

      2. Read Transaction

    For example:

    Slave address of the memory device: 0x08

    Address of the memory location: 0x00

    Number of bytes to be read: 5

     

    #define SLAVE_ADDRESS (0x08u)

     

    #define SUB_ADDRESS_LOCATION (0x00u)

    #define SUB_ADDRESS_LENGTH (0x01u)

     

    #define READ_DATA_LENGTH (5u)

     

    uint8 i = 0;

        uint8 status = 0;

     

    /* Load the write buffer with the sub-address location */

     

    uint8 write_data_buffer[SUB_ADDRESS_LENGTH] = { SUB_ADDRESS_LOCATION };

     

    /* Initialize the read buffer */

     

    uint8 read_data_buffer[READ_DATA_LENGTH];

     

    /* Send start condition and slave address, followed by write bit */

     

         status = I2C_MasterSendStart(SLAVE_ADDRESS, I2C_WRITE_XFER_MODE);     

     

              /* Check if the master status is error free */

               

         if(status == I2C_MSTR_NO_ERROR)

         {

     

            for(i=0; i< SUB_ADDRESS_LENGTH; i++)

            {

          

                /* Send the sub-address */

              

                status = I2C_MasterWriteByte(write_data_buffer[i]);

     

                /* Check if the master status is error free */

              

                if(status != I2C_MSTR_NO_ERROR)

                {

                    break;

                }

            }

     

           /* Send start condition and slave address, followed by read bit */

           

          status = I2C_MasterSendRestart(SLAVE_ADDRESS, I2C_READ_XFER_MODE);

              

         /* Check if the master status is error free */

       

           if(status == I2C_MSTR_NO_ERROR)

         {

     

                for(i=0; i<(READ_DATA_LENGTH-1); i++)

                {

                   

                /* Load the read buffer with the data read from slave, followed by ACK */

               

    read_data_buffer[i] = I2C_MasterReadByte(I2C_ACK_DATA);

                }

     

                /* Load the read buffer with the last data read from slave, followed by NACK */

               

    read_data_buffer[i] = I2C_MasterReadByte(I2C_NAK_DATA);

            }

     

    }

     

         /* Send stop condition after the transaction is completed */

       

    I2C_MasterSendStop();

     

    Refer to the I2C Component Datasheet for details on each API.

     

    Note High-level APIs such as WriteBuf() and ReadBuf(), should not be used in conjunction with the low-level APIs.