You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.9 KiB
184 lines
4.9 KiB
#include "i2c.h"
|
|
|
|
//uint32_t i2cCR1;
|
|
//uint32_t i2cCR2;
|
|
//uint32_t i2cISR;
|
|
|
|
void i2cInit( i2c_t *i2cHardware, /*!< Pointer to I2C hardware Object */
|
|
i2cCh_t channelNo, /*!< The harware channel to be used */
|
|
i2cMode_t mode, /*!< Master, Slave or Multymaster Modes */
|
|
uint16_t mainAddress, /*!< First and Main address of the device */
|
|
uint16_t secondAddress, /*!< Second address if dual addresse mode is configured */
|
|
i2cAddressCount_t addressCount, /*!< Single or multiple */
|
|
i2cAddressSize_t addressSize, /*!< 10 or 7 bit address size */
|
|
i2cSpeed_t speed, /*!< Bus Speed */
|
|
i2cOpperationMode_t opperationMode, /*!< Blocking or non blocking polling, Int or DMA */
|
|
i2cClockStretching_t stretching, /*!< Clock Stretching enable onyl in slave mode */
|
|
i2cWakeUpTypes_t wakeOn) /*!< Wake up condition */
|
|
{
|
|
i2cHardware->channelNo = channelNo;
|
|
i2cHardware->mode = mode;
|
|
i2cHardware->mainAddress = mainAddress;
|
|
i2cHardware->secondAddress = secondAddress;
|
|
i2cHardware->addressCount = addressCount;
|
|
i2cHardware->addressSize = addressSize;
|
|
i2cHardware->speed = speed;
|
|
i2cHardware->opperationMode = opperationMode;
|
|
i2cHardware->stretching = stretching;
|
|
i2cHardware->wakeOn = wakeOn;
|
|
i2cHardware->hardwareState = i2cHwIdle;
|
|
i2cHardware->periferalState = i2cPerifNotInitialized;
|
|
|
|
i2cEnableHardware(i2cHardware);
|
|
|
|
i2cDisablePeriferal(i2cHardware);
|
|
|
|
i2cConfigureFilters(i2cHardware);
|
|
|
|
i2cSetClockStretch(i2cHardware, stretching);
|
|
|
|
i2cSetSpeed(i2cHardware, speed);
|
|
|
|
i2cSetMode(i2cHardware, opperationMode);
|
|
|
|
i2cSetAddressLenght(i2cHardware, addressSize);
|
|
|
|
i2cSetAddress(i2cHardware, mainAddress, secondAddress);
|
|
|
|
i2cEnablePeriferal(i2cHardware);
|
|
|
|
i2cHardware->periferalState = i2cPerifNotInitialized;
|
|
}
|
|
|
|
|
|
void i2cDeInit(i2c_t *i2cHardware)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void i2cRead(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
|
{
|
|
switch(i2cHardware->mode)
|
|
{
|
|
case i2cModeMaster:
|
|
i2cMasterRecieve(i2cHardware, slaveAddress, registerAddress, data);
|
|
break;
|
|
case i2cModeSlave:
|
|
break;
|
|
case i2cModeMultyMaster:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// this function still doesn't implment 10 bit oopeartion TODO
|
|
void i2cMasterRecieve(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data)
|
|
{
|
|
switch(i2cHardware->opperationMode)
|
|
{
|
|
case i2cOpperationPolling :
|
|
i2cMasterRecievePolling(i2cHardware, slaveAddress, registerAddress, data);
|
|
break;
|
|
case i2cOpperationInt:
|
|
break;
|
|
case i2cOpperationDma:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void i2cWrite(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
|
{
|
|
switch(i2cHardware->mode)
|
|
{
|
|
case i2cModeMaster:
|
|
i2cMasterSend(i2cHardware, slaveAddress, registerAddress, data);
|
|
break;
|
|
case i2cModeSlave:
|
|
break;
|
|
case i2cModeMultyMaster:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void i2cMasterSend(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data)
|
|
{
|
|
switch(i2cHardware->opperationMode)
|
|
{
|
|
case i2cOpperationPolling :
|
|
i2cMasterSendPolling(i2cHardware, slaveAddress, registerAddress, data);
|
|
break;
|
|
case i2cOpperationInt:
|
|
break;
|
|
case i2cOpperationDma:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void i2cMasterSendPolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data)
|
|
{
|
|
while(i2cHardware->periferalState != i2cPerifReady)
|
|
{
|
|
i2cIsPeriferalReady(i2cHardware);
|
|
}
|
|
|
|
i2cHardware->periferalState = i2cPerifTransmitting;
|
|
|
|
i2cInitiateWriteCommand(i2cHardware);
|
|
i2cSetTransferCounter(i2cHardware,2);
|
|
i2cSendSlaveAddress(i2cHardware, slaveAddress);
|
|
i2cSendRegisterAddress(i2cHardware,registerAddress);
|
|
|
|
i2cSendData(i2cHardware,data);
|
|
|
|
while(i2cHardware->periferalState != i2cPerifTransferComplete)
|
|
{
|
|
i2cIsTransferComplete(i2cHardware);
|
|
}
|
|
|
|
i2cGenerateStop(i2cHardware);
|
|
|
|
i2cHardware->periferalState = i2cPerifReady;
|
|
i2cHardware->hardwareState = i2cHwIdle;
|
|
}
|
|
|
|
|
|
void i2cMasterRecievePolling(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data)
|
|
{
|
|
while(i2cHardware->periferalState != i2cPerifReady)
|
|
{
|
|
i2cIsPeriferalReady(i2cHardware);
|
|
}
|
|
|
|
i2cHardware->periferalState = i2cPerifTransmitting;
|
|
|
|
i2cSetTransferCounter(i2cHardware,1);
|
|
i2cInitiateWriteCommand(i2cHardware);
|
|
i2cSendSlaveAddress(i2cHardware, slaveAddress);
|
|
i2cSendRegisterAddress(i2cHardware,registerAddress);
|
|
|
|
while(i2cHardware->periferalState != i2cPerifTransferComplete)
|
|
{
|
|
i2cIsTransferComplete(i2cHardware);
|
|
}
|
|
|
|
i2cInitiateReadCommand(i2cHardware);
|
|
i2cSendSlaveAddress(i2cHardware, slaveAddress);
|
|
|
|
i2cHardware->periferalState = i2cPerifRecieving;
|
|
|
|
while(i2cHardware->hardwareState != i2cHwInputBufferFull)
|
|
{
|
|
i2cIsInputBufferEmpty(i2cHardware);
|
|
}
|
|
|
|
i2cGenerateNack(i2cHardware);
|
|
i2cGenerateStop(i2cHardware);
|
|
|
|
i2cReadInputRegister(i2cHardware, data);
|
|
|
|
i2cHardware->periferalState = i2cPerifReady;
|
|
i2cHardware->hardwareState = i2cHwIdle;
|
|
}
|
|
|