我使用eUSCI_B0的IIC通信时,对同一个从机发送并接收数据。在第一次发送时,主机成功发送并接受到了数据。但是在第二次发送时,程序卡在了I2C_masterSendMultiByteStart上,无法进行之后的代码。使用Keil5调试发现,程序并没有办法在第二次发送时进入函数内部。
注:
- 程序使用了接收中断来判断是否接收到数据
- 在接收完程序后程序失能了接收中断
//中断相关代码
void EUSCIB0_IRQHandler(void)
{
uint_fast16_t status;
status = MAP_I2C_getEnabledInterruptStatus(EUSCI_B0_BASE);
if(status & EUSCI_B_I2C_RECEIVE_INTERRUPT0)
{
if(rxIndex != (rxLength - 1))RxData[rxIndex++] = MAP_I2C_masterReceiveMultiByteNext(EUSCI_B0_BASE);
else
{
RxData[rxIndex++] = MAP_I2C_masterReceiveMultiByteNext(EUSCI_B0_BASE);
MAP_I2C_masterReceiveMultiByteFinish(EUSCI_B0_BASE);
MAP_I2C_masterReceiveMultiByteStop(EUSCI_B0_BASE);
isReceive = 1;
}
}
}
//main函数中相关代码
MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_MODE);
MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin(ledPort, redPin | greenPin);
isReceive = 0;
for(rxIndex = 0; rxIndex < rxLength - 1; rxIndex++) RxData[rxIndex] = 0;
rxIndex= 0;
MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, EUSCI_B_I2C_TRANSMIT_INTERRUPT0 | EUSCI_B_I2C_NAK_INTERRUPT);
MAP_I2C_masterSendMultiByteStart(EUSCI_B0_BASE, 0x01);
MAP_I2C_masterSendMultiByteStop(EUSCI_B0_BASE);
while (MAP_I2C_masterIsStopSent(EUSCI_B0_BASE));
MAP_I2C_setMode(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_MODE);
MAP_I2C_masterReceiveStart(EUSCI_B0_BASE);
MAP_I2C_clearInterruptFlag(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
MAP_I2C_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
while(!isReceive);
while(MAP_GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)
== GPIO_INPUT_PIN_LOW);
if(RxData[0] == 0x85 && RxData[1] == 0x83)
{
MAP_GPIO_setOutputHighOnPin(ledPort, greenPin);
MAP_GPIO_setOutputLowOnPin(ledPort, redPin);
}else
{
MAP_GPIO_setOutputLowOnPin(ledPort, greenPin);
MAP_GPIO_setOutputHighOnPin(ledPort, redPin);
}MAP_I2C_disableInterrupt(EUSCI_B0_BASE, EUSCI_B_I2C_RECEIVE_INTERRUPT0);
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);