|
- #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;
- }
|