@@ -261,14 +261,12 @@ void i2c_custom_init(i2c_t *obj, i2c_timing_e timing, uint32_t addressingMode, u
261
261
262
262
handle -> State = HAL_I2C_STATE_RESET ;
263
263
264
- if (master == 0 ) {
265
- HAL_NVIC_SetPriority (obj -> irq , 0 , 1 );
266
- HAL_NVIC_EnableIRQ (obj -> irq );
264
+ HAL_NVIC_SetPriority (obj -> irq , 0 , 1 );
265
+ HAL_NVIC_EnableIRQ (obj -> irq );
267
266
#ifdef STM32F1xx
268
- HAL_NVIC_SetPriority (obj -> irqER , 0 , 1 );
269
- HAL_NVIC_EnableIRQ (obj -> irqER );
267
+ HAL_NVIC_SetPriority (obj -> irqER , 0 , 1 );
268
+ HAL_NVIC_EnableIRQ (obj -> irqER );
270
269
#endif
271
- }
272
270
273
271
// Init the I2C
274
272
HAL_I2C_Init (handle );
@@ -341,17 +339,18 @@ i2c_status_e i2c_master_write(i2c_t *obj, uint8_t dev_address,
341
339
342
340
{
343
341
i2c_status_e ret = I2C_ERROR ;
344
- HAL_StatusTypeDef status = HAL_OK ;
345
-
346
- // Check the communication status
347
- status = HAL_I2C_Master_Transmit (& (obj -> handle ), dev_address , data , size , I2C_TIMEOUT_TICK );
342
+ uint32_t tickstart = HAL_GetTick ();
348
343
349
- if (status == HAL_OK )
344
+ if (HAL_I2C_Master_Transmit_IT ( & ( obj -> handle ), dev_address , data , size ) == HAL_OK ){
350
345
ret = I2C_OK ;
351
- else if (status == HAL_TIMEOUT )
352
- ret = I2C_TIMEOUT ;
353
- else
354
- ret = I2C_ERROR ;
346
+ // wait for transfer completion
347
+ while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
348
+ && (ret != I2C_TIMEOUT )){
349
+ if ((HAL_GetTick () - tickstart ) > I2C_TIMEOUT_TICK ) {
350
+ ret = I2C_TIMEOUT ;
351
+ }
352
+ }
353
+ }
355
354
356
355
return ret ;
357
356
}
@@ -385,9 +384,17 @@ void i2c_slave_write_IT(i2c_t *obj, uint8_t *data, uint8_t size)
385
384
i2c_status_e i2c_master_read (i2c_t * obj , uint8_t dev_address , uint8_t * data , uint8_t size )
386
385
{
387
386
i2c_status_e ret = I2C_ERROR ;
387
+ uint32_t tickstart = HAL_GetTick ();
388
388
389
- if (HAL_I2C_Master_Receive (& (obj -> handle ), dev_address , data , size , I2C_TIMEOUT_TICK ) == HAL_OK ) {
389
+ if (HAL_I2C_Master_Receive_IT (& (obj -> handle ), dev_address , data , size ) == HAL_OK ) {
390
390
ret = I2C_OK ;
391
+ // wait for transfer completion
392
+ while ((HAL_I2C_GetState (& (obj -> handle )) != HAL_I2C_STATE_READY )
393
+ && (ret != I2C_TIMEOUT )){
394
+ if ((HAL_GetTick () - tickstart ) > I2C_TIMEOUT_TICK ) {
395
+ ret = I2C_TIMEOUT ;
396
+ }
397
+ }
391
398
}
392
399
393
400
return ret ;
0 commit comments