aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/src
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-01-06 19:05:13 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-01-06 19:05:13 +0000
commit54c975bed0b0fbfbf6fdd1a5024c258150c4c5dc (patch)
treeb18a96788fbc46c774c9c926a60e6a19bd955bfd /os/hal/src
parentdcbb613f6d74018abc0c977b351dbd9334d1454f (diff)
downloadChibiOS-54c975bed0b0fbfbf6fdd1a5024c258150c4c5dc.tar.gz
ChibiOS-54c975bed0b0fbfbf6fdd1a5024c258150c4c5dc.tar.bz2
ChibiOS-54c975bed0b0fbfbf6fdd1a5024c258150c4c5dc.zip
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
Diffstat (limited to 'os/hal/src')
-rw-r--r--os/hal/src/i2c.c20
1 files changed, 14 insertions, 6 deletions
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;
}