From 5756ea1498c92ea98551bdf8d661351869e680b0 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 4 Nov 2013 15:15:41 +0000 Subject: Fixed bug #432. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@6419 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/STM32/I2Cv1/i2c_lld.c | 14 +++++++++++++- readme.txt | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/os/hal/platforms/STM32/I2Cv1/i2c_lld.c b/os/hal/platforms/STM32/I2Cv1/i2c_lld.c index ba5d0a140..e882160fe 100644 --- a/os/hal/platforms/STM32/I2Cv1/i2c_lld.c +++ b/os/hal/platforms/STM32/I2Cv1/i2c_lld.c @@ -77,6 +77,9 @@ ((uint32_t)(((I2C_SR2_MSL | I2C_SR2_BUSY | I2C_SR2_TRA) << 16) | \ I2C_SR1_BTF | I2C_SR1_TXE)) +#define I2C_EV9_MASTER_ADD10 \ + ((uint32_t)(((I2C_SR2_MSL | I2C_SR2_BUSY) << 16) | I2C_SR1_ADD10)) + #define I2C_EV_MASK 0x00FFFFFF #define I2C_ERROR_MASK \ @@ -297,7 +300,16 @@ static void i2c_lld_serve_event_interrupt(I2CDriver *i2cp) { done by the DMA.*/ switch (I2C_EV_MASK & (event | (regSR2 << 16))) { case I2C_EV5_MASTER_MODE_SELECT: - dp->DR = i2cp->addr; + if ((i2cp->addr >> 8) > 0) { + /* 10-bit address: 1 1 1 1 0 X X R/W */ + dp->DR = 0xF0 | (0x1 & i2cp->addr) | (0x3 & (i2cp->addr >> 9)); + } else { + dp->DR = i2cp->addr; + } + break; + case I2C_EV9_MASTER_ADD10: + /* Set second addr byte (10-bit addressing)*/ + dp->DR = (0xFF & (i2cp->addr >> 1)); break; case I2C_EV6_MASTER_REC_MODE_SELECTED: dp->CR2 &= ~I2C_CR2_ITEVTEN; diff --git a/readme.txt b/readme.txt index 49b5f4f1c..9437f7235 100644 --- a/readme.txt +++ b/readme.txt @@ -95,6 +95,8 @@ to 2.6.2). - FIX: Fixed STM32L1 remove reset flag (bug #435)(backported to 2.6.2). - FIX: Fixed add RTC to STM32L1 (bug #433)(backported to 2.6.2). +- FIX: Fixed support 10-bit addresses in STM32 I2C driver (bug #432) + (backported to 2.6.2). - FIX: Fixed possible unalignment in GCC Cortex-M scatter files (bug #430) (backported to 2.6.2 and 2.4.6). - FIX: Fixed PAL driver documentation error (bug #427)(backported to 2.6.1 -- cgit v1.2.3