fix for mbed lib issue 3 (i2c problem) see also https://mbed.org/users/mbed_official/code/mbed/issues/3 affected implementations: LPC812, LPC11U24, LPC1768, LPC2368, LPC4088
Fork of mbed-src by
Revision 13:bd9ff402dd42, committed 2013-08-05
- Comitter:
- Shikaneo
- Date:
- Mon Aug 05 02:27:27 2013 +0000
- Parent:
- 12:5fa2273de5db
- Commit message:
- equipped timeout
Changed in this revision
--- a/hal/i2c_api.h Wed Jul 24 11:11:21 2013 +0100 +++ b/hal/i2c_api.h Mon Aug 05 02:27:27 2013 +0000 @@ -29,7 +29,7 @@ void i2c_init (i2c_t *obj, PinName sda, PinName scl); void i2c_frequency (i2c_t *obj, int hz); int i2c_start (i2c_t *obj); -void i2c_stop (i2c_t *obj); +int i2c_stop (i2c_t *obj); int i2c_read (i2c_t *obj, int address, char *data, int length, int stop); int i2c_write (i2c_t *obj, int address, const char *data, int length, int stop); void i2c_reset (i2c_t *obj);
--- a/vendor/Freescale/KL25Z/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/Freescale/KL25Z/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -96,7 +96,7 @@ return 0; } -void i2c_stop(i2c_t *obj) { +int i2c_stop(i2c_t *obj) { volatile uint32_t n = 0; obj->i2c->C1 &= ~I2C_C1_MST_MASK; obj->i2c->C1 &= ~I2C_C1_TX_MASK; @@ -107,6 +107,7 @@ // code provided with the freedom board for (n = 0; n < 100; n++) __NOP(); first_read = 1; + return 0; } static int timeout_status_poll(i2c_t *obj, uint32_t mask) {
--- a/vendor/NXP/LPC11U24/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/NXP/LPC11U24/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -124,13 +124,18 @@ return status; } -inline void i2c_stop(i2c_t *obj) { +inline int i2c_stop(i2c_t *obj) { // write the stop bit i2c_conset(obj, 0, 1, 0, 0); i2c_clear_SI(obj); // wait for STO bit to reset - while(I2C_CONSET(obj) & (1 << 4)); + int timeout = 0; + while(I2C_CONSET(obj) & (1 << 4)){ + timeout++; + if(timeout > 10000) return -1; + } + return 0; }
--- a/vendor/NXP/LPC1768/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/NXP/LPC1768/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -133,13 +133,18 @@ return status; } -inline void i2c_stop(i2c_t *obj) { +inline int i2c_stop(i2c_t *obj) { // write the stop bit i2c_conset(obj, 0, 1, 0, 0); i2c_clear_SI(obj); // wait for STO bit to reset - while(I2C_CONSET(obj) & (1 << 4)); + int timeout = 0; + while(I2C_CONSET(obj) & (1 << 4)){ + timeout++; + if(timeout > 10000) return -1; + } + return 0; } static inline int i2c_do_write(i2c_t *obj, int value, uint8_t addr) {
--- a/vendor/NXP/LPC2368/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/NXP/LPC2368/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -133,13 +133,18 @@ return status; } -inline void i2c_stop(i2c_t *obj) { +inline int i2c_stop(i2c_t *obj) { // write the stop bit i2c_conset(obj, 0, 1, 0, 0); i2c_clear_SI(obj); // wait for STO bit to reset - while (I2C_CONSET(obj) & (1 << 4)); + int timeout = 0; + while (I2C_CONSET(obj) & (1 << 4)){ + timeout++; + if(timeout > 10000) return -1; + } + return 0; } static inline int i2c_do_write(i2c_t *obj, int value, uint8_t addr) {
--- a/vendor/NXP/LPC4088/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/NXP/LPC4088/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -144,13 +144,18 @@ return status; } -inline void i2c_stop(i2c_t *obj) { +inline int i2c_stop(i2c_t *obj) { // write the stop bit i2c_conset(obj, 0, 1, 0, 0); i2c_clear_SI(obj); // wait for STO bit to reset - while(I2C_CONSET(obj) & (1 << 4)); + int timeout = 0; + while(I2C_CONSET(obj) & (1 << 4)){ + timeout++; + if(timeout > 10000) return -1; + } + return 0; }
--- a/vendor/NXP/LPC812/hal/i2c_api.c Wed Jul 24 11:11:21 2013 +0100 +++ b/vendor/NXP/LPC812/hal/i2c_api.c Mon Aug 05 02:27:27 2013 +0000 @@ -87,9 +87,13 @@ return status; } -inline void i2c_stop(i2c_t *obj) { +inline int i2c_stop(i2c_t *obj) { obj->i2c->MSTCTL = (1 << 2) | (1 << 0); - while ((obj->i2c->STAT & ((1 << 0) | (7 << 1))) != ((1 << 0) | (0 << 1))); + while ((obj->i2c->STAT & ((1 << 0) | (7 << 1))) != ((1 << 0) | (0 << 1))){ + timeout++; + if(timeout > 10000) return -1; + } + return 0; }