From b13b047a76352903da0271298396391d09f05bf3 Mon Sep 17 00:00:00 2001 From: Masao Hamanaka Date: Wed, 7 Jan 2015 19:10:26 +0900 Subject: [PATCH] Implement a stop condition transmission setting function of I2C. User can specify the sending of STOP condition by this implement. --- .../TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c index d31ae7509a..7232396925 100644 --- a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c @@ -462,16 +462,25 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) { i2c_set_err_noslave(obj); return I2C_ERROR_NO_SLAVE; } - /* RIICnSR2.STOP = 0 */ - REG(SR2.UINT32) &= ~SR2_STOP; - /* RIICnCR2.SP = 1 */ - REG(CR2.UINT32) |= CR2_SP; - /* RIICnDRR read */ - value = REG(DRR.UINT32) & 0xFF; - data[count] = (char)value; - /* RIICnMR3.WAIT = 0 */ - REG(MR3.UINT32) &= ~MR3_WAIT; - (void)i2c_wait_STOP(obj); + /* If not repeated start, send stop. */ + if (stop) { + /* RIICnSR2.STOP = 0 */ + REG(SR2.UINT32) &= ~SR2_STOP; + /* RIICnCR2.SP = 1 */ + REG(CR2.UINT32) |= CR2_SP; + /* RIICnDRR read */ + value = REG(DRR.UINT32) & 0xFF; + data[count] = (char)value; + /* RIICnMR3.WAIT = 0 */ + REG(MR3.UINT32) &= ~MR3_WAIT; + (void)i2c_wait_STOP(obj); + } else { + /* RIICnDRR read */ + value = REG(DRR.UINT32) & 0xFF; + data[count] = (char)value; + /* RIICnMR3.WAIT = 0 */ + REG(MR3.UINT32) &= ~MR3_WAIT; + } i2c_set_NACKF_STOP(obj); return length; @@ -506,8 +515,11 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) { i2c_set_err_noslave(obj); return I2C_ERROR_NO_SLAVE; } - i2c_stop(obj); - (void)i2c_wait_STOP(obj); + /* If not repeated start, send stop. */ + if (stop) { + i2c_stop(obj); + (void)i2c_wait_STOP(obj); + } i2c_set_NACKF_STOP(obj); return length;