2021-05-22 22:08:19 -04:00

171 lines
3.7 KiB
C

#include "define.h"
#include "BoardCfg.h"
#include "I2C.h"
int mLastTransactionOK;
int mI2CWaitCounter;
int I2CInit()
{
//SPI and I2C BRG work the same way. So let's reuse some code!
// int BaudRateGenerator = SPICalculateBRG(80000000,100000); //PBclk is 80MHz, I2C clk = 100KHz
int BaudRateGenerator = 398;
I2C3CON = 0;
I2C3CONbits.DISSLW = 1; //disable slew rate control since we are only at 100KHz
I2C3BRG = BaudRateGenerator;
I2C3CONbits.ON = 1;
mLastTransactionOK = 0;
mI2CWaitCounter = 0;
}
int I2CWrite(unsigned char* OutBuf, unsigned char length)
{
int RET = RET_OK;
int i;
//Emit start event
I2C3CONbits.SEN = 1;
while(I2C3CONbits.SEN == 1)
{
}
if(I2C3STATbits.BCL == 1)
{
mLastTransactionOK = false;
return RET_ERROR;
}
for(i = 0; i < length; i++)
{
I2C3TRN = OutBuf[i];
mI2CWaitCounter = 0;
while(I2C3STATbits.TRSTAT == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
RET = RET_ERROR;
break;
}
}
// if(I2C3STATbits.ACKSTAT == 1)
// {
// RET = RET_ERROR;
// }
}
//Emit stop event
I2C3CONbits.PEN = 1;
mI2CWaitCounter = 0;
while(I2C3CONbits.PEN == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
RET = RET_ERROR;
break;
}
}
mLastTransactionOK = true;
return RET;
}
int I2CTransmitByte(unsigned char Byte)
{
return RET_ERROR;
}
int I2CRead(unsigned char SlaveAddress,unsigned char* InputBuf,unsigned char length)
{
int RET = RET_OK;
int i;
//Emit start event
I2C3CONbits.SEN = 1;
mI2CWaitCounter = 0;
while(I2C3CONbits.SEN == 1)
if(I2C3STATbits.BCL == 1)
{
mLastTransactionOK = false;
return RET_ERROR;
}
//Transmit slave address and write bit
I2C3TRN = SlaveAddress;
mI2CWaitCounter = 0;
while(I2C3STATbits.TRSTAT == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
return RET_ERROR;
}
}
for(i = 0; i < length; i++)
{
//
I2C3CONbits.RCEN = 1;
mI2CWaitCounter = 0;
while(I2C3CONbits.RCEN == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
return RET_ERROR;
}
}
InputBuf[i] = I2C3RCV;
//Acknowledge reception
I2C3CONbits.ACKDT = 1;
I2C3CONbits.ACKEN = 1;
mI2CWaitCounter = 0;
while(I2C3CONbits.ACKEN == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
return RET_ERROR;
}
}
}
//Emit stop event
I2C3CONbits.PEN = 1;
mI2CWaitCounter = 0;
while(I2C3CONbits.PEN == 1)
{
if(I2C3STATbits.BCL == 1 || mI2CWaitCounter++ > I2C_TRANSACTION_TIMEOUT_COUNT)
{
mLastTransactionOK = false;
return RET_ERROR;
}
}
mLastTransactionOK = true;
return RET;
}
bool I2CWasLastTransactionOK()
{
return mLastTransactionOK;
}