SakuraIO

Fork of SakuraIO by SAKURA Internet

Committer:
spiralray
Date:
Sat Nov 19 12:32:11 2016 +0000
Revision:
1:20e1dfe45dab
Parent:
0:8d34375d954c
Child:
3:c54a1eba22c4
Support I2C

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spiralray 0:8d34375d954c 1 #include "mbed.h"
spiralray 0:8d34375d954c 2 #include "SakuraIO.h"
spiralray 1:20e1dfe45dab 3 #include "debug.h"
spiralray 1:20e1dfe45dab 4
spiralray 0:8d34375d954c 5 #define SAKURAIO_SLAVE_ADDR 0x4F
spiralray 1:20e1dfe45dab 6
spiralray 0:8d34375d954c 7 #define MODE_IDLE 0x00
spiralray 0:8d34375d954c 8 #define MODE_WRITE 0x01
spiralray 0:8d34375d954c 9 #define MODE_READ 0x02
spiralray 1:20e1dfe45dab 10
spiralray 0:8d34375d954c 11 void SakuraIO_I2C::begin(){
spiralray 0:8d34375d954c 12 mode = MODE_IDLE;
spiralray 0:8d34375d954c 13 }
spiralray 1:20e1dfe45dab 14
spiralray 0:8d34375d954c 15 void SakuraIO_I2C::end(){
spiralray 0:8d34375d954c 16 switch(mode){
spiralray 0:8d34375d954c 17 case MODE_WRITE:
spiralray 0:8d34375d954c 18 i2c.stop();
spiralray 0:8d34375d954c 19 break;
spiralray 0:8d34375d954c 20 case MODE_READ:
spiralray 1:20e1dfe45dab 21 while (_length > 0) {
spiralray 1:20e1dfe45dab 22 _length --;
spiralray 1:20e1dfe45dab 23 i2c.read(_length > 0 ? 1 : 0);
spiralray 1:20e1dfe45dab 24 }
spiralray 1:20e1dfe45dab 25 i2c.stop();
spiralray 0:8d34375d954c 26 break;
spiralray 0:8d34375d954c 27 }
spiralray 1:20e1dfe45dab 28
spiralray 0:8d34375d954c 29 mode = MODE_IDLE;
spiralray 0:8d34375d954c 30 }
spiralray 1:20e1dfe45dab 31
spiralray 0:8d34375d954c 32 void SakuraIO_I2C::sendByte(uint8_t data){
spiralray 0:8d34375d954c 33 if(mode != MODE_WRITE){
spiralray 1:20e1dfe45dab 34 dbg("beginTr\r\n");
spiralray 0:8d34375d954c 35 i2c.start();
spiralray 0:8d34375d954c 36 i2c.write(SAKURAIO_SLAVE_ADDR<<1);
spiralray 0:8d34375d954c 37 mode = MODE_WRITE;
spiralray 0:8d34375d954c 38 }
spiralray 1:20e1dfe45dab 39 dbg("Write=%02x\r\n", data);
spiralray 0:8d34375d954c 40 i2c.write(data);
spiralray 0:8d34375d954c 41 }
spiralray 1:20e1dfe45dab 42
spiralray 1:20e1dfe45dab 43
spiralray 0:8d34375d954c 44 uint8_t SakuraIO_I2C::startReceive(uint8_t length){
spiralray 1:20e1dfe45dab 45 if(mode != MODE_IDLE){
spiralray 1:20e1dfe45dab 46 dbg("endTransmission\r\n");
spiralray 1:20e1dfe45dab 47 i2c.stop();
spiralray 1:20e1dfe45dab 48 }
spiralray 1:20e1dfe45dab 49 dbg("requestForm=%d\r\n", length);
spiralray 1:20e1dfe45dab 50 _length = length;
spiralray 0:8d34375d954c 51 i2c.start();
spiralray 0:8d34375d954c 52 i2c.write(SAKURAIO_SLAVE_ADDR<<1 | 1);
spiralray 0:8d34375d954c 53 mode = MODE_READ;
spiralray 1:20e1dfe45dab 54 return 0;
spiralray 0:8d34375d954c 55 }
spiralray 1:20e1dfe45dab 56
spiralray 0:8d34375d954c 57 uint8_t SakuraIO_I2C::receiveByte(){
spiralray 1:20e1dfe45dab 58 return receiveByte(false);
spiralray 0:8d34375d954c 59 }
spiralray 1:20e1dfe45dab 60
spiralray 0:8d34375d954c 61 uint8_t SakuraIO_I2C::receiveByte(bool stop){
spiralray 0:8d34375d954c 62 uint8_t ret = 0;
spiralray 1:20e1dfe45dab 63 if (_length > 0) {
spiralray 1:20e1dfe45dab 64 _length --;
spiralray 1:20e1dfe45dab 65 ret = i2c.read(_length > 0 ? 1 : 0);
spiralray 1:20e1dfe45dab 66 }
spiralray 1:20e1dfe45dab 67 if(stop){
spiralray 1:20e1dfe45dab 68 end();
spiralray 1:20e1dfe45dab 69 }
spiralray 1:20e1dfe45dab 70 dbg("Read=%d\r\n", ret);
spiralray 0:8d34375d954c 71 return ret;
spiralray 0:8d34375d954c 72 }
spiralray 1:20e1dfe45dab 73
spiralray 1:20e1dfe45dab 74 SakuraIO_I2C::SakuraIO_I2C (I2C &_i2c) : i2c(_i2c) {
spiralray 0:8d34375d954c 75 mode = MODE_IDLE;
spiralray 0:8d34375d954c 76 }
spiralray 1:20e1dfe45dab 77
spiralray 1:20e1dfe45dab 78 SakuraIO_I2C::SakuraIO_I2C (PinName sda, PinName scl) : i2c(sda, scl) {
spiralray 1:20e1dfe45dab 79 mode = MODE_IDLE;
spiralray 1:20e1dfe45dab 80 }