Start of implementing SC16IS752 support

This commit is contained in:
TD-er
2020-03-06 20:29:36 +01:00
parent 228c7616c3
commit c53dacf9a7
5 changed files with 91 additions and 14 deletions
@@ -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
View File
@@ -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;
+4
View File
@@ -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);
+2
View File
@@ -14,6 +14,8 @@ SC16IS752 KEYWORD1
#######################################
begin KEYWORD2
beginA KEYWORD2
beginB KEYWORD2
read KEYWORD2
write KEYWORD2
available KEYWORD2