工具与软件:
尊敬的 TI 团队:
我想通过 I2C 从 MSPM0G1505获取一些信息。
现在、我可以成功从 MSPM0G1505获得响应、但似乎我得到了最后一次 TX 缓冲区。
例如、我发送0x1、我想接收0x1、但我第一次接收0x00、除非我再次发送0x1、然后我接收到0x1。
然后、我发送0x2、我希望第一次接收0x2 0x1、但我仍然接收到0x1、除非我再次发送它。
发送0x1 0x2时也会发生同样的问题、我似乎总是从最后一次获得 TX 缓冲区。 我想知道为什么以及如何优化我的代码。
我已经上传了日志和代码的一些关键部分。 如果有任何问题、可以帮助您进行审查吗?
void I2C_0_INST_IRQHandler(void) { static bool dataRx = false; switch (DL_I2C_getPendingInterrupt(I2C_0_INST)) { case DL_I2C_IIDX_TARGET_START: // Initialize RX or TX after Start condition is received //gTxCount = 0; gRxCount = 0; // Flush TX FIFO to refill it //DL_I2C_flushTargetTXFIFO(I2C_0_INST); break; case DL_I2C_IIDX_TARGET_RXFIFO_TRIGGER: // Store received data in buffer dataRx = true; while (DL_I2C_isTargetRXFIFOEmpty(I2C_0_INST) != true) { uint8_t receivedData = DL_I2C_receiveTargetData(I2C_0_INST); if (gRxCount < gRxLen) { gRxPacket[gRxCount++] = receivedData; } else { DL_I2C_receiveTargetData(I2C_0_INST); } } break; case DL_I2C_IIDX_TARGET_TXFIFO_TRIGGER: // Fill TX FIFO if there are more bytes to send if (gTxCount < gTxLen) { //gTxCount += DL_I2C_fillTargetTXFIFO(I2C_0_INST, gTxPacket, gTxLen); gTxCount += DL_I2C_fillTargetTXFIFO(I2C_0_INST, &gTxPacket[gTxCount], (gTxLen - gTxCount)); } else { // // Fill FIFO with 0x00 if more data is requested than // expected gTxLen // while (DL_I2C_transmitTargetDataCheck(I2C_0_INST, 0x00) != false); } break; case DL_I2C_IIDX_TARGET_STOP: // If data was received, echo to TX buffer if (dataRx == true) { if(gRxPacket[0] == 0x1) { if(gRxPacket[1] == 0x2) { gTxPacket[0] = 0xf; gTxPacket[1] = 0x4; gTxLen = 2; DL_I2C_flushTargetTXFIFO(I2C_0_INST); } else { gTxPacket[0] = 0x1; gTxLen = 1; DL_I2C_flushTargetTXFIFO(I2C_0_INST); } } if(gRxPacket[0] == 0x2) { gTxPacket[0] = 0x2; gTxPacket[1] = 0x1; gTxLen = 2; DL_I2C_flushTargetTXFIFO(I2C_0_INST); } if(gRxPacket[0] == 0x3) { uint16_t temp_vgs1 = 500; //500 = -3.87V DL_Timer_setCaptureCompareValue(PWM_1_INST, temp_vgs1, GPIO_PWM_1_C1_IDX); //PWM_Vgs_PA0(10) Vgs-PA0 DL_Timer_setCaptureCompareValue(PWM_2_INST, temp_vgs1, GPIO_PWM_2_C0_IDX); //PWM_Vgs_PA1(11) Vgs-PA1 DL_Timer_setCaptureCompareValue(PWM_0_INST, temp_vgs1, GPIO_PWM_0_C3_IDX); //PWM_Vgs_PA2(14) Vgs-PA2 DL_Timer_setCaptureCompareValue(PWM_0_INST, temp_vgs1, GPIO_PWM_0_C1_IDX); gTxPacket[0] = 0x6; gTxLen = 1; } //DL_I2C_flushTargetTXFIFO(I2C_0_INST); gTxCount = 0; dataRx = false; //cleanRxPacket(); } // Toggle LED to indicate successful RX or TX // DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN); break; case DL_I2C_IIDX_TARGET_RX_DONE: // Not used for this example case DL_I2C_IIDX_TARGET_RXFIFO_FULL: // Not used for this example case DL_I2C_IIDX_TARGET_GENERAL_CALL: // Not used for this example case DL_I2C_IIDX_TARGET_EVENT1_DMA_DONE: // Not used for this example case DL_I2C_IIDX_TARGET_EVENT2_DMA_DONE: // Not used for this example default: break; }