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.

[参考译文] TMS320C6678:信标挂起上的 I2C 传输块

Guru**** 2609955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/655322/tms320c6678-i2c-transfer-blocks-on-a-semaphore-pend

器件型号:TMS320C6678

大家好、

我开始根据 PDK 2.0.6示例工程在我的工程中集成 i2c 功能。 示例项目工作正常、通过正确。

将代码移动到我的项目中、我发现执行 I2C_transfer 函数时遇到困难。 特别是、我进行了调试、直到我发现内核在信标上挂起时进入空闲状态、即使有超时设置(1000U)。

特别是它停留在该指令的 I2C_TRANSFER_V0函数中的点:

if (object->operMode = I2C_Oper_mode_blocking){
I2C_drv_log1 ("\n I2C:(0x%x)在传输完成信标上挂起\n"、
hwAttrs->baseAddr);

/*
*在此处等待传输完成。
*可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
*出错时
*
semStatus = I2C_osalPendLock (object->transferComplete、transaction->timeout);
//如果启用了中断并且
应用程序没有提供特定的回拨例程,则错误状态存储在 object->intStatusErr 中。
阅读并相应地返回错误状态*/

. 

我很确定一定会出现一些兼容性/设置问题、但到目前为止我找不到。

我将示例.cfg 与我在项目中使用的示例合并、并使用专用主文件但使用工程.cfg 复制示例

是否有任何关于此问题的想法?

提前感谢您、

此致

Fabrizio

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

    团队将收到通知。 他们将直接在此处发布反馈。

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

    您的问题似乎与2017年3月报告的问题类似:
    e2e.ti.com/.../585284

    您能否检查该 E2E 主题中讨论的修复程序是否可以解决您的问题?

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

    您好!

    似乎 PDK_2_0_6中的代码已修复、与2.0.3版本不同。

    在这种情况下、超时修复程序看起来已经存在:

    if (object->operMode = I2C_Oper_mode_blocking){
    I2C_drv_log1 ("\n I2C:(0x%x)在传输完成信标上挂起\n"、
    hwAttrs->baseAddr);
    
    /*
    *在此处等待传输完成。
    *可以从这里阻止、因为 I2C 的 Hwi 将解除阻止
    *出错时
    *
    semStatus = I2C_osalPendLock (object->transferComplete、transaction->timeout);
    //如果启用了中断并且
    应用程序没有提供特定的回拨例程,则错误状态存储在 object->intStatusErr 中。
    读取它并相应地返回错误状态*/
    if (object->intStatusErr & I2C_INT_NO_ACK)
    {
    RetVal = I2C_STS_ERR_NO_ACK;
    } 否则(object->intStatusErr & I2C_INT_ANCRACING_Lost)
    {
    RetVal = I2C_STS_ERR_arbitration_lost;
    } 否则{
    RetVal = I2C_STS_SUCCESS;
    }
    
    if (semStatus = SemaphoreP_TIMEOUT){
    hwVal =(int16_t)I2C_STS_ERR;
    }
    否则{
    I2C_drv_log1 ("\n I2C:(0x%x)事务已完成\n"、hwAttrs->baseAddr);
    
    // Hwi 句柄已对错误进行'transferComplete '检查*/
    if (object->mode =I2C_idle_mode_0x)
    、'randrx (0x_rx);{\randrx}\}\ratrx (randrx)
    
    
    

    根据我的理解、在链接中、您很好地分享了在给出错误的从地址时生成的错误。

    在我的情况下、地址应该是正确的(0x50)、并且直接取自 I2C EEPROM 地址的 I2C 示例定义:

    I2C_init();
    
    I2C_Params_init (&i2cParams);
    // i2cParams.transferMode = I2C_MODE_CALLYACK;
    
    句柄= I2C_open (I2C_EEPROM_Instance、&i2cParams);
    
    I2C_TransactionInit(&i2cTransaction);
    i2cTransaction.slaveAddress = I2C_EEPROM_ADDR;//0x50
    i2cTransaction.writeBuf =(uint8_t *)&txBuf[0];
    i2cTransaction.writeCount = I2C_EEPROM_ADDR_SIZE;// 2字节
    i2cTransaction.readBuf =(uint8_t *)&rxBuf[0];
    i2cTransaction.ReadCount = I2C_EEPROM_TEST_LENGTH;// 10字节
    i2cTransaction.timeout = I2C_TRANSACTION;// 1000U
    transferStatus = I2C_transfer (handle、&i2cTransaction); 

    您认为这是同一个问题吗?

    非常感谢您的回答。

    此致、

    Fabrizio

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

    下面是 I2C 寄存器的快照

    对可能发生的情况有什么想法?

    谢谢、

    Fabrizio

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

    有任何有关这方面的新闻吗? 请您注意、这将非常紧急。

    提前感谢您、
    此致

    Fabrizio