17 #define I2C_STD_TIMEOUT_MS (5)
27 struct gpio_t gpio_scl = pins[0];
28 struct gpio_t gpio_sda = pins[1];
34 for (i = 0 ; i < 9 ; i++)
51 switch ((uint32_t)i2c->
ctrl)
54 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
58 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
62 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE);
70 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
71 RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
74 I2C_DeInit(i2c->
ctrl);
76 I2C_InitStructure.
I2C_Mode = I2C_Mode_I2C;
79 I2C_InitStructure.
I2C_Ack = I2C_Ack_Enable;
84 I2C_Init(i2c->
ctrl, &I2C_InitStructure);
85 I2C_Cmd(i2c->
ctrl, ENABLE);
93 return ERROR_NOT_YET_IMPLEMENTED;
103 while (I2C_GetFlagStatus(i2c->
ctrl, I2C_FLAG_BUSY))
112 I2C_GenerateSTART(i2c->
ctrl, ENABLE);
122 I2C_Send7bitAddress(i2c->
ctrl, address << 1, direction);
124 if (direction == I2C_Direction_Transmitter)
136 while(!I2C_CheckEvent(i2c->
ctrl, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
150 return i2c_start_re(i2c, address, direction, 1);
155 return i2c_start_re(i2c, address, direction, 0);
162 I2C_SendData(i2c->
ctrl, data);
164 while(!I2C_CheckEvent(i2c->
ctrl, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
179 I2C_AcknowledgeConfig(i2c->
ctrl, ENABLE);
189 *data = I2C_ReceiveData(i2c->
ctrl);
198 I2C_AcknowledgeConfig(i2c->
ctrl, DISABLE);
208 *data = I2C_ReceiveData(i2c->
ctrl);
215 I2C_GenerateSTOP(i2c->
ctrl, ENABLE);
218 static status_e _read(
const struct heivs_bus_t *bus, uint32_t address, uint8_t *data,
size_t len,
size_t *rlen)
226 status = i2c_start(i2c, address, I2C_Direction_Receiver);
234 for (i = 0 ; i < len - 1 ; i++)
236 status = i2c_read_one_ack(i2c, &data[i]);
250 status = i2c_read_one_nack(i2c, &data[i]);
263 static status_e _write(
const struct heivs_bus_t *bus, uint32_t address,
const uint8_t *data,
size_t len)
269 status = i2c_start(i2c, address, I2C_Direction_Transmitter);
275 for (i = 0 ; i < len ; i++)
277 status = i2c_write_one(i2c, data[i]);
289 static status_e _writeread(
const struct heivs_bus_t *bus, uint32_t address,
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_len,
size_t *rlen)
297 status = i2c_start(i2c, address, I2C_Direction_Transmitter);
303 for (i = 0 ; i < src_len ; i++)
305 status = i2c_write_one(i2c, src[i]);
312 status = i2c_restart(i2c, address, I2C_Direction_Receiver);
320 for (i = 0 ; i < dst_len - 1 ; i++)
322 status = i2c_read_one_ack(i2c, &dst[i]);
335 status = i2c_read_one_nack(i2c, &dst[i]);
352 status = _read(bus, address, data, len, rlen);
365 status = _write(bus, address, data, len);
374 static status_e writeread(
const struct heivs_bus_t *bus, uint32_t address,
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_len,
size_t *rlen)
378 status = _writeread(bus, address, src, src_len, dst, dst_len, rlen);
389 #if BSP_I2C_BUS_COUNT > 0
400 #if BSP_I2C_BUS_COUNT > 1
410 #if BSP_I2C_BUS_COUNT > 2
412 .ctrl = BSP_I2C_BUS2_CTRL,
415 BSP_I2C_BUS2_GPIO_SCL,
416 BSP_I2C_BUS2_GPIO_SDA,
426 #if BSP_I2C_BUS_COUNT > 0
427 #ifndef BSP_I2C_BUS0_NAME
428 #define BSP_I2C_BUS0_NAME "bus_i2c[0]"
431 .
name = BSP_I2C_BUS0_NAME,
432 .priv = &bus_priv[0],
439 ._writeread = writeread,
442 #if BSP_I2C_BUS_COUNT > 1
443 #ifndef BSP_I2C_BUS1_NAME
444 #define BSP_I2C_BUS1_NAME "bus_i2c[1]"
447 .name = BSP_I2C_BUS1_NAME,
448 .priv = &bus_priv[1],
455 ._writeread = writeread,
458 #if BSP_I2C_BUS_COUNT > 2
459 #ifndef BSP_I2C_BUS2_NAME
460 #define BSP_I2C_BUS2_NAME "bus_i2c[2]"
463 .name = BSP_I2C_BUS2_NAME,
464 .priv = &bus_priv[2],
471 ._writeread = writeread,
474 #if BSP_I2C_BUS_COUNT > 3
475 #error this CPU has no 4 I2c buses
This file contains all the functions prototypes for the RCC firmware library.
BSP - Board Support Package.
#define BSP_I2C_BUS1_CTRL
On this controller.
#define BSP_I2C_BUS1_GPIO_SDA
SDA on this pin.
static void workaround_reset_i2c_devices(const struct gpio_t *pins)
Workaround i2c devices without reset pins.
ssize_t read(int fd, void *buf, size_t count)
uint16_t I2C_AcknowledgedAddress
#define I2C_EVENT_MASTER_MODE_SELECT
Communication start.
Variable part of the bus description.
enum gpio_mode_e mode
mode for instance GPIO_INPUT | GPIO_PULLDOWN
#define BSP_I2C_BUS0_GPIO_SCL
SCL on this pin.
static uint32_t time_elapsed(timeout_t timeout)
Is this time passed?
static void gpio_set(const struct gpio_t *gpio, uint32_t value)
Set a gpio.
#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
Address Acknowledge.
I2C_TypeDef * ctrl
Bus controller.
const struct gpio_t gpios[2]
Gpios.
#define BSP_I2C_BUS_COUNT
Number of i2c buses.
#define BSP_I2C_BUS1_GPIO_SCL
SCL on this pin.
This file contains all the functions prototypes for the I2C firmware library.
const struct heivs_bus_t bus_i2c[BSP_I2C_BUS_COUNT]
All i2c busses.
#define I2C_STD_TIMEOUT_MS
#define BSP_I2C_BUS0_CTRL
On this controller.
I2C Init structure definition.
Output type : Open Drain.
#define BSP_I2C_BUS0_GPIO_SDA
SDA on this pin.
ssize_t write(int fd, const void *buf, size_t count)
timeout_t time_set_timeout_ms(uint32_t ms)
Set an obscure time at least ms milliseconds in the future.
void delay_wait_us(uint32_t us)
Wait for at least that time.
status_e gpio_setup_list(const struct gpio_t gpio[], size_t len)
Setup an array of gpio.
status_e gpio_setup(const struct gpio_t *gpio)
Setup a gpio.
#define I2C_EVENT_MASTER_BYTE_RECEIVED
Communication events.