mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-27 19:57:38 +00:00
Start of implementing SC16IS752 support
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
#include <ESPEasySC16IS752_Serial.h>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static std::list
|
||||
|
||||
|
||||
ESPEasySC16IS752_Serial::ESPEasySC16IS752_Serial(/* args */)
|
||||
{
|
||||
}
|
||||
|
||||
ESPEasySC16IS752_Serial::~ESPEasySC16IS752_Serial()
|
||||
{
|
||||
}
|
||||
|
||||
SC16IS752_addr_ch ESPEasySC16IS752_Serial::getAddrCh() const
|
||||
{
|
||||
// Usable addresses 0x90 .. 0xAE
|
||||
return ((_address - 0x90) << 1) + (_channel & 1);
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef ESPeasySC16IS752_Serial_h
|
||||
#define ESPeasySC16IS752_Serial_h
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <Stream.h>
|
||||
|
||||
class ESPEasySC16IS752_Serial : public Stream
|
||||
{
|
||||
public:
|
||||
|
||||
typedef uint8_t I2C_address;
|
||||
typedef uint8_t SC16IS752_channel;
|
||||
typedef uint8_t SC16IS752_addr_ch;
|
||||
|
||||
ESPEasySC16IS752_Serial(/* args */);
|
||||
virtual ~ESPEasySC16IS752_Serial();
|
||||
|
||||
private:
|
||||
|
||||
SC16IS752_addr_ch getAddrCh() const;
|
||||
|
||||
I2C_address _address;
|
||||
SC16IS752_channel _channel;
|
||||
|
||||
|
||||
};
|
||||
|
||||
#endif // ESPeasySC16IS752_Serial_h
|
||||
+35
-14
@@ -35,7 +35,7 @@
|
||||
#endif // ifdef __AVR__
|
||||
|
||||
|
||||
SC16IS752::SC16IS752(uint8_t prtcl, uint8_t addr_sspin)
|
||||
SC16IS752::SC16IS752(uint8_t prtcl, uint8_t addr_sspin) : initialized(false)
|
||||
{
|
||||
protocol = prtcl;
|
||||
|
||||
@@ -51,24 +51,27 @@ SC16IS752::SC16IS752(uint8_t prtcl, uint8_t addr_sspin)
|
||||
|
||||
void SC16IS752::begin(uint32_t baud_A, uint32_t baud_B)
|
||||
{
|
||||
if (protocol == SC16IS750_PROTOCOL_I2C) {
|
||||
WIRE.begin();
|
||||
} else {
|
||||
::pinMode(device_address_sspin, OUTPUT);
|
||||
::digitalWrite(device_address_sspin, HIGH);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.begin();
|
||||
beginA(baud_A);
|
||||
beginB(baud_B);
|
||||
}
|
||||
|
||||
// SPI.setClockDivider(32);
|
||||
void SC16IS752::beginA(uint32_t baud_A)
|
||||
{
|
||||
if (!initialized) {
|
||||
Initialize();
|
||||
}
|
||||
ResetDevice();
|
||||
FIFOEnable(SC16IS752_CHANNEL_A, 1);
|
||||
FIFOEnable(SC16IS752_CHANNEL_B, 1);
|
||||
SetBaudrate(SC16IS752_CHANNEL_A, baud_A);
|
||||
SetBaudrate(SC16IS752_CHANNEL_B, baud_B);
|
||||
SetLine(SC16IS752_CHANNEL_A, 8, 0, 1);
|
||||
}
|
||||
|
||||
void SC16IS752::beginB(uint32_t baud_B)
|
||||
{
|
||||
if (!initialized) {
|
||||
Initialize();
|
||||
}
|
||||
FIFOEnable(SC16IS752_CHANNEL_B, 1);
|
||||
SetBaudrate(SC16IS752_CHANNEL_B, baud_B);
|
||||
SetLine(SC16IS752_CHANNEL_B, 8, 0, 1);
|
||||
}
|
||||
|
||||
@@ -163,6 +166,24 @@ void SC16IS752::WriteRegister(uint8_t channel, uint8_t reg_addr, uint8_t val)
|
||||
}
|
||||
}
|
||||
|
||||
void SC16IS752::Initialize()
|
||||
{
|
||||
if (protocol == SC16IS750_PROTOCOL_I2C) {
|
||||
WIRE.begin();
|
||||
} else {
|
||||
::pinMode(device_address_sspin, OUTPUT);
|
||||
::digitalWrite(device_address_sspin, HIGH);
|
||||
SPI.setDataMode(SPI_MODE0);
|
||||
SPI.setClockDivider(SPI_CLOCK_DIV4);
|
||||
SPI.setBitOrder(MSBFIRST);
|
||||
SPI.begin();
|
||||
|
||||
// SPI.setClockDivider(32);
|
||||
}
|
||||
ResetDevice();
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
int16_t SC16IS752::SetBaudrate(uint8_t channel, uint32_t baudrate) // return error of baudrate parts per thousand
|
||||
{
|
||||
uint16_t divisor;
|
||||
|
||||
@@ -116,6 +116,8 @@ class SC16IS752
|
||||
public:
|
||||
SC16IS752(uint8_t prtcl = SC16IS750_PROTOCOL_I2C, uint8_t addr = SC16IS750_ADDRESS_AD);
|
||||
void begin(uint32_t baud_A, uint32_t baud_B);
|
||||
void beginA(uint32_t baud_A);
|
||||
void beginB(uint32_t baud_B);
|
||||
int read(uint8_t channel);
|
||||
size_t write(uint8_t channel, uint8_t val);
|
||||
int available(uint8_t channel);
|
||||
@@ -140,8 +142,10 @@ class SC16IS752
|
||||
uint8_t peek_flag = 0;
|
||||
uint8_t device_address_sspin;
|
||||
uint8_t protocol;
|
||||
bool initialized = false;
|
||||
|
||||
// uint32_t timeout;
|
||||
void Initialize();
|
||||
int16_t SetBaudrate(uint8_t channel, uint32_t baudrate);
|
||||
uint8_t ReadRegister(uint8_t channel, uint8_t reg_addr);
|
||||
void WriteRegister(uint8_t channel, uint8_t reg_addr, uint8_t val);
|
||||
|
||||
@@ -14,6 +14,8 @@ SC16IS752 KEYWORD1
|
||||
#######################################
|
||||
|
||||
begin KEYWORD2
|
||||
beginA KEYWORD2
|
||||
beginB KEYWORD2
|
||||
read KEYWORD2
|
||||
write KEYWORD2
|
||||
available KEYWORD2
|
||||
|
||||
Reference in New Issue
Block a user