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