/* ** ISR to handler i2c interrupts */ void I2CCodecIsr(void) { unsigned int intCode = 0; unsigned int sysIntNum = 0; /* Get interrupt vector code */ intCode = I2CInterruptVectorGet(savedBase); if(SOC_I2C_0_REGS == savedBase) { #ifdef _TMS320C6X sysIntNum = SYS_INT_I2C0_INT; #else sysIntNum = SYS_INT_I2CINT0; #endif } else { intCode = 0; } while(intCode!=0) { /* Clear status of interrupt */ #ifdef _TMS320C6X IntEventClear(sysIntNum); #else IntSystemStatusClear(sysIntNum); #endif if (intCode == I2C_INTCODE_TX_READY) { I2CMasterDataPut(savedBase, slaveData[dataIdx]); dataIdx++; } if(intCode == I2C_INTCODE_RX_READY) { slaveData[dataIdx] = I2CMasterDataGet(savedBase); dataIdx++; } if (intCode == I2C_INTCODE_STOP) { /* Disable transmit data ready and receive data read interupt */ I2CMasterIntDisableEx(savedBase, I2C_INT_TRANSMIT_READY | I2C_INT_DATA_READY); txCompFlag = 0; } intCode = I2CInterruptVectorGet(savedBase); } }
/* ** This function will read/write data from/to PMIC through I2C bus. */ void I2CPMICInteract(void) { volatile unsigned int intCode = 0; /* Get interrupt vector code */ intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS); while(intCode!=0) { /* Clear status of interrupt */ IntSystemStatusClear(SYS_INT_I2CINT0); if (intCode == I2C_INTCODE_TX_READY) { /* Put data to data transmit register of i2c */ I2CMasterDataPut(SOC_I2C_0_REGS, dataToPmic[count++]); } if(intCode == I2C_INTCODE_RX_READY) { /* Receive data from data receive register */ dataFromSlave[rCount] = I2CMasterDataGet(SOC_I2C_0_REGS); } if (intCode == I2C_INTCODE_STOP) { /* Disable transmit data ready and receive data read interupt */ I2CMasterIntDisableEx(SOC_I2C_0_REGS,I2C_INT_TRANSMIT_READY| I2C_INT_DATA_READY); flag = 0; } if (intCode == I2C_INTCODE_NACK) { I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_DATA_READY | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION); /* Generate a STOP */ I2CMasterStop(SOC_I2C_0_REGS); I2CStatusClear(SOC_I2C_0_REGS, I2C_CLEAR_STOP_CONDITION); /* Clear interrupt at AINTC, if we missed any, in case of error */ flag = 0; } intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS); } }
/* ** ISR to handler i2c interrupts */ static void I2C0Isr(void) { volatile unsigned int intCode = 0; /* Get interrupt vector code */ intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS); while(intCode!=0) { /* Clear status of interrupt */ #ifdef _TMS320C6X IntEventClear(SYS_INT_I2C0_INT); #else IntSystemStatusClear(15); #endif if (intCode == I2C_INTCODE_TX_READY) { I2CMasterDataPut(SOC_I2C_0_REGS, slaveData[dataIdx]); dataIdx++; } if(intCode == I2C_INTCODE_RX_READY) { slaveData[dataIdx] = I2CMasterDataGet(SOC_I2C_0_REGS); dataIdx++; } if (intCode == I2C_INTCODE_STOP) { I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_DATA_READY | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION); txCompFlag = 0; } if (intCode == I2C_INTCODE_NACK) { I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_DATA_READY | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION); /* Generate a STOP */ I2CMasterStop(SOC_I2C_0_REGS); I2CStatusClear(SOC_I2C_0_REGS, I2C_CLEAR_STOP_CONDITION); /* Clear interrupt at AINTC, if we missed any, in case of error */ #ifdef _TMS320C6X IntEventClear(SYS_INT_I2C0_INT); #else IntSystemStatusClear(15); #endif txCompFlag = 0; } if (I2CMasterIntStatus(SOC_I2C_0_REGS) & I2C_ICSTR_NACKSNT) { I2CMasterIntDisableEx(SOC_I2C_0_REGS, I2C_INT_TRANSMIT_READY | I2C_INT_DATA_READY | I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION); /* Generate a STOP */ I2CMasterStop(SOC_I2C_0_REGS); I2CStatusClear(SOC_I2C_0_REGS, (I2C_CLEAR_NO_ACK_SENT | I2C_CLEAR_STOP_CONDITION)); /* Clear interrupt at AINTC, if we missed any, in case of error */ #ifdef _TMS320C6X IntEventClear(SYS_INT_I2C0_INT); #else IntSystemStatusClear(15); #endif txCompFlag = 0; } intCode = I2CInterruptVectorGet(SOC_I2C_0_REGS); } }