SakuraIO
Fork of SakuraIO by
Diff: SakuraIO_I2C.cpp
- Revision:
- 1:20e1dfe45dab
- Parent:
- 0:8d34375d954c
- Child:
- 3:c54a1eba22c4
--- a/SakuraIO_I2C.cpp Sat Nov 19 03:20:17 2016 +0000 +++ b/SakuraIO_I2C.cpp Sat Nov 19 12:32:11 2016 +0000 @@ -1,65 +1,80 @@ #include "mbed.h" #include "SakuraIO.h" -#include "SakuraIO/debug.h" - +#include "debug.h" + #define SAKURAIO_SLAVE_ADDR 0x4F - + #define MODE_IDLE 0x00 #define MODE_WRITE 0x01 #define MODE_READ 0x02 - + void SakuraIO_I2C::begin(){ mode = MODE_IDLE; } - + void SakuraIO_I2C::end(){ switch(mode){ case MODE_WRITE: i2c.stop(); break; case MODE_READ: - i2c.read(true); + while (_length > 0) { + _length --; + i2c.read(_length > 0 ? 1 : 0); + } + i2c.stop(); break; } - + mode = MODE_IDLE; } - + void SakuraIO_I2C::sendByte(uint8_t data){ if(mode != MODE_WRITE){ - dbgln("beginTr"); + dbg("beginTr\r\n"); i2c.start(); i2c.write(SAKURAIO_SLAVE_ADDR<<1); mode = MODE_WRITE; } - dbg("Write="); - dbgln(data); + dbg("Write=%02x\r\n", data); i2c.write(data); } - - + + uint8_t SakuraIO_I2C::startReceive(uint8_t length){ - dbgln("endTransmission"); - i2c.stop(); - dbg("requestForm="); - dbgln(length); + if(mode != MODE_IDLE){ + dbg("endTransmission\r\n"); + i2c.stop(); + } + dbg("requestForm=%d\r\n", length); + _length = length; i2c.start(); i2c.write(SAKURAIO_SLAVE_ADDR<<1 | 1); mode = MODE_READ; + return 0; } - + uint8_t SakuraIO_I2C::receiveByte(){ - return i2c.read(true); + return receiveByte(false); } - + uint8_t SakuraIO_I2C::receiveByte(bool stop){ uint8_t ret = 0; - ret = i2c.read(!stop); - dbg("Read="); - dbgln(ret); + if (_length > 0) { + _length --; + ret = i2c.read(_length > 0 ? 1 : 0); + } + if(stop){ + end(); + } + dbg("Read=%d\r\n", ret); return ret; } - -SakuraIO_I2C::SakuraIO_I2C(I2C &_i2c): i2c(_i2c){ + +SakuraIO_I2C::SakuraIO_I2C (I2C &_i2c) : i2c(_i2c) { mode = MODE_IDLE; } + +SakuraIO_I2C::SakuraIO_I2C (PinName sda, PinName scl) : i2c(sda, scl) { + mode = MODE_IDLE; +} \ No newline at end of file