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.c

132 lines
4.1 KiB

#include "i2c.h"
#include "usart.h"
void i2c_init( i2c_t *i2c_dev, /*!< Pointer to I2C hardware Object */
i2cCh_t channelNo, /*!< The harware channel to be used */
i2c_mode_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 */
i2c_address_count_t addressCount, /*!< Single or multiple */
i2c_address_size_t addressSize, /*!< 10 or 7 bit address size */
i2c_clk_speed_t speed, /*!< Bus Speed */
i2c_clk_stretching_t stretching, /*!< Clock Stretching enable onyl in slave mode */
i2c_wake_types_t wakeOn /*!< Wake up condition */
)
{
i2c_dev->channelNo = channelNo;
i2c_dev->mode = mode;
i2c_dev->mainAddress = mainAddress;
i2c_dev->secondAddress = secondAddress;
i2c_dev->addressCount = addressCount;
i2c_dev->addressSize = addressSize;
i2c_dev->speed = speed;
i2c_dev->stretching = stretching;
i2c_dev->wakeOn = wakeOn;
//Initial state States
i2c_dev->hardwareState = i2c_hw_disabled;
i2c_dev->periferalState = i2c_perif_disabled;
i2c_hardware_enable(i2c_dev);
i2c_periferal_disable(i2c_dev); // Just to be sure as periferal configuration can not be dont when active.
i2c_set_filter(i2c_dev,1);
i2c_set_clk_stretch(i2c_dev, stretching);
i2c_set_clk_speed(i2c_dev, speed);
i2c_set_mode(i2c_dev, mode);
i2c_set_address_lenght(i2c_dev, addressSize);
i2c_set_address(i2c_dev, mainAddress);
i2c_set_address_second(i2c_dev, mainAddress);
i2c_periferal_enable(i2c_dev);
print_Usart(usart2, "I2C -> periferal enabled\n\r");
}
void i2c_read(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
{
i2c_send_address_for_write(i2c_dev, slaveAddress);
i2c_send_reg_address(i2c_dev, registerAddress);
while(!i2c_is_tx_complete(i2c_dev));
i2c_send_address_for_read(i2c_dev, slaveAddress);
while(!i2c_is_input_buffer_full(i2c_dev));
i2c_get_input_register(i2c_dev, data);
while(!i2c_is_tx_complete(i2c_dev));
i2c_send_nack(i2c_dev);
i2c_send_stop(i2c_dev);
print_Usart(usart2, "I2C -> Read Done\n\r");
}
void i2c_write(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght){}
/*
void i2cRead(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
{
//
// Start
// Send Address
// Wait For ACK
//
uint8_t nbytes = 0;
i2c_dev->periferalState = i2cPerifTransmitting;
i2cSetTransferCounter(i2c_dev,1);
i2cSendSlaveAddressWrite(i2c_dev, slaveAddress);
i2cSendRegisterAddress(i2c_dev,registerAddress);
while(i2c_dev->periferalState != i2cPerifTransferComplete)
{
i2cIsTransferComplete(i2c_dev);
}
i2c_dev->periferalState = i2cPerifRecieving;
i2cSendSlaveAddressRead(i2c_dev, slaveAddress);
while(i2c_dev->periferalState != i2cPerifTransferComplete)
{
i2cIsTransferComplete(i2c_dev);
}
i2cGenerateNack(i2c_dev);
i2cGenerateStop(i2c_dev);
i2cReadInputRegister(i2c_dev, data);
print_Usart(usart2, "\n\rI2C Read completed\n\r");
while(i2c_dev->periferalState != i2cPerifReady)
{
i2cIsPeriferalReady(i2c_dev);
}
i2c_dev->periferalState = i2cPerifReady;
i2c_dev->hardwareState = i2cHwIdle;
}
void i2cWrite(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
{
i2cSetTransferCounter(i2c_dev,2);
i2cSendSlaveAddressWrite(i2c_dev, slaveAddress);
i2cSendRegisterAddress(i2c_dev,registerAddress);
while((i2c_dev->hardwareState =! i2cHwOutputBufferEmpty))
{
i2cIsOutputBufferEmpty(i2c_dev);
}
i2cSendData(i2c_dev,data);
i2cGenerateStop(i2c_dev);
print_Usart(usart2, "\n\rI2C Transfer completed\n\r");
}
*/
void i2c_throw_error(i2c_t *i2c_dev, int16_t error)
{
print_Usart(usart2, "\n\r");
print_Usart(usart2, "\n\r");
print_Usart(usart2, "I2C Error Detected : ");
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");
}