1 #include <twr_sc16is740.h> 
    3 #define _TWR_SC16IS740_CRYSTCAL_FREQ           (13560000UL) 
    4 #define _TWR_SC16IS740_FIFO_SIZE               64 
    5 #define _TWR_SC16IS740_REG_RHR                 0x00 
    6 #define _TWR_SC16IS740_REG_THR                 0x00 
    7 #define _TWR_SC16IS740_REG_IER                 0x01 << 3 
    8 #define _TWR_SC16IS740_REG_FCR                 0x02 << 3 
    9 #define _TWR_SC16IS740_REG_LCR                 0x03 << 3 
   10 #define _TWR_SC16IS740_REG_MCR                 0x04 << 3 
   11 #define _TWR_SC16IS740_BIT_FIFO_ENABLE         0x01 
   12 #define _TWR_SC16IS740_REG_SPR                 0x07 << 3 
   13 #define _TWR_SC16IS740_REG_TXLVL               0x08 << 3 
   14 #define _TWR_SC16IS740_REG_RXLVL               0x09 << 3 
   15 #define _TWR_SC16IS740_REG_IOCONTROL           0x0E << 3 
   16 #define _TWR_SC16IS740_BIT_UART_SOFTWARE_RESET 0x08 
   17 #define _TWR_SC16IS740_LCR_SPECIAL_REGISTER    0x80 
   18 #define _TWR_SC16IS740_SPECIAL_REG_DLL         0x00 << 3 
   19 #define _TWR_SC16IS740_SPECIAL_REG_DLH         0x01 << 3 
   20 #define _TWR_SC16IS740_LCR_SPECIAL_ENHANCED_REGISTER  0xBF 
   21 #define _TWR_SC16IS740_ENHANCED_REG_EFR        0x02 << 3 
   25     memset(
self, 0, 
sizeof(*
self));
 
   27     self->_i2c_channel = i2c_channel;
 
   28     self->_i2c_address = i2c_address;
 
   33     if (!
twr_i2c_memory_write_8b(self->_i2c_channel, self->_i2c_address, _TWR_SC16IS740_REG_LCR, _TWR_SC16IS740_LCR_SPECIAL_REGISTER))
 
   49     if (!
twr_i2c_memory_write_8b(self->_i2c_channel, self->_i2c_address, _TWR_SC16IS740_REG_LCR, _TWR_SC16IS740_LCR_SPECIAL_ENHANCED_REGISTER))
 
   83     register_fcr = fifo | _TWR_SC16IS740_BIT_FIFO_ENABLE;
 
   97     *spaces_available = value;
 
  104     size_t spaces_available;
 
  106     if (length > _TWR_SC16IS740_FIFO_SIZE)
 
  116     if (spaces_available < length)
 
  152     size_t read_length = 0;
 
  171             transfer.
buffer = buffer + read_length;
 
  172             transfer.
length = length - read_length;
 
  174             if (transfer.
length > available)
 
  176                 transfer.
length = available;
 
  189             read_length += transfer.
length;
 
  191             if (read_length == length)
 
  213     if (!
twr_i2c_memory_write_8b(self->_i2c_channel, self->_i2c_address, _TWR_SC16IS740_REG_LCR, _TWR_SC16IS740_LCR_SPECIAL_REGISTER))
 
  218     if (!
twr_i2c_memory_write_8b(self->_i2c_channel, self->_i2c_address, _TWR_SC16IS740_SPECIAL_REG_DLL, baudrate))
 
void twr_i2c_init(twr_i2c_channel_t channel, twr_i2c_speed_t speed)
Initialize I2C channel.
bool twr_i2c_memory_write(twr_i2c_channel_t channel, const twr_i2c_memory_transfer_t *transfer)
Memory write to I2C channel.
bool twr_i2c_memory_read(twr_i2c_channel_t channel, const twr_i2c_memory_transfer_t *transfer)
Memory read from I2C channel.
bool twr_i2c_memory_write_8b(twr_i2c_channel_t channel, uint8_t device_address, uint32_t memory_address, uint8_t data)
Memory write 1 byte to I2C channel.
bool twr_i2c_memory_read_8b(twr_i2c_channel_t channel, uint8_t device_address, uint32_t memory_address, uint8_t *data)
Memory read 1 byte from I2C channel.
twr_i2c_channel_t
I2C channels.
@ TWR_I2C_SPEED_400_KHZ
I2C communication speed is 400 kHz.
bool twr_sc16is740_reset_fifo(twr_sc16is740_t *self, twr_sc16is740_fifo_t fifo)
Reset FIFO.
twr_sc16is740_baudrate_t
Baudrates.
size_t twr_sc16is740_write(twr_sc16is740_t *self, uint8_t *buffer, size_t length)
Write.
size_t twr_sc16is740_read(twr_sc16is740_t *self, uint8_t *buffer, size_t length, twr_tick_t timeout)
Read.
bool twr_sc16is740_set_baudrate(twr_sc16is740_t *self, twr_sc16is740_baudrate_t baudrate)
Set baudrate.
bool twr_sc16is740_init(twr_sc16is740_t *self, twr_i2c_channel_t i2c_channel, uint8_t i2c_address)
SC16IS740 instance.
twr_sc16is740_fifo_t
Fifo type.
bool twr_sc16is740_available(twr_sc16is740_t *self, size_t *available)
Get RX FIXO available data.
bool twr_sc16is740_get_spaces_available(twr_sc16is740_t *self, size_t *spaces_available)
Get TX FIXO space available.
#define TWR_TICK_INFINITY
Maximum timestamp value.
twr_tick_t twr_tick_get(void)
Get absolute timestamp since start of program.
uint64_t twr_tick_t
Timestamp data type.
I2C memory transfer parameters.
uint32_t memory_address
8-bit I2C memory address (it can be extended to 16-bit format if OR-ed with TWR_I2C_MEMORY_ADDRESS_16...
uint8_t device_address
7-bit I2C device address
size_t length
Length of buffer which is being written or read.
void * buffer
Pointer to buffer which is being written or read.