NXP PCA9544A device driver: 4-channel I2C-bus multiplexer with interrupt logic
PCA9544a.h
- Committer:
- ninensei
- Date:
- 2017-09-14
- Revision:
- 2:31aceaca418e
- Parent:
- pca9544a.h@ 1:4d19097c0571
File content as of revision 2:31aceaca418e:
/* mbed Microcontroller Library * Copyright (c) 2017 AT&T, IIoT Foundry, Plano, TX, USA * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** \addtogroup drivers */ /** Support for the NXP PCA9544A 4-channel I2C switch. * * Example: * @code * * #include "mbed.h" * #include "PCA9544A.h" * * // PCA9544A strapped for address option 0 (7-bit I2C address 0x70) * * I2C i2c(I2C_SDA, I2C_SCL); * PCA9544A<I2C> pca9544a(&i2c, 0); * * int main() { * bool ok; * * // Enable channel 1 * bool ok = _pca9544a->select_channel(1); * if (ok) { * printf("I2C device on channel 1 is now accessible\r\n); * } else { * printf("pca9544a error!\r\n"); * } * * // Disconnect all downstream devices from the I2C bus * _pca9544a->reset(); * } * @endcode * @ingroup drivers */ #pragma once #define PCA9544A_BASE_ADDR_7BIT 0x70 #define MAX_CHANNELS 4 template <class T> class PCA9544A { public: /** * Constructor * * @param i2c I2C class servicing the multiplexer * @param addr_3bit address of the multiplexer (A0-A2 pin strapping) * Valid values are 0-7 */ PCA9544A(T * i2c, uint8_t addr_3bit) : _i2c(i2c) { _addr_8bit = ((addr_3bit & 0x7) + PCA9544A_BASE_ADDR_7BIT) << 1; } /** * Reset the multiplexer. All devices connected to the downstream side of * the multiplexer are removed from the I2C bus. Reset is accomplished by * deselecting all channels through soft configuration. * * @returns true if successful */ bool reset(void) { const char channel = 0; return _i2c->write(_addr_8bit, &channel, 1) == 0; } /** * Enable access to one of the eight devices on the downstream side of * the multiplexer. * * @param channel channel to activate. Valid values are 0-7. * * @returns true if successful */ bool select_channel(const uint8_t channel) { if (channel < MAX_CHANNELS) { char channel_mask = 0x4 | channel; return _i2c->write(_addr_8bit, (const char *)&channel_mask, 1) == 0; } else { return false; } } protected: int _addr_8bit; T *_i2c; };