ble nano hid over gatt

Dependencies:   BLE_API mbed-dev nRF51822

Committer:
cho45
Date:
Thu Sep 15 09:31:05 2016 +0900
Revision:
86:e0fab77e669d
Parent:
48:d6938de02f62
support consumer keys

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cho45 4:54cb552e50c4 1
cho45 4:54cb552e50c4 2 /**
cho45 4:54cb552e50c4 3 * MCP23017 のアドレスモードについて:
cho45 4:54cb552e50c4 4 *
cho45 4:54cb552e50c4 5 * Byte Mode: アドレスポインタの自動インクリメントがオフ(デフォルト)
cho45 4:54cb552e50c4 6 * 特定のGPIOを連続して監視するときに便利
cho45 4:54cb552e50c4 7 *
cho45 4:54cb552e50c4 8 * IOCON.BANK=0: GPIOA と GPIOB が読み出すたびにトグルする (デフォルト)
cho45 4:54cb552e50c4 9 * 読み出すと1つアドレスをすすめる(またはアドレスを1つ戻す)
cho45 4:54cb552e50c4 10 * 常に 16bit 分の GPIO を読み書きするとき便利
cho45 4:54cb552e50c4 11 *
cho45 4:54cb552e50c4 12 * IOCON.BANK=1: GPIOA と GPIOB が完全に別れたアドレスになる
cho45 4:54cb552e50c4 13 *
cho45 4:54cb552e50c4 14 * Sequential mode: アドレスポインタの自動インクリメントがオン
cho45 4:54cb552e50c4 15 * I2C eeprom みたいな挙動になる
cho45 4:54cb552e50c4 16 *
cho45 4:54cb552e50c4 17 */
cho45 4:54cb552e50c4 18 class MCP23017 {
cho45 4:54cb552e50c4 19 I2C& i2c;
cho45 4:54cb552e50c4 20 uint8_t address;
cho45 4:54cb552e50c4 21
cho45 4:54cb552e50c4 22 public:
cho45 4:54cb552e50c4 23 // BANK=1
cho45 4:54cb552e50c4 24 enum RegisterAddress {
cho45 4:54cb552e50c4 25 IODIRA_BANK = 0x00,
cho45 4:54cb552e50c4 26 IPOLA_BANK = 0x01,
cho45 4:54cb552e50c4 27 GPINTENA_BANK = 0x02,
cho45 4:54cb552e50c4 28 DEFVALA_BANK = 0x03,
cho45 4:54cb552e50c4 29 INTCONA_BANK = 0x04,
cho45 4:54cb552e50c4 30 IOCON_BANK = 0x05,
cho45 4:54cb552e50c4 31 GPPUA_BANK = 0x06,
cho45 4:54cb552e50c4 32 INTFA_BANK = 0x07,
cho45 4:54cb552e50c4 33 INTCAPA_BANK = 0x08,
cho45 4:54cb552e50c4 34 GPIOA_BANK = 0x09,
cho45 4:54cb552e50c4 35 OLATA_BANK = 0x0a,
cho45 4:54cb552e50c4 36 IODIRB_BANK = 0x10,
cho45 4:54cb552e50c4 37 IPOLB_BANK = 0x11,
cho45 4:54cb552e50c4 38 GPINTENB_BANK = 0x12,
cho45 4:54cb552e50c4 39 DEFVALB_BANK = 0x13,
cho45 4:54cb552e50c4 40 INTCONB_BANK = 0x14,
cho45 4:54cb552e50c4 41 GPPUB_BANK = 0x16,
cho45 4:54cb552e50c4 42 INTFB_BANK = 0x17,
cho45 4:54cb552e50c4 43 INTCAPB_BANK = 0x18,
cho45 4:54cb552e50c4 44 GPIOB_BANK = 0x19,
cho45 4:54cb552e50c4 45 OLATB_BANK = 0x1a,
cho45 4:54cb552e50c4 46
cho45 4:54cb552e50c4 47 // BANK=0
cho45 4:54cb552e50c4 48 IODIRA = 0x00,
cho45 4:54cb552e50c4 49 IODIRB = 0x01,
cho45 4:54cb552e50c4 50 IPOLA = 0x02,
cho45 4:54cb552e50c4 51 IPOLB = 0x03,
cho45 4:54cb552e50c4 52 GPINTENA = 0x04,
cho45 4:54cb552e50c4 53 GPINTENB = 0x05,
cho45 4:54cb552e50c4 54 DEFVALA = 0x06,
cho45 4:54cb552e50c4 55 DEFVALB = 0x07,
cho45 4:54cb552e50c4 56 INTCONA = 0x08,
cho45 4:54cb552e50c4 57 INTCONB = 0x09,
cho45 4:54cb552e50c4 58 IOCON = 0x0a,
cho45 4:54cb552e50c4 59 GPPUA = 0x0c,
cho45 4:54cb552e50c4 60 GPPUB = 0x0d,
cho45 4:54cb552e50c4 61 INTFA = 0x0e,
cho45 4:54cb552e50c4 62 INTFB = 0x0f,
cho45 4:54cb552e50c4 63 INTCAPA = 0x10,
cho45 4:54cb552e50c4 64 INTCAPB = 0x11,
cho45 4:54cb552e50c4 65 GPIOA = 0x12,
cho45 4:54cb552e50c4 66 GPIOB = 0x13,
cho45 4:54cb552e50c4 67 OLATA = 0x14,
cho45 4:54cb552e50c4 68 OLATB = 0x15,
cho45 4:54cb552e50c4 69 };
cho45 4:54cb552e50c4 70
cho45 4:54cb552e50c4 71 static const uint8_t BANK = 7;
cho45 4:54cb552e50c4 72 static const uint8_t MIRROR = 6;
cho45 4:54cb552e50c4 73 static const uint8_t SEQOP = 5;
cho45 4:54cb552e50c4 74 static const uint8_t DISSLW = 4;
cho45 4:54cb552e50c4 75 static const uint8_t HAEN = 3;
cho45 4:54cb552e50c4 76 static const uint8_t ODR = 2;
cho45 4:54cb552e50c4 77 static const uint8_t INTPOL = 1;
cho45 13:b0ffdf2012b9 78
cho45 13:b0ffdf2012b9 79 // i2c.write(byte) returns 1 with success
cho45 13:b0ffdf2012b9 80 // i2c.write(int, const char*, int, bool) returns 0 with success.
cho45 13:b0ffdf2012b9 81 static const int I2C_WRITE_MULTIBYTES_SUCCESS = 0;
cho45 4:54cb552e50c4 82
cho45 4:54cb552e50c4 83 /**
cho45 4:54cb552e50c4 84 * _i2c is instance of I2C
cho45 4:54cb552e50c4 85 * _address is 7-bit slave address of MCP23017
cho45 4:54cb552e50c4 86 */
cho45 4:54cb552e50c4 87
cho45 4:54cb552e50c4 88 MCP23017(
cho45 4:54cb552e50c4 89 I2C& _i2c,
cho45 4:54cb552e50c4 90 uint8_t _address
cho45 4:54cb552e50c4 91 ) :
cho45 4:54cb552e50c4 92 i2c(_i2c),
cho45 4:54cb552e50c4 93 address(_address<<1)
cho45 4:54cb552e50c4 94 {
cho45 4:54cb552e50c4 95 }
cho45 4:54cb552e50c4 96
cho45 48:d6938de02f62 97 uint8_t read8(const RegisterAddress reg, int& error) const {
cho45 4:54cb552e50c4 98 char data[1];
cho45 4:54cb552e50c4 99 data[0] = reg;
cho45 4:54cb552e50c4 100 i2c.write(address, data, 1, true);
cho45 4:54cb552e50c4 101 error = i2c.read(address, data, 1, false);
cho45 4:54cb552e50c4 102 return data[0];
cho45 4:54cb552e50c4 103 }
cho45 4:54cb552e50c4 104
cho45 48:d6938de02f62 105 uint16_t read16(const RegisterAddress reg, int& error) const {
cho45 4:54cb552e50c4 106 char data[2];
cho45 4:54cb552e50c4 107 data[0] = reg;
cho45 4:54cb552e50c4 108 i2c.write(address, data, 1, true);
cho45 4:54cb552e50c4 109 error = i2c.read(address, data, 2, false);
cho45 4:54cb552e50c4 110 return (static_cast<uint16_t>(data[0]) << 8) | static_cast<uint16_t>(data[1]);
cho45 4:54cb552e50c4 111 }
cho45 4:54cb552e50c4 112
cho45 48:d6938de02f62 113 int write8(const RegisterAddress reg, uint8_t data) const {
cho45 4:54cb552e50c4 114 char d[2];
cho45 4:54cb552e50c4 115 d[0] = reg;
cho45 4:54cb552e50c4 116 d[1] = data;
cho45 13:b0ffdf2012b9 117 return i2c.write(address, d, 2, false) == I2C_WRITE_MULTIBYTES_SUCCESS;
cho45 4:54cb552e50c4 118 }
cho45 4:54cb552e50c4 119
cho45 48:d6938de02f62 120 int write16(const RegisterAddress reg, uint16_t data) const {
cho45 4:54cb552e50c4 121 char d[3];
cho45 4:54cb552e50c4 122 d[0] = reg;
cho45 4:54cb552e50c4 123 d[1] = data >> 8;
cho45 4:54cb552e50c4 124 d[2] = data & 0xff;
cho45 13:b0ffdf2012b9 125 return i2c.write(address, d, 3, false) == I2C_WRITE_MULTIBYTES_SUCCESS;
cho45 4:54cb552e50c4 126 }
cho45 4:54cb552e50c4 127 };
cho45 4:54cb552e50c4 128