As promised, I am posting the entirety of the update here for your convenience.
File: PCA9546.h
#ifndef PCA9546_H
#define PCA9546_h
#ifndef P
#define PBUFSIZE (66)
extern char buf[PBUFSIZE];
#define P(x) strcpy_P(buf, PSTR(x))
#endif
typedef enum
{
PCA9546_ERROR = 0,
PCA9546_SUCCESS
} PCA9546_Status;
#define PCA9546_NOCHANNEL (0) // No channel selected
#define PCA9546_CHANNEL_1 (1) // Bit 1
#define PCA9546_CHANNEL_2 (2) // Bit 2
#define PCA9546_CHANNEL_3 (4) // Bit 3
#define PCA9546_CHANNEL_4 (8) // Bit 4
class PCA9546
{
public:
PCA9546(uint8_t i2c_address);
PCA9546(uint8_t i2c_address, uint8_t channel);
bool selectChannel(uint8_t channel);
PCA9546_Status status;
uint8_t channel;
private:
uint8_t i2c_address;
uint8_t i2c_read();
void i2c_write(uint8_t data);
};
#endif
File: PCA9546.cpp
/*
* PCA9546 Library for Arduino
*
* MIT License
*
* Copyright Jeff Whitlatch - ko7m - 2014
*/
#include <Arduino.h>
#include <Wire.h>
#include "PCA9546.h"
#include "debug.h"
#define DEBUG(x ...) // Default to NO debug
//#define DEBUG(x ...) debugUnique(x) // UnComment for Debug
// Initialize the PCA9546 and disable all channels
PCA9546::PCA9546(uint8_t PCA9546_address)
{
i2c_address = PCA9546_address;
Wire.begin();
selectChannel(PCA9546_NOCHANNEL);
}
// Initialize the PCA9546 and enable the channel(s) indicated
PCA9546::PCA9546(uint8_t PCA9546_address, uint8_t channel)
{
i2c_address = PCA9546_address;
Wire.begin();
selectChannel(channel);
}
// Send a channel selection word to the PCA9546
bool PCA9546::selectChannel(uint8_t channel)
{
// Sanity check value passed. Only least significant 4 bits valid
if (channel <= 0xf)
{
i2c_write(channel);
debug(P("Successfully selected PCA9546 channel"));
status = PCA9546_SUCCESS;
}
else
{
debug(P("PCA9546 channel selection failed"));
status = PCA9546_ERROR;
}
return (PCA9546_SUCCESS == status);
}
// Write a byte to I2C device. There is only a single register. If multiple bytes written, last one wins.
void PCA9546::i2c_write(uint8_t data)
{
Wire.beginTransmission(i2c_address);
Wire.write(data);
Wire.endTransmission();
}
// Read the one byte register from the I2C device
uint8_t PCA9546::i2c_read()
{
uint8_t rdata = 0xFF;
Wire.beginTransmission(i2c_address);
Wire.requestFrom(i2c_address, (uint8_t)1);
if (Wire.available()) rdata = Wire.read();
return rdata;
}
No comments:
Post a Comment