你好! 我正在尝试将 Fuel Tank MKII 电池 BoosterPack 插件模块与 MSP-EXP432P401R 版本2.0 Launchpad 配合使用。 我正在使用 MSP432 Simplelink SDK 1.40.00.28 (boostxl_batpakmki_fulgauge _MSP_EXP432P401R_nortos_ccs)中提供的示例、我想通过让 CPU 休眠而不是在 while 循环中等待接收到的字节来优化它。
问题是 、当使用我的代码时、它从 BQ27441读取不同的响应(当它应该读取0x0108时、它读取0xB000)。 我使用的代码:
volatile bool i2cRxFlag = false; void I2C_init (void) { /*初始化 USCI_B0和 I2C 主设备以与从属设备通信*/ I2C_initMaster (EUSCI_B1_base、&i2cConfig); /*禁用 I2C 模块进行更改*/ I2C_DisableModule (USCI_B1_base); /*启用 I2C 模块以启动操作*/ I2C_enableModule (USCI_B1_base); MAP_I2C_clearInterruptFlag (EUSCI_B1_base、EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_STOP_INTERRUPT0); MAP_I2C_enableInterrupt (EUSCI_B1_BASE、EUSCI_B_I2C_Transmit INTERRUPT0 + EUSCI_B_I2C_Receive_INTERRUPT0 + EUSCI_B_I2C_STOP_INTERRUPT0); MAP_Interrupt_enableInterrupt (INT_EUSCIB1); return; } void EUSCIB1_IRQHandler (void) { unsigned int status; STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B1_BASE); MAP_I2C_clearInterruptFlag (EUSCI_B1_BASE、STATUS); IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0) { i2cTxFlag = true; } IF (STATUS & EUSCI_B_I2C_STOP_INTERRUPT) { i2cStopFlag = true; } IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0) { i2cRxFlag = true; } map_Interrupt_disableSlepOnIsrExit(); } bool I2C_read16 (unsigned char 指针、short * result、unsigned int timeout) { uint8_t val = 0; uint8_t valScratch = 0; 短接 r = 0; /*将主设备设置为发送模式 PL */ I2C_setMode (EUSCI_B1_BASE、 EUSCI_B_I2C_Transmit 模式); /*清除任何现有的中断标志 PL */ I2C_clearInterruptFlag (EUSCI_B1_base、 EUSCI_B_I2C_Transmit INTERRUPT0); /*启动开始并发送第一个字符*/ if (!I2C_masterSendSingleByteWithTimeout (EUSCI_B1_base、指针、超时)) 返回0; /* *生成开始条件并将其设置为接收模式。 *这会发出从器件地址并继续读取 *直到您发出停止 * I2C_masterReceiveStart (EUSCI_B1_BASE); /*等待 RX 缓冲区填充*/ //while (!(I2C_getInterruptStatus (EUSCI_B1_BASE、 // EUSCI_B_I2C_Receive_INTERRUPT0))); if (!(MAP_I2C_getInterruptStatus (EUSCI_B1_BASE、EUSCI_B_I2C_Receive_INTERRUPT0)))) { while (i2cRxFlag = false) { MAP_PCM_gotoLPM0InterruptSafe (); MAP_Interrupt_enableMaster(); } i2cRxFlag = false; } /*从 I2C RX 寄存器读取*/ valScratch = I2C_masterReceiveMultiByteNext (EUSCI_B1_BASE); /*接收第二个字节、然后发送停止条件*/ if (!I2C_ReceivmasterMultiByteFinishWithTimeout (EUSCI_B1_BASE、&V、超时)) 返回0; /*将 val 移动到顶部 MSB */ R =(val << 8); /*从 I2C RX 寄存器读取并写入 r 的 LSB */ R |= valScratch; /*返回温度值*/ *结果= r; 返回1; }
如您所见、我只添加了几行代码。 等待 RX 缓冲区填充后、如果我使用原始 while ()循环(在上面注释) 、它将读取0x0108、但如果我使用代码(上面的 if 语句)、则会读取0xB000。
问题可能出在哪呢?