mirror of https://github.com/efabless/caravel.git
147 lines
3.9 KiB
ReStructuredText
147 lines
3.9 KiB
ReStructuredText
|
.. 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
|
||
|
-->
|
||
|
|
||
|
SPI Controller
|
||
|
==============
|
||
|
|
||
|
This section describes the SPI configuration registers.
|
||
|
|
||
|
Related pins
|
||
|
------------
|
||
|
|
||
|
- :ref:`SDI <sdi>` - E9,
|
||
|
- :ref:`CSB <csb>` - E8,
|
||
|
- :ref:`SCK <sck>` - F8,
|
||
|
- :ref:`SDO <sdo>` - F9.
|
||
|
|
||
|
.. _reg_spi_config:
|
||
|
|
||
|
``reg_spi_config``
|
||
|
------------------
|
||
|
|
||
|
Base address: ``0x24000000``
|
||
|
|
||
|
.. wavedrom::
|
||
|
|
||
|
{ "reg": [
|
||
|
{"name": "prescaler", "bits": 8},
|
||
|
{"bits": 1, "name": "MLB"},
|
||
|
{"bits": 1, "name": "nCSB"},
|
||
|
{"bits": 1, "name": "nSCK"},
|
||
|
{"bits": 1, "name": "MOD"},
|
||
|
{"bits": 1, "name": "STM"},
|
||
|
{"bits": 1, "name": "IE"},
|
||
|
{"bits": 1, "name": "INT"},
|
||
|
{"bits": 1, "name": "HK"},
|
||
|
{"name": "(undefined, reads zero)", "type": 1, "bits": 16}],
|
||
|
"config": {"hspace": 1400}
|
||
|
}
|
||
|
|
||
|
|
||
|
.. list-table:: Configuration bit definitions
|
||
|
:name: spi_configuration_bit_definitions
|
||
|
:header-rows: 1
|
||
|
:widths: auto
|
||
|
|
||
|
* - Bit
|
||
|
- Name
|
||
|
- Values
|
||
|
* - 15
|
||
|
- Housekeeping
|
||
|
- 0 - SPI controller connected to external pins
|
||
|
|
||
|
1 - SPI controller connected directly to housekeeping SPI
|
||
|
* - 14
|
||
|
- SPI interrupt enable
|
||
|
- 0 - interrupt disabled
|
||
|
|
||
|
1 - interrupt enabled ( :ref:`IRQ channel 9 <cpu_irq_channel_definitions>` )
|
||
|
* - 13
|
||
|
- SPI system enable
|
||
|
- 0 - SPI disabled
|
||
|
|
||
|
1 - SPI enabled
|
||
|
* - 12
|
||
|
- stream
|
||
|
- 0 - apply/release :ref:`CSB <csb>` separately for each byte
|
||
|
|
||
|
1 - apply :ref:`CSB <csb>` until stream bit is cleared (manually)
|
||
|
* - 11
|
||
|
- mode
|
||
|
- 0 - read and change data on opposite :ref:`SCK <sck>` edges (default)
|
||
|
|
||
|
1 - read and change data on the same :ref:`SCK <sck>` edges
|
||
|
* - 10
|
||
|
- invert :ref:`SCK <sck>`
|
||
|
- 0 - normal :ref:`SCK <sck>` (default)
|
||
|
|
||
|
1 - inverted :ref:`SCK <sck>`
|
||
|
* - 9
|
||
|
- invert :ref:`CSB <csb>`
|
||
|
- 0 - normal :ref:`CSB <csb>` (low is active, default)
|
||
|
|
||
|
1 - inverted :ref:`CSB <csb>` (high is active)
|
||
|
* - 8
|
||
|
- MLB
|
||
|
- 0 - MSB first
|
||
|
|
||
|
1 - LSB first
|
||
|
* - 7-0
|
||
|
- prescaler
|
||
|
- count (in controller clock cycles) of 1/2 :ref:`SCK <sck>` cycle
|
||
|
(default value 2). Clock rate formula:
|
||
|
`SPI clock rate = 2 * core_clock / (prescaler + 1)`
|
||
|
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
All configuration bits other than the prescaler default to value zero.
|
||
|
|
||
|
.. _reg_spi_data:
|
||
|
|
||
|
``reg_spi_data``
|
||
|
----------------
|
||
|
|
||
|
Base address: ``0x24000004``
|
||
|
|
||
|
.. wavedrom::
|
||
|
|
||
|
{ "reg": [
|
||
|
{"name": "SPI data", "bits": 8},
|
||
|
{"name": "(undefined, reads zero)", "type": 1, "bits": 24}]
|
||
|
}
|
||
|
|
||
|
|
|
||
|
|
||
|
The byte at ``0x24000004`` holds the SPI data (either read or write).
|
||
|
|
||
|
Reading to and writing from the SPI controller is simply a matter of setting the required values in the configuration register, and writing values to or reading from ``reg_spi_data``.
|
||
|
The protocol is similar to the UART.
|
||
|
|
||
|
A write operation will stall the CPU if an incomplete SPI transmission is still in progress.
|
||
|
|
||
|
Reading from the SPI will also stall the CPU if an incomplete SPI transmission is still in progress.
|
||
|
There is no FIFO buffer for data.
|
||
|
Therefore SPI reads and writes are relatively expensive operations that tie up the CPU, but will not lose or overwrite data.
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
There is no FIFO associated with the SPI controller.
|