47
47
/** @addtogroup STM32F4xx_System_Private_Includes
48
48
* @{
49
49
*/
50
-
51
50
#include "stm32_def.h"
52
51
#include "hw_config.h"
53
52
#include "twi.h"
53
+ #include "PinAF_STM32F1.h"
54
54
55
55
/**
56
56
* @}
@@ -168,6 +168,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
168
168
__HAL_RCC_I2C1_FORCE_RESET ();
169
169
__HAL_RCC_I2C1_RELEASE_RESET ();
170
170
obj -> irq = I2C1_EV_IRQn ;
171
+ #ifdef STM32F1xx
172
+ obj -> irqER = I2C1_ER_IRQn ;
173
+ #endif
171
174
i2c_handles [0 ] = handle ;
172
175
}
173
176
#endif
@@ -181,6 +184,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
181
184
obj -> irq = I2C2_IRQn ;
182
185
#else
183
186
obj -> irq = I2C2_EV_IRQn ;
187
+ #ifdef STM32F1xx
188
+ obj -> irqER = I2C2_ER_IRQn ;
189
+ #endif
184
190
#endif
185
191
i2c_handles [1 ] = handle ;
186
192
}
@@ -212,7 +218,11 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
212
218
GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> scl ,PinMap_I2C_SCL ));
213
219
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
214
220
GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> scl ,PinMap_I2C_SCL ));
221
+ #ifdef STM32F1xx
222
+ pin_SetF1AFPin (STM_PIN_AFNUM (pinmap_function (obj -> scl ,PinMap_I2C_SCL )));
223
+ #else
215
224
GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> scl ,PinMap_I2C_SCL ));
225
+ #endif /* STM32F1xx */
216
226
HAL_GPIO_Init (port , & GPIO_InitStruct );
217
227
218
228
//SDA
@@ -221,7 +231,11 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
221
231
GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> sda ,PinMap_I2C_SDA ));
222
232
GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
223
233
GPIO_InitStruct .Pull = STM_PIN_PUPD (pinmap_function (obj -> sda ,PinMap_I2C_SDA ));
234
+ #ifdef STM32F1xx
235
+ pin_SetF1AFPin (STM_PIN_AFNUM (pinmap_function (obj -> sda ,PinMap_I2C_SDA )));
236
+ #else
224
237
GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> sda ,PinMap_I2C_SDA ));
238
+ #endif /* STM32F1xx */
225
239
HAL_GPIO_Init (port , & GPIO_InitStruct );
226
240
227
241
handle -> Instance = obj -> i2c ;
@@ -242,6 +256,10 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
242
256
if (master == 0 ) {
243
257
HAL_NVIC_SetPriority (obj -> irq , 0 , 1 );
244
258
HAL_NVIC_EnableIRQ (obj -> irq );
259
+ #ifdef STM32F1xx
260
+ HAL_NVIC_SetPriority (obj -> irqER , 0 , 1 );
261
+ HAL_NVIC_EnableIRQ (obj -> irqER );
262
+ #endif
245
263
}
246
264
247
265
// Init the I2C
@@ -256,6 +274,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
256
274
void i2c_deinit (i2c_t * obj )
257
275
{
258
276
HAL_NVIC_DisableIRQ (obj -> irq );
277
+ #ifdef STM32F1xx
278
+ HAL_NVIC_DisableIRQ (obj -> irqER );
279
+ #endif
259
280
HAL_I2C_DeInit (& (obj -> handle ));
260
281
}
261
282
@@ -402,8 +423,16 @@ i2c_t *get_i2c_obj(I2C_HandleTypeDef *hi2c){
402
423
*/
403
424
void i2c_attachSlaveRxEvent (i2c_t * obj , void (* function )(uint8_t * , int ) )
404
425
{
426
+ if ((obj == NULL ) || (function == NULL ))
427
+ return ;
428
+
405
429
obj -> i2c_onSlaveReceive = function ;
430
+ #ifdef STM32F1xx
431
+ obj -> i2cTxRxBufferSize = 0 ;
432
+ HAL_I2C_Slave_Receive_IT (& (obj -> handle ), obj -> i2cTxRxBuffer , I2C_TXRX_BUFFER_SIZE );
433
+ #else
406
434
HAL_I2C_EnableListen_IT (& (obj -> handle ));
435
+ #endif
407
436
}
408
437
409
438
/** @brief sets function called before a slave write operation
@@ -413,10 +442,64 @@ void i2c_attachSlaveRxEvent(i2c_t *obj, void (*function)(uint8_t*, int) )
413
442
*/
414
443
void i2c_attachSlaveTxEvent (i2c_t * obj , void (* function )(void ) )
415
444
{
445
+ if ((obj == NULL ) || (function == NULL ))
446
+ return ;
447
+
416
448
obj -> i2c_onSlaveTransmit = function ;
449
+ #ifdef STM32F1xx
450
+ /* Fill i2c buffer with data to transmit otherwize the buffer will be empty
451
+ when master will read the data for the first time */
452
+ obj -> i2cTxRxBufferSize = 0 ;
453
+ obj -> i2c_onSlaveTransmit ();
454
+ HAL_I2C_Slave_Transmit_IT (& (obj -> handle ), obj -> i2cTxRxBuffer , obj -> i2cTxRxBufferSize );
455
+ #else
417
456
HAL_I2C_EnableListen_IT (& (obj -> handle ));
457
+ #endif
458
+ }
459
+
460
+ #ifdef STM32F1xx
461
+
462
+ /** @brief Slave Tx Transfer completed callback.
463
+ * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
464
+ * the configuration information for the specified I2C.
465
+ * @retval None
466
+ */
467
+ void HAL_I2C_SlaveTxCpltCallback (I2C_HandleTypeDef * hi2c )
468
+ {
469
+ i2c_t * obj = get_i2c_obj (hi2c );
470
+
471
+ if (NULL != obj -> i2c_onSlaveTransmit ) {
472
+ // reset buffer size and fill buffer with new data before the next Tx
473
+ obj -> i2cTxRxBufferSize = 0 ;
474
+ obj -> i2c_onSlaveTransmit ();
475
+ HAL_I2C_Slave_Transmit_IT (hi2c , obj -> i2cTxRxBuffer , obj -> i2cTxRxBufferSize );
476
+ }
477
+ }
478
+
479
+ /**
480
+ * @brief Slave Rx Transfer completed callback.
481
+ * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
482
+ * the configuration information for the specified I2C.
483
+ * @retval None
484
+ */
485
+ void HAL_I2C_SlaveRxCpltCallback (I2C_HandleTypeDef * hi2c )
486
+ {
487
+ uint8_t nbData = 0 ;
488
+ i2c_t * obj = get_i2c_obj (hi2c );
489
+
490
+ if (NULL != obj -> i2c_onSlaveReceive ) {
491
+ nbData = I2C_TXRX_BUFFER_SIZE - obj -> handle .XferCount ;
492
+
493
+ if (nbData != 0 ) {
494
+ obj -> i2c_onSlaveReceive (obj -> i2cTxRxBuffer , nbData );
495
+ }
496
+
497
+ HAL_I2C_Slave_Receive_IT (hi2c , obj -> i2cTxRxBuffer , I2C_TXRX_BUFFER_SIZE );
498
+ }
418
499
}
419
500
501
+ #else /* Others */
502
+
420
503
/**
421
504
* @brief Slave Address Match callback.
422
505
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
@@ -469,6 +552,8 @@ void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
469
552
HAL_I2C_EnableListen_IT (hi2c );
470
553
}
471
554
555
+ #endif /* STM32F1xx */
556
+
472
557
/**
473
558
* @brief I2C error callback.
474
559
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
@@ -477,7 +562,11 @@ void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
477
562
*/
478
563
void HAL_I2C_ErrorCallback (I2C_HandleTypeDef * hi2c )
479
564
{
565
+ #ifdef STM32F1xx
566
+ UNUSED (hi2c );
567
+ #else
480
568
HAL_I2C_EnableListen_IT (hi2c );
569
+ #endif
481
570
}
482
571
483
572
/**
0 commit comments