This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

RTOS/AM5746: About I2C driver software in PROCESSOR-SDK-RTOS-AM57X

Guru 10235 points

Part Number: AM5746

Tool/software: TI-RTOS

Hello, TI Experts,

 

Our customer sent us questions about I2C driver software of AM5746.

 

Question:

1: Does "I2C driver software of AM5746" support DMA?

     - They didn't find "DMA function" in the below TI-RTOS UserGuide "5.6 I2C Driver" .

       ( http://www.ti.com/lit/ug/spruhd4m/spruhd4m.pdf )

2: Does "I2C driver software of AM5746" support 1Mbps and 3.4Mbps?

     - They didn't find "1Mbps and 3.4Mbps" in the TI-RTOS UserGuide "5.6 I2C Driver" .

3: Does "I2C driver software of AM5746" support Slave Mode?

     - They found "The I2C driver does not support I2C slave mode at this time." in the TI-RTOS UserGuide "5.6 I2C Driver" .

 

They found "DMA function", "up to 3.4Mbps" and "Slave mode support" in th below TRM "24.1 Multimaster High-Speed I2C Controller".

So, we would appreciate if you tell us how to realize those I2C functions and how to run "sample code" in PROCESSOR-SDK-RTOS-AM57X.

 

Best regards,

  • 1: Does "I2C driver software of AM5746" support DMA?

         - They didn't find "DMA function" in the below TI-RTOS UserGuide "5.6 I2C Driver" .

           ( http://www.ti.com/lit/ug/spruhd4m/spruhd4m.pdf )

    I2C driver in Processor SDK RTOS doesn`t support DMA. The device does support One read DMA event and one write DMA  event that the DMA can use but the driver currently doesn`t use this feature.

    Please note that the customer is refering to TI RTOS user guide which is the baseline RTOS USer guide and the drivers referred in the document are only supported for MCU class devices. For Processor SDK RTOS, the documentation is available from here:

    http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/Device_Drivers.html#i2c 

    2: Does "I2C driver software of AM5746" support 1Mbps and 3.4Mbps?

         - They didn't find "1Mbps and 3.4Mbps" in the TI-RTOS UserGuide "5.6 I2C Driver" .

  • Hi,

    Thank you very much for your kindness.

    I really appreciate your help.

     

    I understand "the below link which you tell us" is appropriate.

    http://software-dl.ti.com/processor-sdk-rtos/esd/docs/latest/rtos/Device_Drivers.html#i2c

     

    So, I checked the link.

    But I cannot find the related description about "our question No.2" like below.

    > Does "I2C driver software of AM5746" support 1Mbps and 3.4Mbps?

     

    We would appreciate if you answer the question No.2.

     

    Best regards,

     

  • We currently don`t publish the I2C driver level performance numbers as in the cae of Processor SDK Linux. However, most drivers have tests and a design document that address some of these questions. If you have installed the Processor SDK RTOS for AM57xx devices, You will find the API guide, Design guide and the test code in the pdk_am57xx_1_0_12\packages\ti\drv\i2c folder unders docs and tests folder.

    I am providing the test code where all the HW supported bit rates are configured for you reference:

    /**
     *  \file   main_test.c
     *
     *  \brief  Example application main file. This application will read the data
     *          from eeprom and compares it with the known data.
     *
     */
    
    /*
     * Copyright (C) 2014 - 2018 Texas Instruments Incorporated - http://www.ti.com/
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * Redistributions of source code must retain the above copyright
     * notice, this list of conditions and the following disclaimer.
     *
     * Redistributions in binary form must reproduce the above copyright
     * notice, this list of conditions and the following disclaimer in the
     * documentation and/or other materials provided with the
     * distribution.
     *
     * Neither the name of Texas Instruments Incorporated nor the names of
     * its contributors may be used to endorse or promote products derived
     * from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
     */
    
    #ifdef USE_BIOS
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/System.h>
    #include <xdc/runtime/Error.h>
    
    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>
    #if defined(SOC_AM65XX)
    #if defined (__aarch64__)
    #include <ti/sysbios/family/arm/v8a/Mmu.h>
    #endif
    #endif
    #endif /* #ifdef USE_BIOS */
    
    #include <stdio.h>
    #include <string.h>
    
    /* TI-RTOS Header files */
    #include <ti/drv/i2c/I2C.h>
    #include <ti/drv/i2c/soc/I2C_soc.h>
    #include "I2C_log.h"
    #include "I2C_board.h"
    #ifdef SOC_AM65XX
    #include <ti/csl/src/ip/fss/V0/cslr_fss.h>
    #include <ti/csl/src/ip/rat/V0/csl_rat.h>
    #include <ti/csl/soc/am65xx/src/cslr_soc_baseaddress.h>
    #include <ti/csl/soc/am65xx/src/cslr_mcu_ctrl_mmr.h>
    #include <ti/csl/soc/am65xx/src/cslr_mcu_pll_mmr.h>
    #include <ti/csl/soc/am65xx/src/cslr_wkup_ctrl_mmr.h>
    #endif
    
    #if defined (SOC_AM335X) || defined (SOC_AM437x)
    /* EEPROM data -Board specific */
    extern char eepromData[I2C_EEPROM_RX_LENGTH];
    #endif
    
    /**********************************************************************
     ************************** Macros ************************************
     **********************************************************************/
    
    #define I2C_TRANSACTION_TIMEOUT         (10000U)
    
    
    /**********************************************************************
     ************************** Internal functions ************************
     **********************************************************************/
    
    /* Data compare function */
    bool CompareData(char *expData, char *rxData, unsigned int length);
    
    #if defined (SOC_AM335X) || defined (SOC_AM437x) || defined (SOC_AM571x) || defined (SOC_AM572x) || defined (SOC_AM574x) || defined (SOC_AM65XX)
    /* Probe and runtime bus frequnecy configuration test */
    static bool I2C_Probe_BusFrequency_test(I2C_Handle handle);
    static bool I2C_timeout_test(I2C_Handle handle);
    #endif
    /**********************************************************************
     ************************** Global Variables **************************
     **********************************************************************/
    #ifdef SOC_AM65XX
    #ifdef USE_BIOS
    #if defined (__aarch64__)
    Void InitMmu()
    {
        Mmu_MapAttrs attrs;
        Bool         retVal;
        uint32_t     mapIdx = 0;
    
        Mmu_initMapAttrs(&attrs);
    
        attrs.attrIndx = 0;
        retVal = Mmu_map(0x00100000, 0x00100000, 0x00900000, &attrs); /* Main MMR0 cfg  */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x00400000, 0x00400000, 0x00001000, &attrs); /* PSC0          */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x01800000, 0x01800000, 0x00100000, &attrs); /* gicv3          */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x02400000, 0x02400000, 0x000c0000, &attrs); /* dmtimer        */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
        
        mapIdx++;
        retVal = Mmu_map(0x02800000, 0x02800000, 0x00040000, &attrs); /* uart           */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x02000000, 0x02000000, 0x00100000, &attrs); /* main I2C       */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x42120000, 0x42120000, 0x00001000, &attrs); /* Wkup I2C0       */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x02100000, 0x02100000, 0x00080000, &attrs); /* McSPI          */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x40f00000, 0x40f00000, 0x00020000, &attrs); /* MCU MMR0 CFG   */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x40d00000, 0x40d00000, 0x00002000, &attrs); /* PLL0 CFG       */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x43000000, 0x43000000, 0x00020000, &attrs); /* WKUP MMR0 cfg  */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x02C40000, 0x02C40000, 0x00100000, &attrs); /* pinmux ctrl    */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x2A430000, 0x2A430000, 0x00001000, &attrs); /* ctrcontrol0    */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x30800000, 0x30800000, 0x0C000000, &attrs); /* navss          */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x42000000, 0x42000000, 0x00001000, &attrs); /* PSC WKUP*/
        if (retVal == FALSE)
        {
             goto mmu_exit;
        }
    
        attrs.attrIndx = 7;
        mapIdx++;
        retVal = Mmu_map(0x80000000, 0x80000000, 0x03000000, &attrs); /* ddr            */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
        mapIdx++;
        retVal = Mmu_map(0x70000000, 0x70000000, 0x04000000, &attrs); /* msmc           */
        if(retVal == FALSE)
        {
            goto mmu_exit;
        }
    
    mmu_exit:
        if(retVal == FALSE)
        {
            System_printf("Mmu_map idx %d returned error %d", mapIdx, retVal);
            while(1);
        }
    
        return;
    }
    #endif /* #if defined (__aarch64__) */
    #endif /* #ifdef USE_BIOS */
    #endif /* #if defined(SOC_AM65XX) */
    
    #if defined (idkAM572x)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x32,
                                  0x49, 0x44};
    #elif defined (idkAM574x)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x34,
                                  0x49, 0x44};
    #elif defined (idkAM571x)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4D, 0x35, 0x37, 0x31,
                                  0x49, 0x44};
    #elif defined (evmAM572x)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x55, 0x33, 0xEE, 0x41, 0x4d, 0x35, 0x37, 0x32,
                                  0x50, 0x4d};
    #elif defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L) || defined (evmK2G) || defined (iceK2G) || defined (EVM_OMAPL137)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                                  0x09, 0x10};
    #elif defined (evmC6678) || defined (evmC6657) || defined (am65xx_evm) || defined (am65xx_idk)
    char eepromData[I2C_EEPROM_TEST_LENGTH] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                                  0x00, 0x00};
    #else
    #endif
    
    /*
     *  ======== Board_initI2C ========
     */
    bool Board_initI2C(void)
    {
        Board_initCfg boardCfg;
        Board_STATUS  boardStatus;
    #if defined (idkAM571x)
        Board_IDInfo  id;
    #endif
        I2C_HwAttrs   i2c_cfg;
    #if defined (evmK2G)
        Board_SoCInfo socInfo;
    #endif
    
       /* Get the default I2C init configurations */
        I2C_socGetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
    
        /* Modify the default I2C configurations if necessary */
    #ifdef SOC_AM65XX
        /* No I2C instanced connected to eeprom in main domain, use i2c instance in wakeup domain */
        i2c_cfg.baseAddr = CSL_WKUP_I2C0_CFG_BASE;
    #if defined (__aarch64__)
        i2c_cfg.intNum = CSL_GIC0_INTR_WKUP_I2C0_BUS_POINTRPEND;
    #else
        i2c_cfg.intNum = CSL_MCU0_INTR_I2C0_POINTRPEND;
    #endif
    #endif
    
        /* Set the default I2C init configurations */
        I2C_socSetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
    
    #if defined(evmK2E) || defined(evmC6678)
        boardCfg = BOARD_INIT_MODULE_CLOCK |
            BOARD_INIT_UART_STDIO;
    #else
        boardCfg = BOARD_INIT_PINMUX_CONFIG |
            BOARD_INIT_MODULE_CLOCK |
            BOARD_INIT_UART_STDIO;
    #endif
        boardStatus = Board_init(boardCfg);
        if (boardStatus != BOARD_SOK)
        {
            return (false);
        }
    
    #if defined (idkAM571x)
        boardStatus = Board_getIDInfo(&id);
        if (boardStatus != BOARD_SOK)
        {
            return (false);
        }
        memcpy(eepromData, &id.header[I2C_EEPROM_TEST_ADDR],
               BOARD_EEPROM_HEADER_LENGTH - I2C_EEPROM_TEST_ADDR);
        memcpy(&eepromData[BOARD_EEPROM_HEADER_LENGTH - I2C_EEPROM_TEST_ADDR],
               id.boardName,
               I2C_EEPROM_TEST_LENGTH - BOARD_EEPROM_HEADER_LENGTH + I2C_EEPROM_TEST_ADDR);
    #endif
    
    #if defined (evmK2G)
        /* Read the SoC info to get the System clock value */
        Board_getSoCInfo(&socInfo);
        if(socInfo.sysClock != BOARD_SYS_CLK_DEFAULT)
        {
            /* Get the default I2C init configurations */
            I2C_socGetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
            /* Update the I2C functional clock based on CPU clock - 1G or 600MHz */
            i2c_cfg.funcClk = socInfo.sysClock/6;
            /* Set the default I2C init configurations */
            I2C_socSetInitCfg(I2C_EEPROM_INSTANCE, &i2c_cfg);
        }
    #endif
    
        return (true);
    }
    
    bool i2c_bitrate_test (I2C_BitRate bitRate)
    {
        char bitRateLog[4][10] = {"100Kbps", "400Kbps", "1Mbps", "3.4Mbps"};
        I2C_Params i2cParams;
        I2C_Handle handle = NULL;
        I2C_Transaction i2cTransaction;
        char txBuf[I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE] = {0x00, };
        char rxBuf[I2C_EEPROM_TEST_LENGTH];
        int16_t status;
        bool copyData = FALSE;
        bool testStatus = true;
    
        /* Set the I2C EEPROM write/read address */
        txBuf[0] = (I2C_EEPROM_TEST_ADDR >> 8) & 0xff; /* EEPROM memory high address byte */
        txBuf[1] = I2C_EEPROM_TEST_ADDR & 0xff;        /* EEPROM memory low address byte */
    
        I2C_Params_init(&i2cParams);
    
        /* Set bitRate */
        i2cParams.bitRate = bitRate;
        handle = I2C_open(I2C_EEPROM_INSTANCE, &i2cParams);
    
    #ifdef I2C_EEPROM_WRITE_ENABLE
        /* Write to EEPROM */
        memcpy(&txBuf[I2C_EEPROM_ADDR_SIZE], eepromData, I2C_EEPROM_TEST_LENGTH);
        I2C_transactionInit(&i2cTransaction);
        i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
        i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
        i2cTransaction.writeCount = I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE;
        i2cTransaction.readBuf = NULL;
        i2cTransaction.readCount = 0;
        i2cTransaction.timeout   = I2C_TRANSACTION_TIMEOUT;
        status = I2C_transfer(handle, &i2cTransaction);
    
        if(I2C_STS_SUCCESS != status)
        {
            I2C_log("\n I2C Test: ");
            I2C_log(bitRateLog[bitRate]);
            I2C_log(": Write Data Transfer failed. \n");
            testStatus = false;
        }
    
    #if defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L) || defined (evmK2G) || defined (iceK2G) || defined (am65xx_evm) || defined (am65xx_idk)
        BOARD_delay(I2C_EEPROM_TEST_DELAY);
    #endif
    #else
    #if defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L) || defined (evmK2G) || defined (iceK2G) || defined (EVM_OMAPL137) || defined (am65xx_evm) || defined (am65xx_idk)
        /* EEPROM write disabled on K2, need copy data */
        copyData = TRUE;
    #endif
    #endif
        memset(rxBuf, 0, I2C_EEPROM_TEST_LENGTH);
        I2C_transactionInit(&i2cTransaction);
        i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
        i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
        i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
        i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
        i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
        i2cTransaction.timeout   = I2C_TRANSACTION_TIMEOUT;
        status = I2C_transfer(handle, &i2cTransaction);
    
        if(I2C_STS_SUCCESS != status)
        {
            I2C_log("\n I2C Test: ");
            I2C_log(bitRateLog[bitRate]);
            I2C_log(": Read Data Transfer failed. \n");
            testStatus = false;
        }
        else
        {
    #if defined (evmC6678) || defined (evmC6657) || defined (am65xx_evm) || defined (am65xx_idk)
            copyData = TRUE;
    #endif
    
            /* read only test, copy data from rx buffer to eepromData to pass the test */
            if (copyData)
                memcpy(eepromData, rxBuf, I2C_EEPROM_TEST_LENGTH);
    
            testStatus = CompareData(&eepromData[0], &rxBuf[0], I2C_EEPROM_TEST_LENGTH);
            I2C_log("\n I2C Test: ");
            I2C_log(bitRateLog[bitRate]);
            if(true == testStatus)
            {
                I2C_log(": PASS \n");
            }
            else
            {
                I2C_log(": Data Mismatch \n");
            }
        }
        I2C_close(handle);
    
        return (testStatus);
    }
    
    #ifdef USE_BIOS
    /*
     *  ======== test function ========
     */
    void i2c_test(UArg arg0, UArg arg1)
    #else
    int main ()
    #endif
    {
        I2C_Params i2cParams;
        I2C_Handle handle = NULL;
        bool bitRateTestStatus;
        bool testStatus = true;
        uint32_t i;
    
    #ifndef USE_BIOS
        if (Board_initI2C() == false)
        {
            return(0);
        }
    #endif
    
        I2C_init();
    
        for (i = 0; i < 4; i++)
        {
            if (i == 2) continue;
    #if defined (evmK2H) || defined (evmK2K) || defined (evmK2E) || defined (evmK2L)
            if (i == 3) continue; /* Workaround to pass the 3.4Mbps test */
    #endif
            bitRateTestStatus = i2c_bitrate_test ((I2C_BitRate)i);
            if (bitRateTestStatus == false)
            {
                break;
            }
        }
    
    #if defined (SOC_AM335X) || defined (SOC_AM437x) || defined (SOC_AM571x) || defined (SOC_AM572x) || defined (SOC_AM574x) || defined (SOC_AM65XX)
        I2C_Params_init(&i2cParams);
        handle = I2C_open(I2C_EEPROM_INSTANCE, &i2cParams);
    
        /* Test runtime configuration of bus frequency and probe functions */
        testStatus = I2C_Probe_BusFrequency_test(handle);
        if (testStatus == true)
        {
            testStatus = I2C_timeout_test(handle);
        }
    #endif
    
    
        if ((bitRateTestStatus == true) && (testStatus == true))
        {
            UART_printStatus("\n All tests have passed. \n");
        }
        else
        {
            UART_printStatus("\n Some tests have failed. \n");
        }
    
        if (handle != NULL)
        {
            I2C_close(handle);
        }
    
        while (1) {
    
        }
    }
    
    #ifdef USE_BIOS
    /*
     *  ======== main ========
     */
    int main(void)
    {
        if (Board_initI2C() == false)
        {
            return (0);
        }
    
    #if defined (SOC_AM335X) || defined (SOC_AM437x) || defined (SOC_OMAPL137)
        Task_Handle task;
        Error_Block eb;
    
        Error_init(&eb);
    
        task = Task_create(i2c_test, NULL, &eb);
        if (task == NULL) {
            System_printf("Task_create() failed!\n");
            BIOS_exit(0);
        }
    #endif
    
        /* Start BIOS */
        BIOS_start();
        return (0);
    }
    #endif /* #ifdef USE_BIOS */
    
    /*
     *  ======== CompareData ========
     */
    bool CompareData(char *expData, char *rxData, unsigned int length)
    {
        uint32_t idx = 0;
        uint32_t match = 1;
        bool retVal = false;
    
        for(idx = 0; ((idx < length) && (match != 0)); idx++)
        {
            if(*expData != *rxData) match = 0;
            expData++;
            rxData++;
        }
    
        if(match == 1) retVal = true;
    
        return retVal;
    }
    
    
    #if defined (SOC_AM335X) || defined (SOC_AM437x) || defined (SOC_AM571x) || defined (SOC_AM572x) || defined (SOC_AM574x) || defined (SOC_AM65XX)
    static bool I2C_Probe_BusFrequency_test(I2C_Handle handle)
    {
        uint32_t busFrequency;
        bool status = false;
        int16_t transferStatus;
        I2C_Transaction i2cTransaction;
        uint32_t slaveAddress;
        int32_t controlStatus;
        char txBuf[I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE] = {0x00, };
        char rxBuf[I2C_EEPROM_TEST_LENGTH];
        uint32_t delayValue;
    
        /* Set the I2C EEPROM write/read address */
        txBuf[0] = (I2C_EEPROM_TEST_ADDR >> 8) & 0xff; /* EEPROM memory high address byte */
        txBuf[1] = I2C_EEPROM_TEST_ADDR & 0xff;        /* EEPROM memory low address byte */
    
    
        /* Test Runtime Configuration of Bus Frequency */
    
        /* Test runtime configuration of 400 kHz */
        busFrequency = I2C_400kHz;
        I2C_control(handle, I2C_CMD_SET_BUS_FREQUENCY, &busFrequency);
    
        memset(rxBuf, 0, I2C_EEPROM_TEST_LENGTH);
        I2C_transactionInit(&i2cTransaction);
        i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
        i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
        i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
        i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
        i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
        i2cTransaction.timeout   = I2C_TRANSACTION_TIMEOUT;
        transferStatus = I2C_transfer(handle, &i2cTransaction);
    
        if(I2C_STS_SUCCESS != transferStatus)
        {
            I2C_log("\n I2C Test: Dynamic configuration of bus Freq failed. \n");
        }
    
        status = CompareData(&eepromData[0], &rxBuf[0], I2C_EEPROM_TEST_LENGTH);
    
        if(true == status)
        {
            /* Test runtime configuration of 100 kHz */
            busFrequency = I2C_100kHz;
            I2C_control(handle, I2C_CMD_SET_BUS_FREQUENCY, &busFrequency);
    
            memset(rxBuf, 0, I2C_EEPROM_TEST_LENGTH);
            I2C_transactionInit(&i2cTransaction);
            i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
            i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
            i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
            i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
            i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
            i2cTransaction.timeout   = I2C_TRANSACTION_TIMEOUT;
            transferStatus = I2C_transfer(handle, &i2cTransaction);
    
            if(I2C_STS_SUCCESS != transferStatus)
            {
                I2C_log("\n I2C Test: Dynamic configuration of bus Freq failed. \n");
            }
    
            status = CompareData(&eepromData[0], &rxBuf[0], I2C_EEPROM_TEST_LENGTH);
        }
    
    
        /* Test Probe functionality */
    
        if(true == status)
        {
            /* Probe test with valid slave address */
            slaveAddress = I2C_EEPROM_ADDR;
            controlStatus = I2C_control(handle, I2C_CMD_PROBE, &slaveAddress);
    
            if(I2C_STATUS_SUCCESS == controlStatus)
            {
                status = true;
            }
            else
            {
                status = false;
                I2C_log("\n I2C Test: Probe test failed. \n");
            }
        }
    
        if(true == status)
        {
            /* Probe test with invalid slave address */
            slaveAddress = 0x70U;
            controlStatus = I2C_control(handle, I2C_CMD_PROBE, &slaveAddress);
    
            if(I2C_STATUS_ERROR == controlStatus)
            {
                status = true;
            }
            else
            {
                status = false;
                I2C_log("\n I2C Test: Probe test failed. \n");
            }
        }
    
        if(true == status)
        {
            /* Test bus recovery functionality */
            delayValue = 2000U;
            controlStatus = I2C_control(handle, I2C_CMD_RECOVER_BUS, &delayValue);
    
            if(I2C_STATUS_SUCCESS == controlStatus)
            {
                memset(rxBuf, 0, I2C_EEPROM_TEST_LENGTH);
                I2C_transactionInit(&i2cTransaction);
                i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
                i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
                i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
                i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
                i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
                i2cTransaction.timeout   = I2C_TRANSACTION_TIMEOUT;
                transferStatus = I2C_transfer(handle, &i2cTransaction);
    
                if(I2C_STS_SUCCESS != transferStatus)
                {
                    I2C_log("\n I2C Test: Bus recovery test failed. \n");
                }
    
                status = CompareData(&eepromData[0], &rxBuf[0], I2C_EEPROM_TEST_LENGTH);
            }
            else
            {
                status = false;
            }
        }
    
        return status;
    }
    
    static bool I2C_timeout_test(I2C_Handle handle)
    {
        uint32_t busFrequency;
        bool status = false;
        int16_t transferStatus;
        I2C_Transaction i2cTransaction;
        char txBuf[I2C_EEPROM_TEST_LENGTH + I2C_EEPROM_ADDR_SIZE] = {0x00, };
        char rxBuf[I2C_EEPROM_TEST_LENGTH];
    
        /* Set the I2C EEPROM write/read address */
        txBuf[0] = (I2C_EEPROM_TEST_ADDR >> 8) & 0xff; /* EEPROM memory high address byte */
        txBuf[1] = I2C_EEPROM_TEST_ADDR & 0xff;        /* EEPROM memory low address byte */
    
    
        /* Test Runtime Configuration of Bus Frequency */
    
        /* Test runtime configuration of 400 kHz */
        busFrequency = I2C_100kHz;
        I2C_control(handle, I2C_CMD_SET_BUS_FREQUENCY, &busFrequency);
    
        memset(rxBuf, 0, I2C_EEPROM_TEST_LENGTH);
        I2C_transactionInit(&i2cTransaction);
        i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
        i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];
        i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;
        i2cTransaction.readBuf = (uint8_t *)&rxBuf[0];
        i2cTransaction.readCount = I2C_EEPROM_TEST_LENGTH;
        i2cTransaction.timeout   = 1;
        transferStatus = I2C_transfer(handle, &i2cTransaction);
    
        if(I2C_STS_ERR_TIMEOUT == transferStatus)
        {
            I2C_log("\n I2C Test: timeout test passed. \n");
            status = true;
        }
        return status;
    }
    #endif
    

    Look for i2c_bitrate_test  in the file that tests the different speeds including 1Mbps and 3.4 Mbps. Let us know if this still does answer your question.

    Regards,

    Rahul 

    PS: Clarification from the developer. The throughput obtained when bitrate is set to 1 Mbps and 3 Mbps is highly dependent on I2C protocol between master and slave and also dependent on how well the slave can keep up with the data sent from the master. If you look at the baseline I2C protocol, only 8 ot the 9 bit frame contains address/data bits so theoretical max thoughtput is slightly 8/9 of the bit clock setup but with 3.4 Mhz bit clock setting, you should be able to hit the required throughput. 

  • Hi,

    Thank you very much for your detail explanation.
    I really appreciate your help.

    Our customer sent us an additional question.

    Question:
    Are there plan to support DMA for I2C driver software in PROCESSOR-SDK-RTOS-AM57X?

    Best regards,
  • No, there are currently no immdiate plans to support I2C driver in DMA mode as this is not required in most of the usecases that we are supporting with I2C peripheral

    Regards,
    Rahul
  • Hi,

    Thank you very much for your kindness.
    I really appreciate your help.

    We understand the situation.

    Best regards,