bool DRV_I2C0_MasterRestart(void) { /* Check for receive overflow */ if ( PLIB_I2C_ReceiverOverflowHasOccurred(I2C_ID_4)) { PLIB_I2C_ReceiverOverflowClear(I2C_ID_4); return false; } /* Check for transmit overflow */ if (PLIB_I2C_TransmitterOverflowHasOccurred(I2C_ID_4)) { PLIB_I2C_TransmitterOverflowClear(I2C_ID_4); return false; } /* Issue restart */ PLIB_I2C_MasterStartRepeat(I2C_ID_4); return true; }
void __attribute__((interrupt, no_auto_psv)) _MI2C2Interrupt(void) #endif #endif { ACCEL_BOOL polling; ACCEL_CMD_DATA *pCmdData; uint32_t *pIndex; // uint8_t **pRxBuffer; uint8_t *pRxBuffer; // if(I2CPriority == ACCEL_PRIORIY) // { // pCmdData = accelData; // pIndex = &accelIdx; //// pRxBuffer = &AccelRxBuffer; // pRxBuffer = AccelRxBuffer; // } // else // { //// pCmdData = (ACCEL_CMD_DATA *)EepromI2CData; //// pIndex = &EepromI2CIdx; //// pRxBuffer = &EepromRxBuffer; // } pCmdData = accelData; pIndex = &accelIdx; pRxBuffer = AccelRxBuffer; // AccelRxBuffer += 4; if(SYS_INT_SourceStatusGet(ACCEL_BMA250_I2C_SOURCE)) { polling = ACCEL_FALSE; switch(pCmdData[*pIndex].cmd) { case ACCEL_CMD_START: PLIB_I2C_MasterStart(ACCEL_BMA250_I2C_MODULE); break; case ACCEL_CMD_RESTART: PLIB_I2C_MasterStartRepeat(ACCEL_BMA250_I2C_MODULE); break; case ACCEL_CMD_STOP: PLIB_I2C_MasterStop(ACCEL_BMA250_I2C_MODULE); break; case ACCEL_CMD_TX_BYTE: PLIB_I2C_TransmitterByteSend(ACCEL_BMA250_I2C_MODULE, pCmdData[*pIndex].data); break; case ACCEL_CMD_EN_RX: PLIB_I2C_MasterReceiverClock1Byte(ACCEL_BMA250_I2C_MODULE); break; case ACCEL_CMD_RX_BYTE: // **pRxBuffer = PLIB_I2C_ReceivedByteGet(ACCEL_BMA250_I2C_MODULE); // (*pRxBuffer)++; *pRxBuffer = PLIB_I2C_ReceivedByteGet(ACCEL_BMA250_I2C_MODULE); pRxBuffer++; break; case ACCEL_CMD_ACK: PLIB_I2C_ReceivedByteAcknowledge(ACCEL_BMA250_I2C_MODULE, pCmdData[*pIndex].data); break; case ACCEL_CMD_ACK_POLL: polling = ACCEL_TRUE; if(!PLIB_I2C_TransmitterByteWasAcknowledged(ACCEL_BMA250_I2C_MODULE)) { (*pIndex) -= 4; } break; default: accelData[*pIndex].cmd = ACCEL_DONE; case ACCEL_DONE: #ifndef ACCEL_USE_EXTERNAL_INTERUPT_HANDLER SYS_INT_SourceDisable(ACCEL_BMA250_I2C_SOURCE); accelData[0].cmd = ACCEL_DONE; break; #else *pIndex = ACCEL_INVALID_IDX; return; #endif } SYS_INT_SourceStatusClear(ACCEL_BMA250_I2C_SOURCE); if(pCmdData[*pIndex].cmd != ACCEL_DONE) { if((pCmdData[*pIndex].cmd == ACCEL_CMD_RX_BYTE) || (polling)) { SYS_INT_SourceStatusSet(ACCEL_BMA250_I2C_SOURCE); } (*pIndex)++; }else { *pIndex = ACCEL_INVALID_IDX; I2CPriority = FREE_PRIORITY; } } }