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.

[参考译文] J784S4XEVM:vision_apps 中的 I2C

Guru**** 2473650 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1452735/j784s4xevm-i2c-in-vision_apps

器件型号:J784S4XEVM

工具与软件:

您好、TI:

编写简单的裸机应用程序以通过 I2C (CSL 示例)读取温度传感器值后、我曾尝试在 vision 应用程序中使用相同的代码、但 I2C_open 函数调用中收到错误"内核已中止"。

我将从我们的定制应用程序中调用 I2C_open、这与 app_c7x_kernel 应用类似、不同之处在于我们在 MCU2_0上使用定制内核 r5f。
我们在 J784S4 EVM 电路板上使用 Linux + RTOS SDK 版本 v10。

vx_status VX_CALLBACK app_r5f_target_kernel_bringup_create(tivx_target_kernel_instance kernel, tivx_obj_desc_t *param_obj_desc[], uint16_t num_params, void *priv_arg)
{
    printf("\n%s -13- %d\n", __FUNCTION__, __LINE__);

    I2C_Params i2c_params;
    I2C_Params_init(&i2c_params);
    i2c_params.bitRate = I2C_400kHz; /* 400KHz */

    // Open the I2C instance (instance 0)
    if (i2c_handle == NULL)
    {
        i2c_handle = I2C_open(BOARD_TEMP_SENSOR_I2C_INSTANCE, &i2c_params);
        printf("\n%s %d i2c_handle = %p\n", __FUNCTION__, __LINE__, i2c_handle);
    }
    
    return VX_SUCCESS;
}


我在这里遗漏了什么?

此致、

Milos 之间

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

    尊敬的 Milos:

    以下是一些查询、可帮助您了解您的问题:

    -您能告诉我们 I2C_Open 中的哪一行进入"core aborted"吗?  
    -您正在使用什么内核来运行 I2C 代码? 它是否在 R5F -主 MCU2_0上?
    -使用的是 I2C 的哪个实例? 您是否已"打开"时钟和特定的 I2C 实例?

    谢谢。

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

    Praveen、您好!

    -我将代码执行追溯到 I2C_OPEN_v1函数的开始,但没有进一步,因为似乎我做了一些基本的错误,问题可能不是在 I2C API 本身,而是在我使用它的方式。

    -是的,我正在使用主 MCU2_0内核。

    -我正在尝试使用 Board_TEMP_SENSOR_I2C_INSTANCE (实例0)。 从我在其他视觉应用(app_dss_soc.c)中看到的内容来看、这里会调用 I2C_open、无需任何之前的时钟启用过程。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="635439" url="~/support/processors-group/processors/f/processors-forum/1452735/j784s4xevm-i2c-in-vision_apps/5571891 #5571891"]我将代码执行追溯到 I2C_OPEN_v1函数的开头、但没有进一步、因为似乎我做了一些基本的错误、该问题可能不是 I2C API 本身、而是我使用它的方式。

    建议您在什么时候看到崩溃、以便我们进一步帮助您。 在调用 I2C_open 之前、请确保已启用时钟和 I2C 器件。 此外、确保在 A72上运行的 Linux 不使用此 I2C 实例、因为它可能与 MCU2_0的用法相冲突。  

    -我正在尝试使用 Board_TEMP_SENSOR_I2C_INSTANCE (实例0)。 从我在其他视觉应用(app_dss_soc.c)中看到的内容来看、这里调用了 I2C_open、无需任何之前的时钟启用过程。[/QUOT]

    您能告诉我们这里引用的代码是什么吗?  

    谢谢。

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

    好的、我添加了一个时钟使能部分、现在 I2C_open 返回似乎有效的句柄。 以下是目前代码的外观:

    vx_status VX_CALLBACK app_r5f_target_kernel_bringup_create(tivx_target_kernel_instance kernel, tivx_obj_desc_t *param_obj_desc[], uint16_t num_params, void *priv_arg)
    {
        printf("\n%s -13- %d\n", __FUNCTION__, __LINE__);
    
        Board_initCfg boardCfg;
        Board_STATUS  boardStatus;
    
        boardCfg = BOARD_INIT_MODULE_CLOCK |
                   BOARD_INIT_PINMUX_CONFIG |
                   BOARD_INIT_UNLOCK_MMR |
                   BOARD_DEINIT_LOCK_MMR;
    
        boardStatus = Board_init(boardCfg);
        if (boardStatus != BOARD_SOK)
        {
            printf("\n[Error] Board init failed!!\n");
        }
    
        I2C_Params i2c_params;
        I2C_Params_init(&i2c_params);
        i2c_params.bitRate = I2C_400kHz; /* 400KHz */
    
        // Open the I2C instance (instance 0)
        if (i2c_handle == NULL)
        {
            i2c_handle = I2C_open(BOARD_TEMP_SENSOR_I2C_INSTANCE, &i2c_params);
            printf("\n%s %d i2c_handle = %p\n", __FUNCTION__, __LINE__, i2c_handle);
        }
    
        // Configure temp sensor
        uint8_t data_to_write = 0xE0;
        uint8_t temp_sensor = BOARD_TEMP_SENSOR_I2C_SLAVE_DEVICE2_ADDR; // 0x49
        Board_STATUS status = Board_i2c8BitRegWr(i2c_handle, temp_sensor, 0x01, &data_to_write, 1, BOARD_I2C_TRANSACTION_TIMEOUT);
    
        if (status == BOARD_SOK)
        {
            printf("\n%s %d I2C write 1 successful\n", __FUNCTION__, __LINE__);
        }
        else
        {
            printf("\n%s %d I2C write 1 failed\n", __FUNCTION__, __LINE__);
        }
        
        return VX_SUCCESS;
    }


    但是、对 Board_i2c8BitRegWr 的调用失败。 我检查了 Board_i2c8BitRegWr 内的 I2C_Transfer 函数调用的返回值、它是-3 (I2C_STS_ERR_NO_ACK)。

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

    感谢您的参与。 让我将此查询重定向到 PDK 专家进行评论。

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

    尊敬的 Milos:

    您是否能够判断返回 NACK 错误代码的位置?

    初始读取是否成功?

    谢谢!

    Neehar

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

    Neehar、您好!
    似乎在 I2C_v1_hwiFxnMaster 中断处理程序中设置了 NACK 错误标志。 我们使用的物理引脚连接与测试来自 CSL 应用程序的 I2C 通信时使用的相同、并在该应用程序运行时使用的物理引脚连接。
    否、写入和读取都不起作用。

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

    是否有任何有关此问题的更新?