mirror of https://github.com/ARMmbed/mbed-os.git
parent
211db10aeb
commit
c59c1cb29d
|
@ -79,6 +79,9 @@ static I2C_HandleTypeDef *i2c_handles[I2C_NUM];
|
||||||
*/
|
*/
|
||||||
#define FLAG_TIMEOUT ((int)0x1000)
|
#define FLAG_TIMEOUT ((int)0x1000)
|
||||||
|
|
||||||
|
/* Declare i2c_init_internal to be used in this file */
|
||||||
|
void i2c_init_internal(i2c_t *obj, PinName sda, PinName scl);
|
||||||
|
|
||||||
/* GENERIC INIT and HELPERS FUNCTIONS */
|
/* GENERIC INIT and HELPERS FUNCTIONS */
|
||||||
|
|
||||||
#if defined(I2C1_BASE)
|
#if defined(I2C1_BASE)
|
||||||
|
@ -260,7 +263,12 @@ void i2c_sw_reset(i2c_t *obj)
|
||||||
|
|
||||||
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
|
||||||
{
|
{
|
||||||
|
memset(obj, 0, sizeof(*obj));
|
||||||
|
i2c_init_internal(obj, sda, scl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void i2c_init_internal(i2c_t *obj, PinName sda, PinName scl)
|
||||||
|
{
|
||||||
struct i2c_s *obj_s = I2C_S(obj);
|
struct i2c_s *obj_s = I2C_S(obj);
|
||||||
|
|
||||||
// Determine the I2C to use
|
// Determine the I2C to use
|
||||||
|
@ -454,7 +462,7 @@ void i2c_reset(i2c_t *obj)
|
||||||
/* As recommended in i2c_api.h, mainly send stop */
|
/* As recommended in i2c_api.h, mainly send stop */
|
||||||
i2c_stop(obj);
|
i2c_stop(obj);
|
||||||
/* then re-init */
|
/* then re-init */
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -508,7 +516,7 @@ int i2c_stop(i2c_t *obj)
|
||||||
* re-init HAL state
|
* re-init HAL state
|
||||||
*/
|
*/
|
||||||
if (obj_s->XferOperation != I2C_FIRST_AND_LAST_FRAME) {
|
if (obj_s->XferOperation != I2C_FIRST_AND_LAST_FRAME) {
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -584,7 +592,7 @@ int i2c_stop(i2c_t *obj)
|
||||||
#if DEVICE_I2CSLAVE
|
#if DEVICE_I2CSLAVE
|
||||||
if (obj_s->slave) {
|
if (obj_s->slave) {
|
||||||
/* re-init slave when stop is requested */
|
/* re-init slave when stop is requested */
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -627,7 +635,7 @@ int i2c_stop(i2c_t *obj)
|
||||||
/* In case of mixed usage of the APIs (unitary + SYNC)
|
/* In case of mixed usage of the APIs (unitary + SYNC)
|
||||||
* re-init HAL state */
|
* re-init HAL state */
|
||||||
if (obj_s->XferOperation != I2C_FIRST_AND_LAST_FRAME) {
|
if (obj_s->XferOperation != I2C_FIRST_AND_LAST_FRAME) {
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -791,7 +799,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
|
||||||
if ((timeout == 0) || (obj_s->event != I2C_EVENT_TRANSFER_COMPLETE)) {
|
if ((timeout == 0) || (obj_s->event != I2C_EVENT_TRANSFER_COMPLETE)) {
|
||||||
DEBUG_PRINTF(" TIMEOUT or error in i2c_read\r\n");
|
DEBUG_PRINTF(" TIMEOUT or error in i2c_read\r\n");
|
||||||
/* re-init IP to try and get back in a working state */
|
/* re-init IP to try and get back in a working state */
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
} else {
|
} else {
|
||||||
count = length;
|
count = length;
|
||||||
}
|
}
|
||||||
|
@ -845,7 +853,7 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop)
|
||||||
if ((timeout == 0) || (obj_s->event != I2C_EVENT_TRANSFER_COMPLETE)) {
|
if ((timeout == 0) || (obj_s->event != I2C_EVENT_TRANSFER_COMPLETE)) {
|
||||||
DEBUG_PRINTF(" TIMEOUT or error in i2c_write\r\n");
|
DEBUG_PRINTF(" TIMEOUT or error in i2c_write\r\n");
|
||||||
/* re-init IP to try and get back in a working state */
|
/* re-init IP to try and get back in a working state */
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
} else {
|
} else {
|
||||||
count = length;
|
count = length;
|
||||||
}
|
}
|
||||||
|
@ -907,7 +915,7 @@ void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
|
||||||
DEBUG_PRINTF("HAL_I2C_ErrorCallback:%d, index=%d\r\n", (int) hi2c->ErrorCode, obj_s->index);
|
DEBUG_PRINTF("HAL_I2C_ErrorCallback:%d, index=%d\r\n", (int) hi2c->ErrorCode, obj_s->index);
|
||||||
|
|
||||||
/* re-init IP to try and get back in a working state */
|
/* re-init IP to try and get back in a working state */
|
||||||
i2c_init(obj, obj_s->sda, obj_s->scl);
|
i2c_init_internal(obj, obj_s->sda, obj_s->scl);
|
||||||
|
|
||||||
#if DEVICE_I2CSLAVE
|
#if DEVICE_I2CSLAVE
|
||||||
/* restore slave address */
|
/* restore slave address */
|
||||||
|
|
Loading…
Reference in New Issue