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.

[参考译文] EVM430-FR6047:I2C 从设备

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1359240/evm430-fr6047-i2c-slave

器件型号:EVM430-FR6047

您好!

我收到了 代码启动的停止位中断 USCI_I2C_UCSTPIFG、即使我没有启用停止位中断。 我也尝试了禁用停止位中断。   UCB0IE &&~(UCTXIE0 | UCRXIE0 | UCSTPIE)。 我觉得这可能会有所帮助。

任何想法

谢谢。

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

    您好、以法莲、

    您说的是、您使用上述线路禁用 TX、RX 和 STP 中断、而您仍使用 UCSTPIE 中断进入 ISR? 在全局启用中断之前、您是否尝试过额外清除中断状态?

    您是否使用轮询进行检查? 如果是、您可能需要确保查看 误表、特别是勘误表 USCI52、以确保使用指示的权变措施。

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

    尊敬的 Dylan:

    1.

    如果您可以解释更多如何仅针对停止位中断执行此操作、这是勘误表中的循环

    volatile unsigned short flag;do{flag = UCA0IG;}while (flag & UCRXIFG)== 0x00);

    2.

    我明天会来尝试一下:

    //禁用停止位中断
    UCB0IE &&~UCSTPIE;//清除停止位中断使能

    //清除任何挂起的停止位中断标志
    UCB0IFG &=~UCSTPIFG;//如果之前被置位、则清除停止位标志

    __ bis_SR_register (LPM3_bits | GIE);  

    非常感谢您的评论。

    以法莲

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

    尊敬的 Dylan:

    经过进一步调查后、我看到了以下内容:注意插入的代码:

        __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 w/ interrupts, will wake up via i2c command 0x81 from Nordic
    //    UCB0IE &= ~(UCTXIE0 | UCRXIE0 | UCSTPIE); //disable i2c interrupts while initializing
        UCB0IE &= ~(UCTXIE0 | UCRXIE0); //disable i2c interrupts while initializin
    
        // Register PLL unlock event
        USS_registerHSPLLInterruptCallback(USS_HSPLL_Interrupt_PLLUNLOCK,
                                           &handlePllUnlockEvent);
    
        USSCode = USS_configureUltrasonicMeasurement(&gUssSWConfig);
        //checkCode(code, USS_message_code_no_error);
    
    #if((USS_ALG_ABS_TOF_COMPUTATION_MODE == USS_ALG_ABS_TOF_COMPUTATION_MODE_LOBE_WIDE) || \
        (USS_ALG_ABS_TOF_COMPUTATION_MODE == USS_ALG_ABS_TOF_COMPUTATION_MODE_HILBERT_WIDE))
        // Reference binary pattern are only needed by
        // USS_Alg_AbsToF_Calculation_Option_lobeWide and
        // USS_Alg_AbsToF_Calculation_Option_hilbertWide AbsToF computation options
        if((USS_Alg_AbsToF_Calculation_Option_lobeWide ==
                gUssSWConfig.algorithmsConfig->absToFOption)
           || (USS_Alg_AbsToF_Calculation_Option_hilbertWide ==
                   gUssSWConfig.algorithmsConfig->absToFOption))
        {
    #if defined(__MSP430_HAS_SAPH_A__)
            if(USS_measurement_pulse_generation_mode_multi_tone ==
                    gUssSWConfig.measurementConfig->pulseConfig->pulseGenMode)
            {
                code = USS_generateMultiToneBinaryPattern(&gUssSWConfig);
                checkCode(code, USS_message_code_no_error);
            }
    #endif
            if(USS_measurement_pulse_generation_mode_multi_tone !=
                    gUssSWConfig.measurementConfig->pulseConfig->pulseGenMode)
            {
                code = USS_generateMonoDualToneBinaryPattern(&gUssSWConfig);
                checkCode(code, USS_message_code_no_error);
            }
        }
    
    #if (APPLICATION_ENABLE_BINARY_PATTERN_SIZE_SCALING == true)
        gUssSWConfig.algorithmsConfig->binaryPatternLength =
                (gUssSWConfig.captureConfig->sampleSize / APPLICATION_BINARY_PATTERN_SCALE_FACTOR);
    #endif
    
    #endif
    
    
        // Application must ensure no application level interrupts occur while
        // verifying HSPLL Frequency
        //disableApplicationInterrupts();
    
        USSCode = USS_verifyHSPLLFrequency(&gUssSWConfig, &testResults);
        //checkCode(code, USS_message_code_no_error);
    
        // Application can re-enable interrupts after HSPLL verification
        //enableApplicationInterrupts();
    
        gUssSWConfig.algorithmsConfig->clockRelativeError = _IQ27div((int32_t)(testResults.actualTestCount -
                testResults.expectedResult),testResults.expectedResult);
    
        USSCode = USS_initAlgorithms(&gUssSWConfig);
        //checkCode(code, USS_message_code_no_error);
    
    #if (APPLICATION_ENABLE_SIGNAL_GAIN_CALIBRATION == true)
        code = USS_calibrateSignalGain(&gUssSWConfig);
        checkCode(code, USS_message_code_Signal_Gain_Calibration_successful);
    #endif
    
    #if (APPLICATION_ENABLE_ABSTOF_DTOF_OFFSET_CALIBRATION == true)
        code = USS_calculateOffsets(&gUssSWConfig, &abstoFDtofTestResults,
                                    &abstoFDtofTestConfig);
        checkCode(code, USS_message_code_no_error);
    
        code = USS_updateAdditionalCaptureDelay(&gUssSWConfig,
              ((abstoFDtofTestResults.upsAbsToFOffset + abstoFDtofTestResults.dnsAbsToFOffset) /2.0f) -
              APPLICATION_ABSTOF_REFERENCE);
        checkCode(code, USS_message_code_no_error);
    
        code = USS_updateDtoFOffset(&gUssSWConfig, (-1.0f *abstoFDtofTestResults.dToFOffset));
        checkCode(code, USS_message_code_no_error);
    
    #endif
    
        // Set the background timer period to 1 second  USS_SYS_MEASUREMENT_PERIOD
        USS_configAppTimerPeriod(&gUssSWConfig, gUssSWConfig.systemConfig->measurementPeriod);
        //finished initializing statics
    

    我会在 main 开始处转到 LPM3。 运行正常、我处于睡眠状态、直到接收到 I2C 中断。

    不过、在初始化 USS 之后。 我无法进入 LPM3或 LPM0、某种情况使我退出睡眠模式。

    您的想法。

    谢谢。

    以法莲

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

    您能否详细说明一下"USS"初始化后的含义? 您是说恰好在 while (1)循环开始之前?

    在 while (1)循环期间、器件主动执行超声波测量、然后运行其算法。 它已经包含了一些功能、可在完成这些操作时、在下一个操作开始前将器件置于低功耗模式。

    此外、如何确定器件是否已进入睡眠模式?

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

    尊敬的 Dylan:

    在上面的代码片段中、main (未显示)后面的第1行是我进入 LPM3的位置。 要回答您的最后一个问题、我只能停留在此处、直到我从我的 I2C 获得一个中断并清除_BIC、然后我将代码下移。

    第3行我禁用了在初始化 USS 时不打扰我的 I2C 中断

    下行6到下行83是用于初始化库的一系列 USS 函数。

    如果我尝试在代码中的任意位置之后进入 LPM3、在第83行代码步进函数并离开后、我在 LPM3指令后的下一行。

    我从这一行为得出结论、即 USS 初始化函数之一会影响 LPM3或任何其他 LPMx 行为。

    谢谢。

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

    您好、以法莲、

    感谢您提供更多信息。 我想说您的结论是正确的、并且器件不会进入睡眠模式是有道理的、因为器件需要保持唤醒状态才能执行超声波测量和计算。 如前所述、示例代码具有内置功能、可在主应用程序循环中尽快进入睡眠模式。 我敢肯定、您可以挖掘代码来禁用超声波测量并在进行测量之前将器件置于睡眠状态、但我不明白您为什么要这样做、最终目标仍然是让它进行定期测量并使其进入睡眠状态 很短。 只需增加 UPS0到 UPS1的间隙即可增加睡眠时间。  

    此外、我意识到我从未回复勘误表中关于使用 STP IFG 的第一条语句。 您应该只需用 RX IFG 的 define 替换 UCRXIFG、IFG 即 USCI_I2C_UCSTPIFG。  

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

    尊敬的 Dylan:

    关于 停止位权变措施、这就是我所做的

    易失性无符号短整型标志;
    正确
    {
    FLAG = UCB0IFG;  
    }while (((flag & USCIC_I2C_UCSTPIFG)== 0x00);

    请确认。

    谢谢。

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

    尊敬的 Dylan:

    为了更新、我将上述代码放入 system_pre_init.c 文件中、在 I2C 配置之后、我没有到达程序的 main、将其删除、软件便到达 main。 您的想法。

    谢谢。

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

    以法莲  

    您能否确认您实际上受到勘误表 USCI52的影响? 请阅读文档。

    您发布的循环看起来不错、但它旨在取代您当前的轮询循环、而不是直接插入代码中的某个位置。 如果使用轮询、则使用缓冲中断状态的实现来替换当前的轮询循环、如勘误表中所述。  

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

    尊敬的 Dylan:

    这样、在未设置停止位中断的情况下接收停止位中断的问题仍然存在。

    请注意、我错误地得出结论:进入 ISR 将使我退出 LPM 模式而不返回、直到我再次实际调用设置的 LPM3。

    谢谢。

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

    如果您需要停止接收停止位中断、请尝试使用调试跟踪等调试功能、然后只是单步执行、以查看何时获得 I2C 停止中断。 应在您的设备与另一个设备通信且检测到停止位时发生。 然后、当您获得中断时、您可以仔细检查寄存器值、并确保停止位中断仍然处于禁用状态。 如果它已再次启用、那么您需要单步执行代码并检查它在哪里被启用。 如果寄存器视图显示在您获得中断时禁用了该中断、请告诉我。

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

    你好,迪伦

    我应该查看哪个寄存器?

    谢谢。