esphome-docs/components/weikai.rst

341 lines
11 KiB
ReStructuredText

WeiKai SPI/I²C UART/IO Expander
===============================
.. seo::
:description: Instructions for setting up WeiKai SPI/I²C to UART Expanders in ESPHome.
:image: wk2168.jpg
:keywords: UART, SPI, I²C, WK2132, WK2168, WK2204, WK2212, wk2124
**WeiKai Microelectronics** provides a family of UART & GPIO expansion chips
that interfaces to a micro-controller through SPI or I²C bus.
The ESPHome ``WeiKai`` component supports the following WeiKai chips:
- `WK2168-IQPG <https://jlcpcb.com/partdetail/WEIKAI-WK2168IQPG/C401041>`__
- `WK2132-ISSG <https://jlcpcb.com/partdetail/WeiKai-WK2132ISSG/C401039>`__
- `WK2124-ISSG <https://jlcpcb.com/partdetail/WeiKai-WK2124ISSG/C86332>`__
- `WK2204-IQNG <https://jlcpcb.com/partdetail/WeiKai-WK2204IQNG/C401040>`__
- `WK2212-IQNG <https://jlcpcb.com/partdetail/WeiKai-WK2212IQNG/C2987671>`__
It can also be used with evaluation board equipped with these chips, such as:
- `WK2168 Chip Development Board <https://fr.aliexpress.com/item/1005002198759633.html>`__
- `WK2132 Chip Development Board <https://www.aliexpress.com/item/1005002018579265.html>`__
- `DFROBOT Gravity: I²C to Dual UART Module <https://www.dfrobot.com/product-2001.html>`__
.. figure:: images/DFR0627.jpg
:align: center
The features provided by the different WeiKai chips are described in the following table:
.. list-table:: WeiKai chip's features
:header-rows: 1
:width: 450px
:align: center
* - Chip
- Bus
- UART
- GPIO
* - WK2132-ISSG
- S/I
- 2
-
* - WK2212-IQNG
- S/I
- 2
- 8
* - WK2124-ISSG
- S
- 4
-
* - WK2204-IQNG
- S/I
- 4
-
* - WK2168-IQPG
- S/I
- 4
- 8
As you can see most of the components can interface either through an I²C bus or a SPI bus,
they provide either 2 or 4 serial channels, and some provide 8 input/output pins.
Each UART channel has two independent 256-byte FIFO hardware buffers to transmit and
receive and support data transmission rates up to 1 Mbps.
The baud rate and parity format of each UART channel can be configured independently.
However, the data bit length is fixed at 8.
Utilizing the UART channels enables you to connect your UART devices, with each channel functioning
as a virtual UART bus for the connected component.
The I/O pins of the WeiKai chips can be use as any of the other GPIO pins.
Any option accepting a :ref:`Pin Schema <config-pin_schema>` can theoretically
be used, but some more complicated components that do communication through
this I/O expander might not work.
Connecting via an SPI bus
-------------------------
The ``wk2132_spi``, ``wk2212_spi``, ``wk2204_spi``, ``wk2168_spi`` components allows
you to connect the WeiKai chip with ESPHome via a :ref:`SPI <spi>` bus.
You can connect several of these modules to a single SPI controller circuit effectively expanding
the number of hardware serial ports available. Each WeiKai chip needs to be selected
with a individual CS.
Here is an example of configuration entry for a wk2168_spi component. For the other components
in the list just replace the name of the component and make sure you do not use more channels that the chip
can support (an error message will be generated otherwise). Note that for the ``WK2124-ISSG`` chip
you need to use ``wk2204_spi`` as the two chips are similar.
.. code-block:: yaml
wk2168_spi:
- id: wk2168_bridge_spi
cs_pin: 5
uart:
- id: spi_uart_0
channel: 0
baud_rate: 128200
parity: even
- id: spi_uart_1
channel: 1
baud_rate: 19200
- id: spi_uart_2
channel: 2
baud_rate: 9600
- id: spi_uart_3
channel: 3
baud_rate: 19200
Configuration variables:
************************
- **id** (**Required**, :ref:`config-id`): The id to use for this WeiKai component.
- **spi_id** (*Optional*, :ref:`config-id`): Manually specify the ID of the :ref:`SPI Component <spi>` if you want
to use multiple SPI buses.
- **cs_pin** (**Required**, :ref:`Pin Schema <config-pin_schema>`): The pin on the ESP that the chip select line
of the chip is connected to.
- **data_rate** (*Optional*): Set the data rate of the controller. One of ``80MHz``, ``40MHz``, ``20MHz``, ``10MHz``,
``5MHz``, ``4MHz``, ``2MHz``, ``1MHz`` (default), ``200kHz``, ``75kHz`` or ``1kHz``. A numeric value in Hz can
alternatively be specified.
- **crystal** (*Optional*): The frequency in Hz of the crystal connected to the chip.
The default value is 14745600 Hz.
- **uart** (**Required**): The UART channels.
- **id** (**Required**, :ref:`config-id`): The id to use for this UART channel.
- **channel** (**Required**): Unique channel number of this virtual UART.
Options: ``0`` to ``1`` or ``0`` to ``3`` depending on the model.
- **baud_rate** (**Required**): The baud rate of the UART channel.
- **parity** (*Optional*): The parity used on the UART channel. Options: ``NONE``, ``EVEN``,
``ODD``. Defaults to ``NONE``.
- **stop_bits** (*Optional*): The number of stop bits to send. Options: ``1``, ``2``.
Defaults to ``1``.
Connecting via an I²C bus
-------------------------
The ``wk2132_i2c`` ``wk2212_i2c`` ``wk2204_i2c`` ``wk2168_i2c`` components allows you
to connect the WeiKai chip with ESPHome via an :ref:`I²C <i2c>` bus.
Up to four WeiKai chips can be connected to an I²C controller board, effectively expanding the
available hardware serial ports. The base addresses of these boards are defined by the
positions of two switches, A0 and A1, on the board.
.. list-table:: WeiKai address selection
:header-rows: 1
:width: 350px
:align: center
* - I²C address
- A1
- A0
* - 0x10 - 0x17
- 0
- 0
* - 0x30 - 0x37
- 0
- 1
* - 0x50 - 0x57
- 1
- 0
* - 0x70 - 0x77
- 1
- 1
.. important::
Note that the address is given as a **range** a not a number as you usually find on other I²C component.
Indeed due to a peculiar way of addressing the different internal registers each component actually occupy
8 consecutive addresses. For example if the component base address is 0x10, it will occupy the addresses ranging from
0x10 to 0x17 on the I²C bus.
This is important to know if you want to connect other devices on the same I²C bus.
Here is an example of configuration entry for a ``wk2168_i2c`` component. For the other components
just replace the name of the component and do not use more channels that the chip can
support (an error message will be generated in this case).
.. code-block:: yaml
wk2168_i2c:
- address: 0x70
id: wk2168_bridge_i2c
uart:
- id: i2c_uart_0
channel: 0
baud_rate: 9600
parity: even
- id: i2c_uart_1
channel: 1
baud_rate: 19200
- id: i2c_uart_2
channel: 2
baud_rate: 9600
- id: i2c_uart_3
channel: 3
baud_rate: 19200
Configuration variables:
************************
- **id** (**Required**, :ref:`config-id`): The id to use for this WeiKai component.
- **address** (*Optional*): The I²C address of this component. Defaults to ``0x10``.
- **i2c_id** (*Optional*): The I²C Bus ID. Defaults to the default i²c bus.
- **crystal** (*Optional*): The frequency in Hz of the crystal connected to the chip.
The default value is 14745600 Hz.
- **uart** (*Required*): The UART channels.
- **id** (**Required**, :ref:`config-id`): The id to use for this UART channel.
- **channel** (**Required**): Unique channel number of this virtual UART.
Options: ``0`` to ``1`` or ``0`` to ``3`` depending on the model.
- **baud_rate** (**Required**): The baud rate of the UART channel.
- **parity** (*Optional*): The parity used on the UART channel. Options: ``NONE``, ``EVEN``,
``ODD``. Defaults to ``NONE``.
- **stop_bits** (*Optional*): The number of stop bits to send. Options: ``1``, ``2``.
Defaults to ``1``.
Using the GPIO pins
-------------------
For the ``WK2212``, and ``WK2168`` it is possible to use the chip I/O pins as any of the other GPIO pins.
For example for a wk2168_spi chip:
.. code-block:: yaml
# individual binary_sensor inputs
binary_sensor:
- platform: gpio
name: "pin_0"
pin:
wk2168_spi: wk2168_bridge_spi
number: 0
mode:
input: true
- platform: gpio
name: "pin_1"
pin:
wk2168_spi: wk2168_bridge_spi
number: 1
mode:
input: true
inverted: true
# Individual binary outputs
switch:
- platform: gpio
name: "pin_2"
pin:
wk2168_spi: wk2168_bridge_spi
number: 2
mode:
output: true
- platform: gpio
name: "pin_3"
pin:
wk2168_spi: wk2168_bridge_spi
number: 3
mode:
output: true
inverted: true
Pin configuration variables:
****************************
- **wkxxxx_xxx** (**Required**, :ref:`config-id`): The id of the ``wkxxxx_xxx`` component for the pin. For
example ``wk2212_i2c: wk2168_bridge_spi``
- **number** (**Required**): The pin number (``0`` to ``7``)
- **inverted** (*Optional*): If all read and written values should be treated as inverted. Defaults to ``false``.
- **mode** (*Optional*): A pin mode to set for the pin at. One of ``INPUT`` or ``OUTPUT``. Default to ``INPUT``
Performance considerations:
---------------------------
Bus speed
*********
Please be aware that the communication between the WeiKai chips and the processor occurs on an external bus,
with a relatively low operating frequency. Therefore tasks such as checking the status of the chip's
registers or transferring bytes from the internal FIFOs to the processor may take time.
To improve this situation, it is strongly recommended to increase the default bus frequency.
- With a SPI bus this can be done on the WeiKai component by specifying ``data_rate``. For example:
.. code-block:: yaml
wk2168_spi:
- id: wk2168_bridge_spi
spi_id: spi_bus_id
cs_pin: 5
data_rate: 4MHz
- With an I²C bus this needs to be done on the ``i2c`` declaration and therefore this frequency will
apply to all components connected to this bus.
.. code-block:: yaml
i2c:
sda: 21
scl: 22
scan: true
id: bus_i2c
frequency: 800kHz
Maximum Baud rate
*****************
The maximum baud_rate is proportional to the crystal frequency. The following table
gives the maximum baud_rate at usual system clock:
.. list-table:: maximum baud rate
:header-rows: 1
:width: 300px
:align: center
* - Clock
- Max Bd
* - 14,745,600 Hz
- 921,600 Bd
* - 11,059,200 Hz
- 691,200 Bd
* - 7,372,800 Hz
- 460,800 Bd
* - 3,686,400 Hz
- 230,400 Bd
* - 1,843,200 Hz
- 115,200 Bd
If you try to use a baud rate superior to the maximum baud_rate an error will be displayed in the
log file and the baud rate will automatically be decreased.
See Also
--------
- :ref:`i2c`
- :ref:`spi`
- :doc:`switch/gpio`
- :doc:`binary_sensor/gpio`
- :apiref:`weika/weika.h`
- :ghedit:`Edit`