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.

[参考译文] TMS320C6657:I2C 测试。 示例和固件开发一般问题。

Guru**** 666710 points
Other Parts Discussed in Thread: TMS320C6657, TMDSEVM6657, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1127135/tms320c6657-i2c-test-examples-and-firmware-development-general-cuestions

器件型号:TMS320C6657
主题中讨论的其他部件:TMDSEVM6657SYSBIOS

尊敬的 Sirs:
我需要一些有关 CCS、示例和固件开发的信息。 也许我的问题简单而基本、但可以帮助他人。
我在这个领域的经验有限,我对此感到非常困惑。
我们已购买用于 TMS320C6657的 TMDSEVM6657评估板。
我将通过 tryng 为电路板 EEPROM 上的 I2C 创建我自己的测试。 在我了解它的工作原理后、我将尝试使用 I2C 总线
要控制自定义电路板上的其他外部 I2C 芯片、请将评估板的80引脚扩展连接器插入。
我已安装 CCS 9.3.0和 processor_sdk_rtos_c665x_6_03_106。 我生成了 PDK 示例。 我能够成功运行"platform_test_evmc6657l"项目。

(1)
我已将示例"I2C_BasicExample_C6657_EVM_c66xExampleProject"导入到工作区。
此示例包含主文件"main_EEPROM_READ.c"
根据我在 C 语言开发方面的其他经验、代码开始在主函数上执行。 在此示例中、
主要内容是:
*****
int main (空)

   if (Board_initI2C ()== false)
   {
       返回(0);
   }

   /*启动 BIOS */
   BIOS_start();
   返回(0);


*****

修改代码后、此示例中的测试似乎在函数"void i2c_test (UArg0、UArgarg1)"上执行。
我通过 tryng 来查找 BIOS_start()函数来查看此函数如何调用"i2c_test"、但我无法找到它。 请可以
您告诉我在哪里可以找到它? BIOS_start()是否调用 i2c_test()?  或者它是如何工作的?

(2)在我的测试中、我更改了这个项目的一些代码、但是我想保留一个原始项目的副本。
我已从 CCS 中删除工程、并再次导入示例以获得原始工程、但未成功:仍有更改。
保留项目原始副本并让我自己进行更改和测试的最佳方法是什么?

(3)为了按我自己的项目测试 EEPROM、 我想这样做:
小图标

#define I2C_ADDR       0x0300          // Cerro 工程的读取和写入测试起始地址
#define I2C_Size_test       10.

/*
 * ==== 测试函数 Cerro======
 * 在 EEPROM 位置0x0300上写入10个字节、然后读取这些字节
 *
/*
void i2c_own 测试(UARg arg0、UARg arg1)


   UART_printf ("\n 我的测试程序的第一行\n");//在串行端口、连接器 USB1、115200上写入此标志。
   I2C_Params i2cParams;
   I2C_Handle handle = NULL;
   I2C_Transaction i2cTransaction;
   char txBuf_Cerro[10]={0x0F、0x1f、0x2F、0x3f、0x4f、0x5f、0x6f、0x7f、0x8F、0x9f};//要写入的数据
   char rxBuf_Cerro[10]={0x00、};//缓冲区来读取数据
   bool status、test_pass = false;
   int16_t transferStatus;

   //设置 I2C EEPROM 写入/读取地址
   txBuf_Cerro[0]=(I2C_ADDR >> 8)& 0xff;// EEPROM 存储器高地址字节
   txBuf_Cerro[1]= I2C_ADDR 和0xff;       // EEPROM 存储器低地址字节

   I2C_init();
   I2C_Params_init (&i2cParams);

   句柄= I2C_open (I2C_EEPROM_Instance、&i2cParams);

   I2C_TransactionInit(&i2cTransaction);

   i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;
   i2cTransaction.writeBuf =(uint8_t *)&txBuf_Cerro[0];
   i2cTransaction.writeCount = I2C_size_test;
   i2cTransaction.readBuf =(uint8_t *)&rxBuf_Cerro[0];
   i2cTransaction.ReadCount = I2C_Size_test;
   i2cTransaction.timeout  = I2C_TRANSACTION;

   transferStatus = I2C_transfer (handle、&i2cTransaction);


   if (I2C_STS_SUCCESS!=传输状态)
      {
          I2C_log ("\n 数据传输失败、传输状态为%d \n"、传输状态);
          test_pass = false;
      }

   否则{
       i2C_log ("\n 写入和读取成功%d \n"、传输状态);
       UART_printf ("\n 写入和读取成功\n");
   }

   I2C_Close (handle);
 }
(二


我会在"Variables"窗口检查测试是否正确、以便比较发送和接收缓冲区、或者可能在屏幕上打印缓冲区进行比较。
我应该如何/在项目上添加之前的代码?

我是否可以使用此代码只更改要传输的地址和数据、就可以对其他 I2C 器件进行写入/读取?

如果我必须更改"speed"或其他 I2C 参数、可以在哪里进行更改?

提前感谢、
Joaquin。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joaquin、

    感谢您提出详细的问题。

    1.如果您正在寻找没有 BIOS_start()的 I2C 基本示例代码-这是一个裸机代码,则可以使用 CSL I2C 示例。

    它位于"C:\ti\pdk_c665x_2_0_16\packages\ti\cSL\examples\i2c\i2c_led_blink"。

    /*
     *  Copyright (C) 2013-2017 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.
     *
     */
     /**
     *  \file   main.c
     *
     *  \brief This file demonstrates I2C dal by writing data to blink
     *         LED on and off.
     *
     */
    
    /* ========================================================================== */
    /*                             Include Files                                  */
    /* ========================================================================== */
    #include <stdint.h>
    #include <stdio.h>
    #include <ti/csl/csl_i2c.h>
    #include <ti/csl/soc.h>
    
    /* ========================================================================== */
    /*                           Macros & Typedefs                                */
    /* ========================================================================== */
    
    #if defined (SOC_TDA3XX) || defined (SOC_DRA78x)
    /* I2C address of TCA6424 expander - 2. */
    #define HSI2C_SLAVE_ADDR            ((uint8_t) 0x22U)
    #elif defined (SOC_J721E)
    /* I2C address of TCA6424 expander - 1. */
    #define HSI2C_SLAVE_ADDR            ((uint8_t) 0x21U)
    #elif defined (SOC_AM574x) || defined (SOC_AM572x) || defined (SOC_AM571x)
    /* I2C address of TPIC2810  */
    #define HSI2C_SLAVE_ADDR            ((uint8_t) 0x60U)
    #else
    /* I2C address of PCF8575 expander. */
    #define HSI2C_SLAVE_ADDR            ((uint8_t) 0x20U)
    #endif
    
    /* Turn on the LEDs. */
    #define HSI2C_EXP_PORT0_LED_ON      ((uint8_t) 0x00U)
    
    /* Turn off the LEDs. */
    #define HSI2C_EXP_PORT0_LED_OFF     ((uint8_t) 0xFFU)
    
    /* Number of times led toggles. */
    #define HSI2C_LED_TOGGLE_NO         (10U)
    
    /* Led toggle check value*/
    #define HSI2C_LED_TOGGLE_END        (0U)
    
    /* Transfer Size */
    #define HSI2C_TRANSFER_SIZE         (5U)
    
    #if defined (SOC_TDA3XX) || defined (SOC_DRA78x) || defined (SOC_J721E)
    #define TCA6424_CMD_AUTO_INC            ((uint8_t) 0x80U)
    
    /* Output register to change state of output BIT set to 1, output set HIGH */
    #define TCA6424_REG_OUTPUT0             ((uint8_t) 0x04U)
    #define TCA6424_REG_OUTPUT1             ((uint8_t) 0x05U)
    #define TCA6424_REG_OUTPUT2             ((uint8_t) 0x06U)
    
    /* Configuration register. BIT = '1' sets port to input, BIT = '0' sets
     * port to output */
    #define TCA6424_REG_CONFIG0             ((uint8_t) 0x0CU)
    #define TCA6424_REG_CONFIG1             ((uint8_t) 0x0DU)
    #define TCA6424_REG_CONFIG2             ((uint8_t) 0x0EU)
    
    #endif
    
    /* ===========================================================================*/
    /*                          Global Variables                                  */
    /* ===========================================================================*/
    uint8_t dataToSlave[HSI2C_TRANSFER_SIZE];
    
    #if defined (SOC_J721E)
    uint32_t gI2cAddr = CSL_I2C0_CFG_BASE;
    #else
    uint32_t gI2cAddr = SOC_I2C1_BASE;
    #endif
    
    /* ========================================================================== */
    /*                          Function Declarations                             */
    /* ========================================================================== */
    void SetupI2C(void);
    void sampleDelay(int32_t delay);
    void SetupI2CTransmit(uint8_t *data, uint32_t numBytes);
    static void ioexpDataWrite(uint8_t *data);
    static void initialize_ioexp(void);
    
    /* ========================================================================== */
    /*                          Function Definitions                              */
    /* ========================================================================== */
    int main()
    {
        volatile uint8_t done = 1;
        uint8_t          data;
        /*
        ** Configures I2C to Master mode to generate start codition
        ** on I2C bus and to transmit data at a bus speed of  100khz
        */
    
        uint32_t         num;
    
        SetupI2C();
    
        initialize_ioexp();
    
        for (num = HSI2C_LED_TOGGLE_NO; num != HSI2C_LED_TOGGLE_END; num--)
        {
            data = HSI2C_EXP_PORT0_LED_ON;
            /*
             * **Transmits command byte and data to I/0 expander
             * **through I2C bus
             */
            ioexpDataWrite(&data);
            sampleDelay(0xFFFF);
    
            data = HSI2C_EXP_PORT0_LED_OFF; /*data to OFF LED*/
            ioexpDataWrite(&data);
            sampleDelay(0xFFFF);
        }
    
        while (done) ;
    
        return 0;
    }
    
    static void initialize_ioexp(void)
    {
    #if defined (SOC_TDA3XX) || defined (SOC_DRA78x) || defined (SOC_J721E)
        /* TCA6424 ioexpander pins should be configure as output
         * In config register write 1 for input, 0 for output */
        dataToSlave[0] = TCA6424_REG_CONFIG0 | TCA6424_CMD_AUTO_INC;
        dataToSlave[1] = 0x0U;
        SetupI2CTransmit(&dataToSlave[0], 2);
    #endif
    }
    
    #if defined (SOC_TDA3XX) || defined (SOC_DRA78x)
    /* On tda3xx leds are connected on TCA6424 ioexpander - 2
     * LEDs are connected on port 0 first 4 bits, and ioexpander has 3 ports */
    static void ioexpDataWrite(uint8_t *data)
    {
        dataToSlave[0] = TCA6424_REG_OUTPUT0 | (uint32_t) TCA6424_CMD_AUTO_INC;
        dataToSlave[1] = ((*data) & 0x0FU);
        dataToSlave[2] = 0U;
        dataToSlave[3] = 0U;
        SetupI2CTransmit(&dataToSlave[0], 4);
    }
    #elif defined (SOC_J721E)
    /* On j721e leds are connected on TCA6424 ioexpander - 1
     * LEDs are connected on port 2 last 2 bits, and ioexpander has 3 ports */
    static void ioexpDataWrite(uint8_t *data)
    {
        dataToSlave[0] = TCA6424_REG_OUTPUT0 | (uint32_t) TCA6424_CMD_AUTO_INC;
        dataToSlave[1] = 0U;
        dataToSlave[2] = 0U;
        dataToSlave[3] = ((*data) & 0xC0U);
        SetupI2CTransmit(&dataToSlave[0], 4);
    }
    #elif defined (SOC_AM574x) || defined (SOC_AM572x) || defined (SOC_AM571x)
    /* On idkam572x leds are connected on TPCI2810 need to write a subaddress */
    static void ioexpDataWrite(uint8_t *data)
    {
        dataToSlave[0] = 0x11U;
        dataToSlave[1] = *data;
        SetupI2CTransmit(&dataToSlave[0], 2);
        dataToSlave[0] = 0x22U;
        SetupI2CTransmit(&dataToSlave[0], 1);
    }
    #else
    /* On tda2xx and ti814x leds are connected on PCF8575 ioexpander
     * LEDs are connected on port 0 last 4 bits, and ioexpander has 2 ports */
    static void ioexpDataWrite(uint8_t *data)
    {
        dataToSlave[0] = (((*data) << 4U) & 0xF0U);
        dataToSlave[1] = 0U;
        SetupI2CTransmit(&dataToSlave[0], 2);
    }
    
    #endif
    
    void SetupI2C(void)
    {
        /* Do a software reset */
        I2CSoftReset(gI2cAddr);
    
        /* Enable i2c module */
        I2CMasterEnable(gI2cAddr);
    
        while (!I2CSystemStatusGet(gI2cAddr)) ;
    
        /* Put i2c in reset/disabled state */
        I2CMasterDisable(gI2cAddr);
    
        /* Configure i2c bus speed to 100khz */
    #if defined (SOC_AM574x) || defined (SOC_AM572x) || defined (SOC_AM571x)
        I2CMasterInitExpClk(gI2cAddr, 96000000,
                            4000000U, 100000);
    #else
        I2CMasterInitExpClk(gI2cAddr, 24000000,
                            8000000, 100000);
    #endif
    
        I2COwnAddressSet(gI2cAddr, 0,
                         I2C_OWN_ADDR_0);
    
        I2CSyscInit(gI2cAddr, 0x08);
    
        /*Set Rx and Tx FIFO threshold value and reset the fifo*/
        I2CFIFOThresholdConfig(gI2cAddr, 0, I2C_TX_MODE);
    
        I2CFIFOThresholdConfig(gI2cAddr, 0, I2C_RX_MODE);
    
        /* Set i2c slave address */
        I2CMasterSlaveAddrSet(gI2cAddr, HSI2C_SLAVE_ADDR);
        
        /* Bring i2c out of reset */
        I2CMasterEnable(gI2cAddr);
    
        /* Enable free run mode */
        I2CMasterEnableFreeRun(gI2cAddr);
    }
    
    void SetupI2CTransmit(uint8_t *data, uint32_t numBytes)
    {
        uint32_t i;
        
        I2CFIFOClear(gI2cAddr, I2C_TX_MODE);
        I2CFIFOClear(gI2cAddr, I2C_RX_MODE);
    
        /*Clear all interrupt status*/
        I2CMasterIntClearEx(gI2cAddr, I2C_INT_ALL);
        
        /* Set data count */
        I2CSetDataCount(gI2cAddr, numBytes);
    
        /*
        ** Configure i2c as master-transmitter and to generate stop condition
        */
        I2CMasterControl(gI2cAddr, I2C_CFG_MST_TX);
        
        /* generate start */
        I2CMasterStart(gI2cAddr);
    
        /* wait for bus busy */
        while(I2CMasterBusBusy(gI2cAddr)==0)
        {
        }
    
        for (i = 0; i < numBytes; i++)
        {
            /*Wait for transmit interrupt to occur*/
            while (I2CMasterIntRawStatusEx(gI2cAddr,
                                           I2C_INT_TRANSMIT_READY) != 0x10) ;
    
            /* Send the data */
            I2CMasterDataPut(gI2cAddr, data[i]);
    
            /*Disable transmit ready and stop condition interrupt*/
            I2CMasterIntClearEx(gI2cAddr, I2C_INT_TRANSMIT_READY);
        }
        
        /* generate stop when requested */
        I2CMasterStop(gI2cAddr);
    
        sampleDelay(5000);
    
        /*Clear data buffer length*/
        I2CSetDataCount(gI2cAddr, 0);
    }
    
    void sampleDelay(int32_t delay)
    {
        volatile int32_t i, j;
    
        for (i = 0; i < delay; i++)
        {
            for (j = 0; j < 100; j++) ;
        }
    }
    /********************************* End of file ******************************/
    
    

    问题编号:2:

    答案:  

    您可以创建另一个工作区并导入相同的项目、然后针对自己的开发进行修改。

    通过这种方式、您可以引用现有代码以及您自己的代码。

    2.压缩原始代码并将其作为副本进行安全保护。 修改解压缩的文件并继续使用它。 只要您想恢复、就可以进行恢复。

    3.还有其他软件管理工具,如 SVN、代码转换器等,用于维护软件版本更改,以维护版本,从而根据需要恢复旧版本。

    此致

    Shankari G

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Shankari、

    非常感谢您的回复。

    (1)关于我的第一封电子邮件的第1点,是否有任何文档可以让我了解 BIOS_start()的基础知识?

    (2)好的、我要创建一个裸机内核来测试您为我提供的 I2C 示例、为此、在 CCS 中、依次选择"File"、"New CCS Project">"Basic Examples">"Hello world..."、然后我会收到11条警告(请参阅随附的图片)。 如果我尝试运行该项目、它将不起作用。 请、我如何纠正这些警告? 我一直在论坛上寻找解决方案,但我没有找到好的答案。

    我的想法是、在我运行一个非常简单的项目后、复制 hello.c 中的 I2C 示例、然后对其进行测试。

    提前感谢、

    Joaquin。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、再说一次、

    还有一个细节、我之前忘记告诉您、是否有任何方法构建此项目以便导入它? 我在"C:\ti\pdk_c665x_2_0_16\packages\ti\cSL\examples\i2c\i2c_led_blink"中仅具有"main.c"。

    谢谢、

    Joaquin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joaquin、

    问题1 --  --(1)关于我的第一封电子邮件的第1点,是否有任何文档可以让我了解 BIOS_start()的基本信息?

    答案:

    是的、BIOS 用户指南可用。 请在此处下载:- e2e.ti.com/.../Bios_5F00_User_5F00_Guide.pdf

    或者、在您安装 processor_sdk_rtos_c665x_6_03_00_106之后、您将在"C:\ti\BIOS_6_76_03_01"中找到更多有关 BIOS 的文档。

    ----

    问题2.

    使用 I2C 的 CSL 示例创建 CCS 工程。

    答案:  

    让我为您创建并返回。

    此致

    Shankari G

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joaquin、

    当我尝试为 C6657的示例 CSL I2C 示例创建 CCS 工程时、我意识到该代码仅针对以下器件生成、例如  

    SoC_TDA3XX、SOC_DRA78x、SOC_J721E、 SOC_AM574x、SOC_AM572x、 SoC_AM571x

    而不是 SOC_C6657。  C6657似乎需要移植工作。

    PDK 封装是许多器件的通用捆绑包。 因此、CSL/示例/下给出的示例源适用于其他器件。

    ----

    C6657的 I2C 的唯一现有选项是---- "C:\ti\pdk_c665x_2_0_16\packages\MyExampleProjects\I2C_BasicExample_C6657_EVM_c66xTestProject"

    以及 SYSBIOS 代码。

    --

    我能够 在 CCS 中构建 I2C_BasicExample_C6657_EVM_c66xTestProject、并且能够在 C6657电路板上成功运行。  

    它能够读取和写入 EEPROM 存储器。 您是否能够在   C6657电路板上运行此 I2C_BasicExample_C6657_EVM_c66xTestProject?

    --

    您是否能够查看 BIOS 用户指南? 我在上一个帖子中发送了哪些内容? ( 下载地址:- Bios_User_Guide.pdf )

    此致

    Shankari G

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Shankari、

    非常感谢您的支持。

    我了解有关 CSL 示例的信息。 没问题。 我能够运行 I2C_BasicExample_C6657_EVM_c66xTestProject、并对其进行了修改、以便在评估板的外部电路板插件中测试总线上的其他两个器件。 因此、这没有问题、它可以正常工作。

    我已经查看了 BIOS 手册、但它离我的能力太远了。 目前、我只需要测试硬件、因此基本示例是应该的。

    我的下一步是测试 UPP。 您能向我推荐从哪里开始/如何开始?  由于这是与这篇文章不同的子喷嘴、如果您愿意、我可以打开一个新的子喷嘴。

    此致、

    Joaquin。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Joaquin、

    很高兴听到您能够使用  I2C_BasicExample_C6657_EVM_c66xTestProject  本身进行开发。

    :-)

    我想、您已经为 UPP 打开了一个新的线程。 最好是使用新线程。

    此致

    Shankari G