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.
122 lines
3.8 KiB
122 lines
3.8 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, "\n\rI2C -> periferal enabled\n\r");
|
|
}
|
|
|
|
void i2c_read(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
|
{
|
|
|
|
i2c_dev->periferalState = i2c_perif_read;
|
|
|
|
// Arch nemesis ! We only setn the address
|
|
// but the counter allso socunt the bits that we have recieved
|
|
// and we want to read one byte
|
|
// every transaction counts
|
|
i2c_set_transfer_counter(i2c_dev,1);
|
|
i2c_send_address_for_write(i2c_dev, slaveAddress);
|
|
i2c_send_reg_address(i2c_dev, registerAddress);
|
|
while(!i2c_is_transfer_complete(i2c_dev));
|
|
|
|
//i2c_set_transfer_counter(i2c_dev,2);
|
|
i2c_send_address_for_read(i2c_dev, slaveAddress);
|
|
i2c_get_input_register(i2c_dev, data);
|
|
while(!i2c_is_transfer_complete(i2c_dev));
|
|
i2c_send_nack(i2c_dev);
|
|
i2c_send_stop(i2c_dev);
|
|
|
|
while(!i2c_is_perif_ready(i2c_dev));
|
|
}
|
|
|
|
void i2c_write(i2c_t *i2c_dev, uint16_t *slaveAddress, uint8_t *registerAddress, uint8_t *data, uint8_t *dataLenght)
|
|
{
|
|
uint8_t i = *dataLenght + 1 ;
|
|
i2c_dev->periferalState = i2c_perif_write;
|
|
i2c_set_transfer_counter(i2c_dev,i);
|
|
i2c_send_address_for_write(i2c_dev, slaveAddress);
|
|
i2c_send_reg_address(i2c_dev, registerAddress);
|
|
for(i = 0; i < *dataLenght; i++)
|
|
{
|
|
i2c_send_data(i2c_dev, data);
|
|
}
|
|
while(!i2c_is_transfer_complete(i2c_dev));
|
|
i2c_send_stop(i2c_dev);
|
|
while(!i2c_is_perif_ready(i2c_dev));
|
|
}
|
|
|
|
uint8_t i2c_check_device(i2c_t *i2c_dev, uint16_t *device)
|
|
{
|
|
i2c_dev->periferalState = i2c_perif_write;
|
|
i2c_set_transfer_counter(i2c_dev,0);
|
|
i2c_send_address_for_write(i2c_dev, device);
|
|
|
|
if(i2c_check_nack(i2c_dev))
|
|
{
|
|
i2c_dev->hardwareState = i2c_hw_got_nack;
|
|
i2c_throw_error(i2c_dev,1);
|
|
return 0;
|
|
}
|
|
i2c_dev->hardwareState = i2c_hw_got_ack;
|
|
return 1;
|
|
}
|
|
|
|
uint8_t i2c_discover_devices(i2c_t *i2c_dev)
|
|
{
|
|
uint16_t i = 0;
|
|
for(i = 0x03; i <= 0x77; i++)
|
|
{
|
|
i2c_check_device(i2c_dev,&i);
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
|
|
void i2c_throw_error(i2c_t *i2c_dev, uint8_t error)
|
|
{
|
|
print_Usart(usart2, "\n\r");
|
|
print_Usart(usart2, "I2C : Error");
|
|
print_Usart(usart2, "\n\r");
|
|
if(error == 1)
|
|
{
|
|
print_Usart(usart2, " -> Device not Found ");
|
|
print_Usart(usart2, "\n\r");
|
|
}
|
|
}
|