您好!
我收到了 代码启动的停止位中断 USCI_I2C_UCSTPIFG、即使我没有启用停止位中断。 我也尝试了禁用停止位中断。 UCB0IE &&~(UCTXIE0 | UCRXIE0 | UCSTPIE)。 我觉得这可能会有所帮助。
任何想法
谢谢。
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.
您好!
我收到了 代码启动的停止位中断 USCI_I2C_UCSTPIFG、即使我没有启用停止位中断。 我也尝试了禁用停止位中断。 UCB0IE &&~(UCTXIE0 | UCRXIE0 | UCSTPIE)。 我觉得这可能会有所帮助。
任何想法
谢谢。
尊敬的 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、某种情况使我退出睡眠模式。
您的想法。
谢谢。
以法莲
尊敬的 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。