ble nano hid over gatt
Dependencies: BLE_API mbed-dev nRF51822
mcp23017.h@86:e0fab77e669d, 2016-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 |