// ========================================================= // I2C Master Tx Wake Up Callback Function // ========================================================= void I2C_MasterTxWakeup(uint32_t u32Status) { if(u32Status == 0x08) /* START has been transmitted */ { I2C_SetData(I2C_MS_PORT, (I2CMstAddr << 1)); /* Write SLA+W to Register I2CDAT */ I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_SI); } else if(u32Status == 0x18) /* SLA+W has been transmitted and ACK has been received */ { I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_STO_SI); I2CMstWakeupEndFlag = 1; //I2C_DisableTimeout(I2C_MS_PORT); } else if(u32Status == 0x20) /* SLA+W has been transmitted and NOT ACK has been received */ { //------TimeOut Recover Master state----------- if(I2CMstEndFlag==0 && (getTickCount() - I2CMstTimeOutCounter) > 1) //3ms { I2CMstWakeupEnStartFlag=1; I2CMstTRxEnStartFlag=1; I2CMstSleepEnStartFlag=1; I2CMstEndFlag=1; I2CMstTimeOutFlag=1; } I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_STA_STO_SI); } else { /* TO DO */ printf("Status 0x%x is NOT processed\n", u32Status); } }
/*---------------------------------------------------------------------------------------------------------*/ void I2C_MasterTx(uint32_t u32Status) { if(u32Status == 0x08) /* START has been transmitted */ { I2CMstState=0; I2C_SetData(I2C_MS_PORT, I2CMstAddr << 1); /* Write SLA+W to Register I2CDAT */ I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_SI); } else if(u32Status == 0x18) /* SLA+W has been transmitted and ACK has been received */ { I2C_SetData(I2C_MS_PORT, I2CMstCmd); I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_SI); I2CMstStage=0; } else if(u32Status == 0x20) /* SLA+W has been transmitted and NACK has been received */ { //------TimeOut Recover Master state----------- if(I2CMstEndFlag==0 && (getTickCount() - I2CMstTimeOutCounter) > 1) { I2CMstWakeupEnStartFlag=1; I2CMstTRxEnStartFlag=1; I2CMstSleepEnStartFlag=1; I2CMstEndFlag=1; I2CMstTimeOutFlag=1; } I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_STA_STO_SI); } else if(u32Status == 0x28) /* DATA has been transmitted and ACK has been received */ { if(I2CMstStage==0) { I2C_SetData(I2C_MS_PORT, I2CMstCmd>>8); I2CMstStage=1; I2C_SET_CONTROL_REG(I2C_MS_PORT, I2C_CTL_SI); } else if(I2CCurrentLen < I2CDataEndBit)
//********************************************************* void I2C_Main() { char i; #if Slave_Mode == 1 if(I2C->SlaveGO) { I2C->SlaveGO=0; I2C_Slave_Mode(); SSPIE=1; if(I2C->SlaveTxGO) { I2C->SlaveTxGO=0; SS1=0; I2C->SS=0; } if(I2C->SlaveRxGO) { I2C->SlaveRxGO=0; I2C_SetData(0); } LED2=~LED2; } #endif #if Master_Mode == 1 if(I2C->MasterRxGO) { I2C->MasterRxGO=0; I2C_Master_Reception(); TMain->Test=1; LED2=~LED2; #if UART_use == 1 for(i=0;i<32;i++) { UART->TxData[i]=I2C->BufferReader[i]; } UART->TxGO=1; #endif } else { if(SS1) { if(!I2C->SS) { I2C->SS=1; I2C->MasterRxGO=1; } } else { if(I2C->SS) { I2C->SS=0; } if(I2C->MasterTxGO) { I2C->MasterTxGO=0; I2C_Master_Transmission(); } } } #endif }