4747/** @addtogroup STM32F4xx_System_Private_Includes
4848 * @{
4949 */
50-
5150#include "stm32_def.h"
5251#include "hw_config.h"
5352#include "twi.h"
53+ #include "PinAF_STM32F1.h"
5454
5555/**
5656 * @}
@@ -168,6 +168,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
168168 __HAL_RCC_I2C1_FORCE_RESET ();
169169 __HAL_RCC_I2C1_RELEASE_RESET ();
170170 obj -> irq = I2C1_EV_IRQn ;
171+ #ifdef STM32F1xx
172+ obj -> irqER = I2C1_ER_IRQn ;
173+ #endif
171174 i2c_handles [0 ] = handle ;
172175 }
173176#endif
@@ -181,6 +184,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
181184 obj -> irq = I2C2_IRQn ;
182185#else
183186 obj -> irq = I2C2_EV_IRQn ;
187+ #ifdef STM32F1xx
188+ obj -> irqER = I2C2_ER_IRQn ;
189+ #endif
184190#endif
185191 i2c_handles [1 ] = handle ;
186192 }
@@ -212,7 +218,11 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
212218 GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> scl ,PinMap_I2C_SCL ));
213219 GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
214220 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
215224 GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> scl ,PinMap_I2C_SCL ));
225+ #endif /* STM32F1xx */
216226 HAL_GPIO_Init (port , & GPIO_InitStruct );
217227
218228 //SDA
@@ -221,7 +231,11 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
221231 GPIO_InitStruct .Mode = STM_PIN_MODE (pinmap_function (obj -> sda ,PinMap_I2C_SDA ));
222232 GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_HIGH ;
223233 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
224237 GPIO_InitStruct .Alternate = STM_PIN_AFNUM (pinmap_function (obj -> sda ,PinMap_I2C_SDA ));
238+ #endif /* STM32F1xx */
225239 HAL_GPIO_Init (port , & GPIO_InitStruct );
226240
227241 handle -> Instance = obj -> i2c ;
@@ -242,6 +256,10 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
242256 if (master == 0 ) {
243257 HAL_NVIC_SetPriority (obj -> irq , 0 , 1 );
244258 HAL_NVIC_EnableIRQ (obj -> irq );
259+ #ifdef STM32F1xx
260+ HAL_NVIC_SetPriority (obj -> irqER , 0 , 1 );
261+ HAL_NVIC_EnableIRQ (obj -> irqER );
262+ #endif
245263 }
246264
247265 // Init the I2C
@@ -256,6 +274,9 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
256274void i2c_deinit (i2c_t * obj )
257275{
258276 HAL_NVIC_DisableIRQ (obj -> irq );
277+ #ifdef STM32F1xx
278+ HAL_NVIC_DisableIRQ (obj -> irqER );
279+ #endif
259280 HAL_I2C_DeInit (& (obj -> handle ));
260281}
261282
@@ -402,8 +423,16 @@ i2c_t *get_i2c_obj(I2C_HandleTypeDef *hi2c){
402423 */
403424void i2c_attachSlaveRxEvent (i2c_t * obj , void (* function )(uint8_t * , int ) )
404425{
426+ if ((obj == NULL ) || (function == NULL ))
427+ return ;
428+
405429 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
406434 HAL_I2C_EnableListen_IT (& (obj -> handle ));
435+ #endif
407436}
408437
409438/** @brief sets function called before a slave write operation
@@ -413,10 +442,64 @@ void i2c_attachSlaveRxEvent(i2c_t *obj, void (*function)(uint8_t*, int) )
413442 */
414443void i2c_attachSlaveTxEvent (i2c_t * obj , void (* function )(void ) )
415444{
445+ if ((obj == NULL ) || (function == NULL ))
446+ return ;
447+
416448 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
417456 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+ }
418499}
419500
501+ #else /* Others */
502+
420503/**
421504 * @brief Slave Address Match callback.
422505 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
@@ -469,6 +552,8 @@ void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
469552 HAL_I2C_EnableListen_IT (hi2c );
470553}
471554
555+ #endif /* STM32F1xx */
556+
472557/**
473558 * @brief I2C error callback.
474559 * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
@@ -477,7 +562,11 @@ void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c)
477562 */
478563void HAL_I2C_ErrorCallback (I2C_HandleTypeDef * hi2c )
479564{
565+ #ifdef STM32F1xx
566+ UNUSED (hi2c );
567+ #else
480568 HAL_I2C_EnableListen_IT (hi2c );
569+ #endif
481570}
482571
483572/**
0 commit comments