ARMEBS4  revision-26.06.2015
stm32_i2c.c
Go to the documentation of this file.
1 /**
2  * \file heivs/stm32_i2c.c
3  * \brief i2c bus
4  * \author marc dot pignat at hevs dot ch
5  */
6 
7 /**
8  * FIXME : if a device NACK, this will trigger the timeout error
9  */
10 #include "heivs/stm32_i2c.h"
11 #include "heivs/time.h"
12 #include "heivs/bsp.h"
13 #include "stm32/stm32f4xx_i2c.h"
14 #include "stm32/stm32f4xx_rcc.h"
15 #include "heivs/delay.h"
16 
17 #define I2C_STD_TIMEOUT_MS (5)
18 
19 /**
20  * \brief Workaround i2c devices without reset pins
21  *
22  * Force-reset any device which is stuck in an i2c transfer
23  */
24 static void workaround_reset_i2c_devices(const struct gpio_t *pins)
25 {
26  int i;
27  struct gpio_t gpio_scl = pins[0];
28  struct gpio_t gpio_sda = pins[1];
31  gpio_setup(&gpio_scl);
32  gpio_setup(&gpio_sda);
33 
34  for (i = 0 ; i < 9 ; i++)
35  {
36  gpio_set(&gpio_scl, 0);
37  delay_wait_us(5);
38  gpio_set(&gpio_scl, 1);
39  delay_wait_us(5);
40  }
41 }
42 
43 static status_e init(const struct heivs_bus_t *bus)
44 {
45  I2C_InitTypeDef I2C_InitStructure;
46  const struct i2c_bus_private_t *i2c = bus->priv;
47 
49  gpio_setup_list(i2c->gpios, 2);
50 
51  switch ((uint32_t)i2c->ctrl)
52  {
53  case (uint32_t)I2C1:
54  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
55  break;
56 
57  case (uint32_t)I2C2:
58  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
59  break;
60 
61  case (uint32_t)I2C3:
62  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C3, ENABLE);
63  break;
64 
65  default:
66  case 0:
67  return ERROR_BAD_PARAM;
68  }
69 
70  RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
71  RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
72 
73  /* Initialize the i2c controller */
74  I2C_DeInit(i2c->ctrl);
75 
76  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
77  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
78  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
79  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
80  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
81  I2C_InitStructure.I2C_ClockSpeed = 100*1000;
82 
83  /* Enable the I2C peripheral */
84  I2C_Init(i2c->ctrl, &I2C_InitStructure);
85  I2C_Cmd(i2c->ctrl, ENABLE);
86 
87  return NO_ERROR;
88 }
89 
90 static status_e suspend(const struct heivs_bus_t *bus)
91 {
92  (void)bus;
93  return ERROR_NOT_YET_IMPLEMENTED;
94 }
95 
96 static status_e i2c_start_re(const struct i2c_bus_private_t *i2c, uint8_t address, uint8_t direction, uint32_t re)
97 {
98  timeout_t timeout;
99 
100  if (!re)
101  {
103  while (I2C_GetFlagStatus(i2c->ctrl, I2C_FLAG_BUSY))
104  {
105  if (time_elapsed(timeout))
106  {
107  return ERROR_TIMEOUT;
108  }
109  }
110  }
111 
112  I2C_GenerateSTART(i2c->ctrl, ENABLE);
114  while (!I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_MODE_SELECT))
115  {
116  if (time_elapsed(timeout))
117  {
118  return ERROR_TIMEOUT;
119  }
120  }
121 
122  I2C_Send7bitAddress(i2c->ctrl, address << 1, direction);
124  if (direction == I2C_Direction_Transmitter)
125  {
126  while(!I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
127  {
128  if (time_elapsed(timeout))
129  {
130  return ERROR_TIMEOUT;
131  }
132  }
133  }
134  else
135  {
136  while(!I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
137  {
138  if (time_elapsed(timeout))
139  {
140  return ERROR_TIMEOUT;
141  }
142  }
143  }
144 
145  return NO_ERROR;
146 }
147 
148 static status_e i2c_restart(const struct i2c_bus_private_t *i2c, uint8_t address, uint8_t direction)
149 {
150  return i2c_start_re(i2c, address, direction, 1);
151 }
152 
153 static status_e i2c_start(const struct i2c_bus_private_t *i2c, uint8_t address, uint8_t direction)
154 {
155  return i2c_start_re(i2c, address, direction, 0);
156 }
157 
158 static status_e i2c_write_one(const struct i2c_bus_private_t *i2c, uint8_t data)
159 {
160  timeout_t timeout;
161 
162  I2C_SendData(i2c->ctrl, data);
164  while(!I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
165  {
166  if (time_elapsed(timeout))
167  {
168  return ERROR_TIMEOUT;
169  }
170  }
171 
172  return NO_ERROR;
173 }
174 
175 static status_e i2c_read_one_ack(const struct i2c_bus_private_t *i2c, uint8_t *data)
176 {
177  timeout_t timeout;
178 
179  I2C_AcknowledgeConfig(i2c->ctrl, ENABLE);
181  while( !I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_BYTE_RECEIVED) )
182  {
183  if (time_elapsed(timeout))
184  {
185  return ERROR_TIMEOUT;
186  }
187  }
188 
189  *data = I2C_ReceiveData(i2c->ctrl);
190 
191  return NO_ERROR;
192 }
193 
194 static status_e i2c_read_one_nack(const struct i2c_bus_private_t *i2c, uint8_t *data)
195 {
196  timeout_t timeout;
197 
198  I2C_AcknowledgeConfig(i2c->ctrl, DISABLE);
200  while( !I2C_CheckEvent(i2c->ctrl, I2C_EVENT_MASTER_BYTE_RECEIVED) )
201  {
202  if (time_elapsed(timeout))
203  {
204  return ERROR_TIMEOUT;
205  }
206  }
207 
208  *data = I2C_ReceiveData(i2c->ctrl);
209 
210  return NO_ERROR;
211 }
212 
213 static void i2c_stop(const struct i2c_bus_private_t *i2c)
214 {
215  I2C_GenerateSTOP(i2c->ctrl, ENABLE);
216 }
217 
218 static status_e _read(const struct heivs_bus_t *bus, uint32_t address, uint8_t *data, size_t len, size_t *rlen)
219 {
220  const struct i2c_bus_private_t *i2c = bus->priv;
221  status_e status;
222  size_t i;
223 
224  *rlen = 0;
225 
226  status = i2c_start(i2c, address, I2C_Direction_Receiver);
227  if (status != NO_ERROR)
228  {
229  return status;
230  }
231 
232  if (len > 1)
233  {
234  for (i = 0 ; i < len - 1 ; i++)
235  {
236  status = i2c_read_one_ack(i2c, &data[i]);
237  if (status != NO_ERROR)
238  {
239  status = ERROR_TIMEOUT;
240  goto error;
241  }
242  *rlen = *rlen+1;
243  }
244  }
245  else
246  {
247  i = 0;
248  }
249 
250  status = i2c_read_one_nack(i2c, &data[i]);
251  if (status != NO_ERROR)
252  {
253  status = ERROR_TIMEOUT;
254  goto error;
255  }
256  *rlen = *rlen+1;
257 
258 error:
259  i2c_stop(i2c);
260  return status;
261 }
262 
263 static status_e _write(const struct heivs_bus_t *bus, uint32_t address, const uint8_t *data, size_t len)
264 {
265  const struct i2c_bus_private_t *i2c = bus->priv;
266  status_e status;
267  size_t i;
268 
269  status = i2c_start(i2c, address, I2C_Direction_Transmitter);
270  if (status != NO_ERROR)
271  {
272  return status;
273  }
274 
275  for (i = 0 ; i < len ; i++)
276  {
277  status = i2c_write_one(i2c, data[i]);
278  if (status != NO_ERROR)
279  {
280  goto error;
281  }
282  }
283 
284 error:
285  i2c_stop(i2c);
286  return status;
287 }
288 
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)
290 {
291  const struct i2c_bus_private_t *i2c = bus->priv;
292  status_e status;
293  size_t i;
294 
295  *rlen = 0;
296 
297  status = i2c_start(i2c, address, I2C_Direction_Transmitter);
298  if (status != NO_ERROR)
299  {
300  return status;
301  }
302 
303  for (i = 0 ; i < src_len ; i++)
304  {
305  status = i2c_write_one(i2c, src[i]);
306  if (status != NO_ERROR)
307  {
308  goto error;
309  }
310  }
311 
312  status = i2c_restart(i2c, address, I2C_Direction_Receiver);
313  if (status != NO_ERROR)
314  {
315  return status;
316  }
317 
318  if (dst_len > 1)
319  {
320  for (i = 0 ; i < dst_len - 1 ; i++)
321  {
322  status = i2c_read_one_ack(i2c, &dst[i]);
323  if (status != NO_ERROR)
324  {
325  goto error;
326  }
327  *rlen = *rlen+1;
328  }
329  }
330  else
331  {
332  i = 0;
333  }
334 
335  status = i2c_read_one_nack(i2c, &dst[i]);
336  if (status != NO_ERROR)
337  {
338  status = ERROR_TIMEOUT;
339  goto error;
340  }
341  *rlen = *rlen+1;
342 
343 error:
344  i2c_stop(i2c);
345  return status;
346 }
347 
348 static status_e read(const struct heivs_bus_t *bus, uint32_t address, uint8_t *data, size_t len, size_t *rlen)
349 {
350  status_e status;
351 
352  status = _read(bus, address, data, len, rlen);
353  if (status != NO_ERROR)
354  {
355  init(bus);
356  }
357 
358  return status;
359 }
360 
361 static status_e write(const struct heivs_bus_t *bus, uint32_t address, const uint8_t *data, size_t len)
362 {
363  status_e status;
364 
365  status = _write(bus, address, data, len);
366  if (status != NO_ERROR)
367  {
368  init(bus);
369  }
370 
371  return status;
372 }
373 
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)
375 {
376  status_e status;
377 
378  status = _writeread(bus, address, src, src_len, dst, dst_len, rlen);
379  if (status != NO_ERROR)
380  {
381  init(bus);
382  }
383 
384  return status;
385 }
386 
387 static const struct i2c_bus_private_t bus_priv[BSP_I2C_BUS_COUNT] =
388 {
389 #if BSP_I2C_BUS_COUNT > 0
390 
391  {
393  .gpios =
394  {
397  },
398  },
399 #endif
400 #if BSP_I2C_BUS_COUNT > 1
401  {
402  .ctrl = BSP_I2C_BUS1_CTRL,
403  .gpios =
404  {
407  },
408  },
409 #endif
410 #if BSP_I2C_BUS_COUNT > 2
411  {
412  .ctrl = BSP_I2C_BUS2_CTRL,
413  .gpios =
414  {
415  BSP_I2C_BUS2_GPIO_SCL,
416  BSP_I2C_BUS2_GPIO_SDA,
417  },
418  },
419 #endif
420 };
421 
422 static struct heivs_bus_var_t bus_var[BSP_I2C_BUS_COUNT];
423 
425 {
426 #if BSP_I2C_BUS_COUNT > 0
427  #ifndef BSP_I2C_BUS0_NAME
428  #define BSP_I2C_BUS0_NAME "bus_i2c[0]"
429  #endif
430  {
431  .name = BSP_I2C_BUS0_NAME,
432  .priv = &bus_priv[0],
433  .var = &bus_var[0],
434 
435  ._init = init,
436  ._read = read,
437  ._write = write,
438  ._suspend = suspend,
439  ._writeread = writeread,
440  },
441 #endif
442 #if BSP_I2C_BUS_COUNT > 1
443  #ifndef BSP_I2C_BUS1_NAME
444  #define BSP_I2C_BUS1_NAME "bus_i2c[1]"
445  #endif
446  {
447  .name = BSP_I2C_BUS1_NAME,
448  .priv = &bus_priv[1],
449  .var = &bus_var[1],
450 
451  ._init = init,
452  ._read = read,
453  ._write = write,
454  ._suspend = suspend,
455  ._writeread = writeread,
456  },
457 #endif
458 #if BSP_I2C_BUS_COUNT > 2
459  #ifndef BSP_I2C_BUS2_NAME
460  #define BSP_I2C_BUS2_NAME "bus_i2c[2]"
461  #endif
462  {
463  .name = BSP_I2C_BUS2_NAME,
464  .priv = &bus_priv[2],
465  .var = &bus_var[2],
466 
467  ._init = init,
468  ._read = read,
469  ._write = write,
470  ._suspend = suspend,
471  ._writeread = writeread,
472  },
473 #endif
474 #if BSP_I2C_BUS_COUNT > 3
475  #error this CPU has no 4 I2c buses
476 #endif
477 };
478 
This file contains all the functions prototypes for the RCC firmware library.
No comment.
Definition: error.h:64
uint16_t I2C_Ack
Definition: stm32f4xx_i2c.h:62
Bus handler.
Definition: bus.h:92
const char * name
Definition: bus.h:102
const void * priv
Definition: bus.h:107
BSP - Board Support Package.
#define BSP_I2C_BUS1_CTRL
On this controller.
Definition: bsp_armebs4.h:34
#define BSP_I2C_BUS1_GPIO_SDA
SDA on this pin.
Definition: bsp_armebs4.h:36
static void workaround_reset_i2c_devices(const struct gpio_t *pins)
Workaround i2c devices without reset pins.
Definition: stm32_i2c.c:24
Output (default 1)
Definition: stm32_gpio.h:53
ssize_t read(int fd, void *buf, size_t count)
uint16_t I2C_AcknowledgedAddress
Definition: stm32f4xx_i2c.h:65
simple time abstraction
#define I2C_DutyCycle_2
Definition: stm32f4xx_i2c.h:98
#define I2C_EVENT_MASTER_MODE_SELECT
Communication start.
Output speed : 100 MHz.
Definition: stm32_gpio.h:77
Variable part of the bus description.
Definition: bus.h:79
enum gpio_mode_e mode
mode for instance GPIO_INPUT | GPIO_PULLDOWN
Definition: stm32_gpio.h:101
uint16_t I2C_OwnAddress1
Definition: stm32f4xx_i2c.h:59
#define BSP_I2C_BUS0_GPIO_SCL
SCL on this pin.
Definition: bsp_armebs4.h:29
static uint32_t time_elapsed(timeout_t timeout)
Is this time passed?
Definition: time.h:71
static void gpio_set(const struct gpio_t *gpio, uint32_t value)
Set a gpio.
Definition: stm32_gpio.h:260
#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
Address Acknowledge.
I2C_TypeDef * ctrl
Bus controller.
Definition: stm32_i2c.h:23
const struct gpio_t gpios[2]
Gpios.
Definition: stm32_i2c.h:24
#define BSP_I2C_BUS_COUNT
Number of i2c buses.
Definition: bsp_armebs4.h:25
#define BSP_I2C_BUS1_GPIO_SCL
SCL on this pin.
Definition: bsp_armebs4.h:35
This file contains all the functions prototypes for the I2C firmware library.
Parameter unsupported.
Definition: error.h:56
GPIO control structure.
Definition: stm32_gpio.h:96
const struct heivs_bus_t bus_i2c[BSP_I2C_BUS_COUNT]
All i2c busses.
Definition: stm32_i2c.c:424
#define I2C_STD_TIMEOUT_MS
Definition: stm32_i2c.c:17
uint32_t I2C_ClockSpeed
Definition: stm32f4xx_i2c.h:50
simple delays
#define BSP_I2C_BUS0_CTRL
On this controller.
Definition: bsp_armebs4.h:28
i2c specific data
Definition: stm32_i2c.h:21
I2C Init structure definition.
Definition: stm32f4xx_i2c.h:48
Output type : Open Drain.
Definition: stm32_gpio.h:65
Timeout structure.
Definition: time.h:34
#define BSP_I2C_BUS0_GPIO_SDA
SDA on this pin.
Definition: bsp_armebs4.h:30
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.
Definition: time.c:15
void delay_wait_us(uint32_t us)
Wait for at least that time.
Definition: delay.c:41
status_e gpio_setup_list(const struct gpio_t gpio[], size_t len)
Setup an array of gpio.
Definition: stm32_gpio.c:47
status_e gpio_setup(const struct gpio_t *gpio)
Setup a gpio.
Definition: stm32_gpio.c:9
status_e
Known errors.
Definition: error.h:21
No error.
Definition: error.h:28
uint16_t I2C_DutyCycle
Definition: stm32f4xx_i2c.h:56
uint16_t I2C_Mode
Definition: stm32f4xx_i2c.h:53
i2c bus
#define I2C_EVENT_MASTER_BYTE_RECEIVED
Communication events.