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.
KED/peripherals/i2c/i2c.c

131 lines
3.5 KiB

#include "i2c.h"
#include "usart.h"
void i2cInit( i2c_t *i2cHardware,
i2cCh_t channelNo,
i2cMode_t mode,
uint16_t mainAddress,
uint16_t secondAddress,
i2cAddressCount_t addressCount,
i2cAddressSize_t addressSize,
i2cSpeed_t speed,
i2cOpperationMode_t opperationMode,
i2cClockStretching_t stretching,
i2cWakeUpTypes_t wakeOn)
{
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);
while(i2cHardware->periferalState != i2cPerifReady)
{
i2cIsPeriferalReady(i2cHardware);
}
i2cHardware->periferalState = i2cPerifInitialized;
}
void i2cDeInit(i2c_t *i2cHardware)
{
}
void i2cRead(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
{
//
// Start
// Send Address
// Wait For ACK
//
uint8_t nbytes = 0;
i2cHardware->periferalState = i2cPerifTransmitting;
i2cSetTransferCounter(i2cHardware,1);
i2cSendSlaveAddressWrite(i2cHardware, slaveAddress);
i2cSendRegisterAddress(i2cHardware,registerAddress);
while(i2cHardware->periferalState != i2cPerifTransferComplete)
{
i2cIsTransferComplete(i2cHardware);
}
i2cHardware->periferalState = i2cPerifRecieving;
i2cSendSlaveAddressRead(i2cHardware, slaveAddress);
while(i2cHardware->periferalState != i2cPerifTransferComplete)
{
i2cIsTransferComplete(i2cHardware);
}
i2cGenerateNack(i2cHardware);
i2cGenerateStop(i2cHardware);
i2cReadInputRegister(i2cHardware, data);
print_Usart(usart2, "\n\rI2C Read completed\n\r");
while(i2cHardware->periferalState != i2cPerifReady)
{
i2cIsPeriferalReady(i2cHardware);
}
i2cHardware->periferalState = i2cPerifReady;
i2cHardware->hardwareState = i2cHwIdle;
}
void i2cWrite(i2c_t *i2cHardware, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
{
i2cSetTransferCounter(i2cHardware,2);
i2cSendSlaveAddressWrite(i2cHardware, slaveAddress);
i2cSendRegisterAddress(i2cHardware,registerAddress);
while((i2cHardware->hardwareState =! i2cHwOutputBufferEmpty))
{
i2cIsOutputBufferEmpty(i2cHardware);
}
i2cSendData(i2cHardware,data);
i2cGenerateStop(i2cHardware);
print_Usart(usart2, "\n\rI2C Transfer completed\n\r");
}
void i2cThrowError(i2c_t *i2cHardware, int16_t error)
{
print_Usart(usart2, "\n\r");
print_Usart(usart2, "\n\r");
print_Usart(usart2, "I2C Error Detected : ");
if (i2cHardware->periferalState == i2cPerifTransmitting)
print_Usart(usart2, "i2cPerifTransmitting");
if (i2cHardware->periferalState == i2cPerifRecieving)
print_Usart(usart2, "i2cPerifRecieving");
print_Usart(usart2, "\n\r");
print_Usart(usart2, "I2C Error No: ");
usartSendChar(usart2, error + 0x30);
print_Usart(usart2, "\n\r");
print_Usart(usart2, "\n\r");
}