void interrupt iic0_Service (void) { IIC_FLG_CLEAR(); // Deteccion de eot if (iic_data.currCB == iic_data.eotCB) { #ifdef IIC_DEBUG_EOT putchar('e');putchar('o');putchar('t');putchar('\n'); #endif IIC_STOP(); if (IIC0_IBCR_TX_RX == 0) iic_commData.dataPtr[iic_data.dataIdx] = IIC_RECEIVE(); } // Deteccion de errores if (((IIC0_IBSR_RXAK == 1) && (IIC0_IBCR_TX_RX == 1)) || (IIC0_IBSR_IBAL == IIC_ARBITRATION_LOST)) { IIC_STOP(); iic_data.currCB = iic_data.commFailedCB; } if (iic_data.currCB != NULL) (*iic_data.currCB)(); return; }
void interrupt iic0_srv (void) { IIC_FLG_CLEAR(); // Deteccion de eot if (iic_data.currCB == iic_data.eotCB) { IIC_STOP(); if (IIC0_IBCR_TX_RX == 0) iic_commData.data[iic_data.dataIdx] = IIC_RECEIVE(); } // Deteccion de errores if (((IIC0_IBSR_RXAK == 1) && (IIC0_IBCR_TX_RX == 1)) || (IIC0_IBSR_IBAL == IIC_ARBITRATION_LOST)) { IIC_STOP(); iic_data.currCB = iic_data.commFailedCB; } if (iic_data.currCB != NULL) (*iic_data.currCB)(); return; }
void IIC_DataEvent(void) { uint8_t data; uint8_t send = 0; if((IIC_Status.sw == IIC_Switch_Pause) || (IIC_Status.i2cstat == IIC_I2CStat_Free)) { //dummy read IIC_MCU_DUMMYREAD(&data); IIC_STOP(); }else { if(IIC_Status.step == IIC_Step_Sub) //restart { if(IIC_Status.stat == IIC_Stat_Write) { IIC_Status.step = IIC_Step_RW; IIC_QueuePointer = 0; //start register Write send = 1; data = IIC_Queue[IIC_QueuePointer]; }else { IIC_MCU_RESTART; } }else { if(IIC_Status.stat == IIC_Stat_Write) //send Write queue { IIC_QueuePointer ++; if(IIC_QueuePointer == IIC_Status.queuelength) //one unit Write done { IIC_STOP(); //dummy read IIC_MCU_DUMMYREAD(&data); //auto pause //IIC_Status.sw = IIC_Switch_Pause; IIC_Status.stat = IIC_Stat_Done; }else { send = 1; data = IIC_Queue[IIC_QueuePointer]; } }else { if((IIC_QueuePointer + 2) == IIC_Status.queuelength) { IIC_MCU_STOP1; } else if((IIC_QueuePointer + 1) == IIC_Status.queuelength) { IIC_MCU_STOP2; } if(IIC_QueuePointer < IIC_Status.queuelength) IIC_MCU_RECEIVEDATA(&IIC_Queue[IIC_QueuePointer]); IIC_QueuePointer ++; if(IIC_QueuePointer == IIC_Status.queuelength) { IIC_MCU_STOP3; IIC_MCU_DUMMYREAD(&data); IIC_Status.stat = IIC_Stat_Done; IIC_UserProcedureAfterScanOnce; } } } if(send)IIC_MCU_SENDDATA(data); } }