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.

[参考译文] IWRL6432AOPEVM:IWRL6432 i2c 从模式

Guru**** 2812305 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1607206/iwrl6432aopevm-iwrl6432-i2c-slave-mode

器件型号: IWRL6432AOPEVM
主题: SysConfig 中讨论的其他器件

这是我的 i2c 测试示例、如果 ReadCount 设置为 1 字节、transferCallback 将正确执行。 如果 ReadCount 设置的值大于 1 字节、则在多次重复测试后、它将卡住。

void        gsd_I2C_transferCallback(I2C_Handle handle,
                                  I2C_Transaction *msg,
                                  int32_t transferStatus)
{

    if (msg->readBuf != 0) {
        SemaphoreP_post(&i2c_mutex);
    }

}

static void i2c_CLI_task(void* args)
{
    I2C_Handle      i2cHandle;
    I2C_Transaction i2cTransaction;
    I2C_Transaction i2c_tx;
    uint8_t         txBuffer[4];
    uint8_t         rxBuffer[10];
    uint8_t         offset;
    uint32_t dump_reg = 0xeeeeeeee;
    uint32_t virtual_reg = 0;
    uint8_t find_flag = 0;
    
    i2cHandle = gI2cHandle[CONFIG_I2C0];
    SemaphoreP_constructBinary(&i2c_mutex, 0);

    I2C_Transaction_init(&i2c_tx);
    i2c_tx.writeBuf   = txBuffer;
    i2c_tx.writeCount = 4;
    i2c_tx.controllerMode = 0;

    while(1) {
        I2C_Transaction_init(&i2cTransaction);
        i2cTransaction.readBuf = rxBuffer;
        i2cTransaction.readCount = 1;    // if i use readCount equal 6 and i2c master repeat send more than 10 times, transferCallback will not execute
        i2cTransaction.writeBuf = &dump_reg;
        i2cTransaction.writeCount = 1;
        i2cTransaction.controllerMode = 0;

        /* Blocking Mode: Halt program until message received from controller
           Callback Mode: Trigger interrupt callback upon message received from controller */
        CLI_write("recv\n");
        I2C_transfer(i2cHandle, &i2cTransaction);

        SemaphoreP_pend(&i2c_mutex, SystemP_WAIT_FOREVER);

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

    您好、

    我们已收到您的查询。 请允许我们花一天或两天时间回复。

    此致

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

    请问是否有任何进展?

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

    您好:

    对迟交的答复表示歉意。 为了让我们有效地提供帮助、我需要更多详细信息:

    • 您的 I2C SysConfig 设置是什么? 请发送完整 I2C 页面或.syscfg 文件的屏幕截图。
    • 当您的程序卡住时、是否会调用 ISR?
    • 如果是、I2C 寄存器的状态是什么、尤其是 ICSTR 寄存器的状态是什么? 您可以使用 技术参考手册通过 CCS 中的存储器浏览器进行检查 、作为 I2C 地址的指南。


    您可能还需要在 ISR 期间清除中断。 I2C_transfe 函数(或对 I2C_primeTransfer 函数进行莫测)应清除中断作为事务序列的一部分、但在发生故障时获取该寄存器信息可以确认实际是否发生了中断。

    此致、

    Pedrorm

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

    • 当您的程序卡住时、是否会调用 ISR?

    我添加 ISR 中的日志、当卡滞时、不打印中断 I2C_IVR_INTCODE_SCD。

    我观察到在 ISR 期间清除中断的代码。

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

    您好:

    出于好奇心、您是否能够循环 1 字节的传输(例如,四次)、而不是执行一个 4 字节的传输?

    此致、

    Pedrorm

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

    这是 i2c 寄存器。

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

     您能否确认是否能够循环 1 字节传输(例如,循环四次)、而不是执行一个 4 字节传输? 我想知道您是否可以多次进行 1 字节传输。

    此致、

    Pedrorm

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

    如果我这样做、主循环传输 1 字节四次、雷达只能接收 2 字节。  

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

    您好:

    很抱歉耽误时间、如果您仍有此问题、请告诉我。

    此致、

    Pedrorm

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

    这仍然存在该问题。