コード例 #1
0
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;
        }
    }

}