From 2ec18a06d8731786fac554ea2ba25f138103c8ca Mon Sep 17 00:00:00 2001 From: Sissors Date: Wed, 30 Apr 2014 10:46:23 +0200 Subject: [PATCH 1/2] Fixed Freescale byte reads (minus k64) See: https://mbed.org/questions/3181/Inconsistent-results-when-attempting-wri/ for the issue. Now every byte read is treated equal and ACKs/NACKs are correctly generated --- .../TARGET_Freescale/TARGET_K20D5M/i2c_api.c | 29 ++++--------------- .../TARGET_Freescale/TARGET_KLXX/i2c_api.c | 27 ++++------------- 2 files changed, 11 insertions(+), 45 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_K20D5M/i2c_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_K20D5M/i2c_api.c index 4cbdb2d42f..93b77b2a40 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_K20D5M/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_K20D5M/i2c_api.c @@ -48,8 +48,6 @@ static const uint16_t ICR[0x40] = { 2304, 2560, 3072, 3840 }; -static uint8_t first_read; - void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the I2C to use @@ -70,8 +68,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) { pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); - - first_read = 1; } int i2c_start(i2c_t *obj) { @@ -83,7 +79,6 @@ int i2c_start(i2c_t *obj) { obj->i2c->C1 |= I2C_C1_MST_MASK; obj->i2c->C1 |= I2C_C1_TX_MASK; } - first_read = 1; return 0; } @@ -98,7 +93,6 @@ int i2c_stop(i2c_t *obj) { // code provided with the freedom board for (n = 0; n < 100; n++) __NOP(); - first_read = 1; return 0; } @@ -279,30 +273,19 @@ void i2c_reset(i2c_t *obj) { int i2c_byte_read(i2c_t *obj, int last) { char data; - + // set rx mode obj->i2c->C1 &= ~I2C_C1_TX_MASK; - - if(first_read) { - // first dummy read - i2c_do_read(obj, &data, 0); - first_read = 0; - } - - if (last) { - // set tx mode - obj->i2c->C1 |= I2C_C1_TX_MASK; - return obj->i2c->D; - } - + + // Setup read i2c_do_read(obj, &data, last); - return data; + // set tx mode + obj->i2c->C1 |= I2C_C1_TX_MASK; + return obj->i2c->D; } int i2c_byte_write(i2c_t *obj, int data) { - first_read = 1; - // set tx mode obj->i2c->C1 |= I2C_C1_TX_MASK; diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/i2c_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/i2c_api.c index add00a6d7c..a9f3743a07 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KLXX/i2c_api.c @@ -37,8 +37,6 @@ static const uint16_t ICR[0x40] = { 2304, 2560, 3072, 3840 }; -static uint8_t first_read; - void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // determine the I2C to use @@ -63,8 +61,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) { pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); - - first_read = 1; } int i2c_start(i2c_t *obj) { @@ -84,7 +80,6 @@ int i2c_start(i2c_t *obj) { obj->i2c->C1 |= I2C_C1_MST_MASK; obj->i2c->C1 |= I2C_C1_TX_MASK; } - first_read = 1; return 0; } @@ -98,7 +93,6 @@ int i2c_stop(i2c_t *obj) { // This wait is also included on the samples // code provided with the freedom board for (n = 0; n < 100; n++) __NOP(); - first_read = 1; return 0; } @@ -284,26 +278,15 @@ int i2c_byte_read(i2c_t *obj, int last) { // set rx mode obj->i2c->C1 &= ~I2C_C1_TX_MASK; - if(first_read) { - // first dummy read - i2c_do_read(obj, &data, 0); - first_read = 0; - } - - if (last) { - // set tx mode - obj->i2c->C1 |= I2C_C1_TX_MASK; - return obj->i2c->D; - } - + // Setup read i2c_do_read(obj, &data, last); - - return data; + + // set tx mode + obj->i2c->C1 |= I2C_C1_TX_MASK; + return obj->i2c->D; } int i2c_byte_write(i2c_t *obj, int data) { - first_read = 1; - // set tx mode obj->i2c->C1 |= I2C_C1_TX_MASK; From 127eba40bd8bf03743a7d09da2d2738df579554f Mon Sep 17 00:00:00 2001 From: Sissors Date: Wed, 30 Apr 2014 14:50:02 +0200 Subject: [PATCH 2/2] I2C changes for the K64F Fixed also here single byte read (probably) --- .../TARGET_KSDK_MCUS/TARGET_K64F/i2c_api.c | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KSDK_MCUS/TARGET_K64F/i2c_api.c b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KSDK_MCUS/TARGET_K64F/i2c_api.c index b505813ec7..4dc01413cf 100644 --- a/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KSDK_MCUS/TARGET_K64F/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KSDK_MCUS/TARGET_K64F/i2c_api.c @@ -44,8 +44,6 @@ static const PinMap PinMap_I2C_SCL[] = { {NC , NC , 0} }; -static uint8_t first_read; - void i2c_init(i2c_t *obj, PinName sda, PinName scl) { uint32_t i2c_sda = pinmap_peripheral(sda, PinMap_I2C_SDA); uint32_t i2c_scl = pinmap_peripheral(scl, PinMap_I2C_SCL); @@ -60,12 +58,10 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) { pinmap_pinout(sda, PinMap_I2C_SDA); pinmap_pinout(scl, PinMap_I2C_SCL); - first_read = 1; } int i2c_start(i2c_t *obj) { i2c_hal_send_start(obj->instance); - first_read = 1; return 0; } @@ -78,7 +74,6 @@ int i2c_stop(i2c_t *obj) { // This wait is also included on the samples // code provided with the freedom board for (n = 0; n < 100; n++) __NOP(); - first_read = 1; return 0; } @@ -229,26 +224,15 @@ int i2c_byte_read(i2c_t *obj, int last) { // set rx mode i2c_hal_set_direction(obj->instance, kI2CReceive); - if(first_read) { - // first dummy read - i2c_do_read(obj, &data, 0); - first_read = 0; - } - - if (last) { - // set tx mode - i2c_hal_set_direction(obj->instance, kI2CTransmit); - return i2c_hal_read(obj->instance); - } - + // Setup read i2c_do_read(obj, &data, last); - return data; + // set tx mode + i2c_hal_set_direction(obj->instance, kI2CTransmit); + return i2c_hal_read(obj->instance); } int i2c_byte_write(i2c_t *obj, int data) { - first_read = 1; - // set tx mode i2c_hal_set_direction(obj->instance, kI2CTransmit);