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.

[参考译文] TMS320F280025C:DS3231 RTC

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1299433/tms320f280025c-ds3231-rtc

器件型号:TMS320F280025C

在 TMS320F280025c 开发板的 i2c 协议中"i2cbus_scan function"的用途是什么。当我尝试连接 DS3231 RTC im 时,它卡在 i2c 总线扫描功能中...

uint16_t I2CBusScan(uint32_t base, uint16_t *pAvailableI2C_targets)
{
    uint16_t probeTargetAddress, i;

    //Disable interrupts on Stop condition, NACK and arbitration lost condition
    I2C_disableInterrupt(base, (I2C_INT_ADDR_TARGET|I2C_INT_STOP_CONDITION | I2C_INT_ARB_LOST | I2C_INT_NO_ACK));

    i = 0;
    for(probeTargetAddress=1;probeTargetAddress<=MAX_10_BIT_ADDRESS;probeTargetAddress++)
    {
        //Check I2C bus status
        status = checkBusStatus(base);
        if(status)
        {
           ESTOP0;
           return status;
        }

        I2C_setConfig(base, (I2C_CONTROLLER_SEND_MODE | I2C_REPEAT_MODE));

        //Enable 10-bit addressing if probeTargetAddress is greater than 127U
        if(probeTargetAddress > MAX_7_BIT_ADDRESS)
        {
            //10-bit addressing
            I2C_setAddressMode(base, I2C_ADDR_MODE_10BITS);
        }

        // Setup target address
        I2C_setTargetAddress(base, probeTargetAddress);


        I2C_sendStartCondition(base);

        //Wait for the target address to be transmitted
        while(!(I2C_getStatus(base) & I2C_STS_REG_ACCESS_RDY));

        //Generate STOP condition
        I2C_sendStopCondition(base);

        //Wait for the I2CMDR.STP to be cleared
        while(I2C_getStopConditionStatus(base));

        //Wait for the Bus busy bit to be cleared
        while(I2C_isBusBusy(base));

        uint16_t I2CStatus = I2C_getStatus(base);

        //If target address is acknowledged, store target address
        //in pAvailableI2C_targets
        if(!(I2CStatus & I2C_STS_NO_ACK))
        {
            pAvailableI2C_targets[i++] = probeTargetAddress;
        }
        //Clear NACK bit in I2CSTR
        I2C_clearStatus(base,I2C_STS_NO_ACK|I2C_STS_ARB_LOST|I2C_STS_REG_ACCESS_RDY|I2C_STS_STOP_CONDITION);
    }

    I2C_setConfig(base, (I2C_CONTROLLER_SEND_MODE));
    I2C_setAddressMode(base, I2C_ADDR_MODE_7BITS); //7-bit addressing
    I2C_enableInterrupt(base, (I2C_INT_ADDR_TARGET|I2C_INT_STOP_CONDITION | I2C_INT_ARB_LOST | I2C_INT_NO_ACK));
    return SUCCESS;
}

我震惊于   

while (!(I2C_getStatus (base)和 I2C_STS_REG_ACCESS_RDY)); 这不起作用。

这个问题的解决方案是什么... 这背后的原因是什么

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

    尊敬的 Ragavendra:

    I2CBusScan 通过发送不同的目标地址并检查 ACK/NACK 来扫描 I2C 上连接的所有 I2C 器件。 其参数是所使用 I2C 模块的基地址和总线上所有可用 I2C 器件的地址阵列、并返回 I2C 的状态。 如果总线上有多个器件、建议使用此函数、但在其他情况下不强制使用此函数。  

    如果代码卡在您提到的行上、则可能不会发送目标地址/函数中先前的任何代码行。 我建议以下是一些调试步骤:

    1.在不使用 I2CBusScan 特性的情况下测试代码。 如果有问题、您可以调试 main.c 和其他相关代码。 如果没有任何问题、您可以调试 I2CBusScan 代码。

     假设代码没有发送/接收任何内容、请检查时钟、位速率等的 I2C 设置。目标地址的设置以及器件如何发送目标地址。  

    艾什瓦里亚

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

    您能告诉我 busscan 函数参数吗、我会告诉您...告诉我它是否正确吗?

    参数一是 i2c 模块基址  

    我有第二个理由怀疑…… 在第二个参数中、我们必须发送空数组或目标地址数组  

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

    Ragavendra,

    第一个参数正确。 第二个参数是存储 I2C 总线上可用 I2C 地址的数组地址。

    艾什瓦里亚

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

    这意味着在代码的开头我们必须 在阵列中存储从地址…… 还是通过检测器件地址自动进行存储、  

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

    该参数是一个指向已在代码中初始化的目标地址数组的指针。 在 I2CBusScan 函数内部、该数组将由  您发送的第48-53行上的目标地址填充。 在调试代码时、您是否能够看到此数组中是否填充了地址、 如果适用、此函数的哪些行不适合您?