| .. raw:: html |
| |
| <!--- |
| # SPDX-FileCopyrightText: 2020 Efabless Corporation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| # SPDX-License-Identifier: Apache-2.0 |
| --> |
| |
| UART interface |
| ============== |
| |
| The UART is a standard 2-pin serial interface that can communicate with the most similar interfaces at a fixed baud rate. |
| Although the UART operates independently of the CPU, data transfers are blocking operations which will generate CPU wait states until the data transfer is completed. |
| |
| Related pins |
| ------------ |
| |
| * :ref:`SER_TX <ser_tx>` - F7, |
| * :ref:`SER_RX <ser_rx>` - E7. |
| |
| UART control registers |
| ---------------------- |
| |
| The behaviour of the UART can be modified by changing values in the registers described below. |
| |
| .. _reg_uart_clkdiv: |
| |
| ``reg_uart_clkdiv`` |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x20000000`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "UART clock divider", "bits": 32}] |
| } |
| |
| | |
| |
| The entire 32bit word encodes the number of CPU core cycles to divide down to get the UART data bit rate (baud rate). |
| The default value is 1. |
| |
| For example, if the external crystal is 12.5 MHz, then the core CPU clock runs at 100 MHz. |
| To get 9600 baud rate, you need to set:: |
| |
| 100 000 000 / 9600 = 10417 (0x28B1) |
| |
| .. _reg_uart_data: |
| |
| ``reg_uart_data`` |
| ~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x20000004`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "UART data", "bits": 8}, |
| {"name": "(unused, value is 0x0)", "type": 1, "bits": 24}] |
| } |
| |
| | |
| |
| Writing a value to this register will immediately start a data transfer on the :ref:`SER_TX <ser_tx>` pin. |
| If the UART write operation is pending, then the CPU will be blocked with wait states until the transfer is complete before starting the new write operation. |
| This makes the UART transmit a relatively expensive operation on the CPU, but avoids the necessity of buffering data and checking for buffer overflow. |
| |
| Reading a value from this register: |
| |
| * returns ``255 (0xff)`` if no valid data byte is in the receive buffer (the whole register has value ``0xffffffff``), or |
| * returns the value of the received buffer otherwise, and |
| * clears the receive buffer for additional reads. |
| |
| .. note:: There is no FIFO associated with the UART. |
| |
| .. _reg_uart_enable: |
| |
| ``reg_uart_enable`` |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| Base address: ``0x20000008`` |
| |
| .. wavedrom:: |
| |
| { "reg": [ |
| {"name": "UART enable", "bits": 8}, |
| {"name": "(unused, value is 0x0)", "type": 1, "bits": 24}] |
| } |
| |
| | |
| |
| The UART must be enabled to run (disabled by default). |