From 54c975bed0b0fbfbf6fdd1a5024c258150c4c5dc Mon Sep 17 00:00:00 2001 From: gdisirio Date: Fri, 6 Jan 2012 19:05:13 +0000 Subject: I2C driver state diagram modified, documentation improvements. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3751 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/src/i2c.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'os/hal/src') diff --git a/os/hal/src/i2c.c b/os/hal/src/i2c.c index ea0df6589..fcccd6a87 100644 --- a/os/hal/src/i2c.c +++ b/os/hal/src/i2c.c @@ -101,7 +101,8 @@ void i2cObjectInit(I2CDriver *i2cp) { void i2cStart(I2CDriver *i2cp, const I2CConfig *config) { chDbgCheck((i2cp != NULL) && (config != NULL), "i2cStart"); - chDbgAssert((i2cp->state == I2C_STOP) || (i2cp->state == I2C_READY), + chDbgAssert((i2cp->state == I2C_STOP) || (i2cp->state == I2C_READY) || + (i2cp->state == I2C_LOCKED), "i2cStart(), #1", "invalid state"); @@ -122,7 +123,8 @@ void i2cStart(I2CDriver *i2cp, const I2CConfig *config) { void i2cStop(I2CDriver *i2cp) { chDbgCheck(i2cp != NULL, "i2cStop"); - chDbgAssert((i2cp->state == I2C_STOP) || (i2cp->state == I2C_READY), + chDbgAssert((i2cp->state == I2C_STOP) || (i2cp->state == I2C_READY) || + (i2cp->state == I2C_LOCKED), "i2cStop(), #1", "invalid state"); @@ -193,10 +195,13 @@ msg_t i2cMasterTransmitTimeout(I2CDriver *i2cp, chSysLock(); i2cp->errors = I2CD_NO_ERROR; - i2cp->state = I2C_ACTIVE_TRANSMIT; + i2cp->state = I2C_ACTIVE_TX; rdymsg = i2c_lld_master_transmit_timeout(i2cp, addr, txbuf, txbytes, rxbuf, rxbytes, timeout); - i2cp->state = I2C_READY; + if (rdymsg == RDY_TIMEOUT) + i2cp->state = I2C_LOCKED; + else + i2cp->state = I2C_READY; chSysUnlock(); return rdymsg; } @@ -239,9 +244,12 @@ msg_t i2cMasterReceiveTimeout(I2CDriver *i2cp, chSysLock(); i2cp->errors = I2CD_NO_ERROR; - i2cp->state = I2C_ACTIVE_RECEIVE; + i2cp->state = I2C_ACTIVE_RX; rdymsg = i2c_lld_master_receive_timeout(i2cp, addr, rxbuf, rxbytes, timeout); - i2cp->state = I2C_READY; + if (rdymsg == RDY_TIMEOUT) + i2cp->state = I2C_LOCKED; + else + i2cp->state = I2C_READY; chSysUnlock(); return rdymsg; } -- cgit v1.2.3