/** * @brief This function checks ACK/NACK from I2C slave. * @param None * @return None */ bool I2cChkAck(void* I2cMasterHandle) { bool Ack; SetInputSDA(I2cMasterHandle);//Allow slave to send ACK ClrSCL(I2cMasterHandle);//slave send ACK SetSCL(I2cMasterHandle); Ack = !GetSDA(I2cMasterHandle);//Get ACK from slave ClrSCL(I2cMasterHandle); return Ack; }
/** * @brief This function generates I2C stop timing. * @param None * @return None */ void I2cStop(void* I2cMasterHandle) { SetOutputSCL(I2cMasterHandle); SetOutputSDA(I2cMasterHandle); ClrSDA(I2cMasterHandle); SetSCL(I2cMasterHandle); SetSDA(I2cMasterHandle); SetInputSDA(I2cMasterHandle); }
// Check Ackowledge signal(ACK/NACK). BOOL I2C_ChkAck(BYTE I2cDevice) { BOOL Ack; ClrSCL(I2cDevice); SetInputSDA(I2cDevice); SetSCL(I2cDevice); KtIICDelay(); Ack = !GetSDA(I2cDevice); ClrSCL(I2cDevice); return Ack; }
// send STOP signal. VOID I2C_Stop(BYTE I2cDevice) { // DBG(("I2C_Stop()\n")); SetOutputSCL(I2cDevice); SetOutputSDA(I2cDevice); ClrSDA(I2cDevice); KtIICDelay(); SetSCL(I2cDevice); SetSDA(I2cDevice); SetInputSDA(I2cDevice); }
// Receive one byte via I2C. BYTE I2C_ReadByte(BYTE I2cDevice) { BYTE i = 8; BYTE Dat = 0; SetInputSDA(I2cDevice); while(i--) { Dat <<= 1; if(GetSDA(I2cDevice)) { Dat |= 0x01; } SetSCL(I2cDevice); KtIICDelay(); ClrSCL(I2cDevice); } SetOutputSDA(I2cDevice); return Dat; }
/** * @brief This function recieve one byte from I2C slave. * @param none * @return Data received from I2C slave */ uint8_t I2cReadByte(void* I2cMasterHandle) { uint8_t i = 8; uint8_t Dat = 0; SetInputSDA(I2cMasterHandle); while(i--) { SetSCL(I2cMasterHandle); Dat <<= 1; if(GetSDA(I2cMasterHandle)) { Dat |= 0x01; } ClrSCL(I2cMasterHandle); } SetOutputSDA(I2cMasterHandle); return Dat; }