Exemple #1
0
uint8_t readStatusMessage(void){
    uint8_t u8MessageLength;
    uint8_t errorByte;
    uint8_t i;


    xSemaphoreTake(xSemaphoreMGC3130DataReady,10*TICKS_PER_MS);
    /*Pull the TS Line Low*/
    MGC3130_TS_PIN_LOW;
    /*Check to see if the Send the start bit.*/
    if(PLIB_I2C_BusIsIdle(I2C_MGC3130)){
        PLIB_I2C_MasterStart(I2C_MGC3130);
    }

    xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);
    /*Send the slave address*/
    if(PLIB_I2C_TransmitterIsReady(I2C_MGC3130)){
        PLIB_I2C_TransmitterByteSend(I2C_MGC3130, MGC3130_ADDRESS_READ);
    }

    xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);
    /*Get the I2C module to clock out to receive a byte.*/
    if(PLIB_I2C_TransmitterByteWasAcknowledged(I2C_MGC3130)){
        PLIB_I2C_MasterReceiverClock1Byte(I2C_MGC3130);

    }

    xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);
    /*The first byte from the MGC3130 is the length of the message*/
    u8MessageLength = PLIB_I2C_ReceivedByteGet(I2C_MGC3130);

    for(i = 1; i<u8MessageLength; i++){
        PLIB_I2C_ReceivedByteAcknowledge(I2C_MGC3130, true);
        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Ack completed
        PLIB_I2C_MasterReceiverClock1Byte(I2C_MGC3130);
        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Byte Received


        if(i == 6){
            errorByte = PLIB_I2C_ReceivedByteGet(I2C_MGC3130);
        }
        else{
         PLIB_I2C_ReceivedByteGet(I2C_MGC3130);
        }

    }

    PLIB_I2C_ReceivedByteAcknowledge(I2C_MGC3130, false);


    xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);

    PLIB_I2C_MasterStop(I2C_MGC3130);

    xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Stop bit complete
    MGC3130_TS_PIN_HIGH;

     return errorByte;
}
// *****************************************************************************
// Section: Instance 0 Byte Transfer Functions (Master/Slave)
// *****************************************************************************
bool DRV_I2C0_SetUpByteRead(void)
{
    /* Check for receive overflow */
    if ( PLIB_I2C_ReceiverOverflowHasOccurred(I2C_ID_4))  
    {
        PLIB_I2C_ReceiverOverflowClear(I2C_ID_4); 
        return false;
    }
	
    /* Initiate clock to receive */
    PLIB_I2C_MasterReceiverClock1Byte(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;
        }
    }

}
Exemple #4
0
uint8_t mgc3130StateMachine(pos_and_gesture_data * pos_and_gesture_struct){
    uint8_t u8Success = FALSE;
    int i;

    //Send the start bit 
    xSemaphoreTake(xSemaphoreMGC3130DataReady,10*TICKS_PER_MS);
    if(TS_LINE_IS_LOW){
        /*Pull the TS Line Low*/
        MGC3130_TS_PIN_LOW;
        /*Check to see if the Send the start bit.*/
        if(PLIB_I2C_BusIsIdle(I2C_MGC3130)){
            PLIB_I2C_MasterStart(I2C_MGC3130);
        }

        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Start transmitted
        /*Send the slave address*/
        if(PLIB_I2C_TransmitterIsReady(I2C_MGC3130)){
            PLIB_I2C_TransmitterByteSend(I2C_MGC3130, MGC3130_ADDRESS_READ);
        }

        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Address transmitted
        /*Get the I2C module to clock out to receive a byte.*/
        if(PLIB_I2C_TransmitterByteWasAcknowledged(I2C_MGC3130)){
            PLIB_I2C_MasterReceiverClock1Byte(I2C_MGC3130);

        }

        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Message Length Received.
        /*The first byte from the MGC3130 is the length of the message*/
        /*The first byte from the MGC3130 is the length of the message*/
        u8ReceiveBuffer[0] = PLIB_I2C_ReceivedByteGet(I2C_MGC3130);
        u8MessageLength = u8ReceiveBuffer[0];

        if(u8MessageLength > 0 && u8MessageLength < 0xFF){
            for(i = 1; i<u8MessageLength; i++){
                PLIB_I2C_ReceivedByteAcknowledge(I2C_MGC3130, true);
                xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Ack completed
                PLIB_I2C_MasterReceiverClock1Byte(I2C_MGC3130);
                xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Byte Received
                u8ReceiveBuffer[i] = PLIB_I2C_ReceivedByteGet(I2C_MGC3130);
            }
            PLIB_I2C_ReceivedByteAcknowledge(I2C_MGC3130, false);
        }
        else{
            PLIB_I2C_ReceivedByteAcknowledge(I2C_MGC3130, false);
        }

        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);

        PLIB_I2C_MasterStop(I2C_MGC3130);

        xSemaphoreTake(xSemaphoreI2CHandler,portMAX_DELAY);//Stop bit complete
        MGC3130_TS_PIN_HIGH;


        if(u8MessageLength > 0){
            u8Success = mgc3130_dynamic_extract_pos_and_gest_data(u8ReceiveBuffer, pos_and_gesture_struct);
            return u8Success;
        }
        else{
            u8Success = FALSE;
        }
    
    }

    return u8Success;//Initialized as false.
}