.. _mr_canhubk3:

NXP MR-CANHUBK3
###############

Overview
********

`NXP MR-CANHUBK3`_ is an evaluation board for mobile robotics applications such
as autonomous mobile robots (AMR) and automated guided vehicles (AGV). It
features an `NXP S32K344`_ general-purpose automotive microcontroller based on
an Arm Cortex-M7 core (Lock-Step).

.. image:: img/mr_canhubk3_top.jpg
     :align: center
     :alt: NXP MR-CANHUBK3 (TOP)

Hardware
********

- NXP S32K344
    - Arm Cortex-M7 (Lock-Step), 160 MHz (Max.)
    - 4 MB of program flash, with ECC
    - 320 KB RAM, with ECC
    - Ethernet 100 Mbps, CAN FD, FlexIO, QSPI
    - 12-bit 1 Msps ADC, 16-bit eMIOS timer

- `NXP FS26 Safety System Basis Chip`_

- Interfaces:
    - Console UART
    - 6x CAN FD
    - 100Base-T1 Ethernet
    - DroneCode standard JST-GH connectors and I/O headers for I2C, SPI, GPIO,
      PWM, etc.

More information about the hardware and design resources can be found at
`NXP MR-CANHUBK3`_ website.

Supported Features
==================

The ``mr_canhubk3`` board configuration supports the following hardware features:

============  ==========  ================================
Interface     Controller  Driver/Component
============  ==========  ================================
SIUL2         on-chip     | pinctrl
                          | gpio
                          | external interrupt controller
LPUART        on-chip     serial
QSPI          on-chip     flash
FLEXCAN       on-chip     can
LPI2C         on-chip     i2c
ADC SAR       on-chip     adc
LPSPI         on-chip     spi
WDT           FS26 SBC    watchdog
EMAC          on-chip     ethernet
eMIOS         on-chip     pwm
============  ==========  ================================

The default configuration can be found in the Kconfig file
:zephyr_file:`boards/arm/mr_canhubk3/mr_canhubk3_defconfig`.

Connections and IOs
===================

Each GPIO port is divided into two banks: low bank, from pin 0 to 15, and high
bank, from pin 16 to 31. For example, ``PTA2`` is the pin 2 of ``gpioa_l`` (low
bank), and ``PTA20`` is the pin 4 of ``gpioa_h`` (high bank).

LEDs
----

The MR-CANHUBK3 board has one user RGB LED:

=======================  =====  =====  ===================================
Devicetree node          Color  Pin    Pin Functions
=======================  =====  =====  ===================================
led0 / user_led1_red     Red    PTE14  FXIO D7 / EMIOS0 CH19
led1 / user_led1_green   Green  PTA27  FXIO D5 / EMIOS1 CH10 / EMIOS2 CH10
led2 / user_led1_blue    Blue   PTE12  FXIO D8 / EMIOS1 CH5
=======================  =====  =====  ===================================

The user can control the LEDs in any way. An output of ``0`` illuminates the LED.

Buttons
-------

The MR-CANHUBK3 board has two user buttons:

=======================  =====  =====  ==============
Devicetree node          Label  Pin    Pin Functions
=======================  =====  =====  ==============
sw0 / user_button_1      SW1    PTD15  EIRQ31
sw0 / user_button_2      SW2    PTA25  EIRQ5 / WKPU34
=======================  =====  =====  ==============

System Clock
============

The Arm Cortex-M7 (Lock-Step) are configured to run at 160 MHz.

Serial Console
==============

By default, the serial console is provided through ``lpuart2`` on the 7-pin
DCD-LZ debug connector ``P6``.

=========  =====  ============
Connector  Pin    Pin Function
=========  =====  ============
P6.2       PTA9   LPUART2_TX
P6.3       PTA8   LPUART2_RX
=========  =====  ============

CAN
===

CAN is provided through FLEXCAN interface with 6 instances.

===============  =======  ===============  =============
Devicetree node  Pin      Pin Function     Bus Connector
===============  =======  ===============  =============
flexcan0         | PTA6   | PTA6_CAN0_RX   P12/P13
                 | PTA7   | PTA7_CAN0_TX
flexcan1         | PTC9   | PTC9_CAN0_RX   P14/P15
                 | PTC8   | PTC8_CAN0_TX
flexcan2         | PTE25  | PTE25_CAN0_RX  P16/P17
                 | PTE24  | PTE24_CAN0_TX
flexcan3         | PTC29  | PTC29_CAN0_RX  P18/019
                 | PTC28  | PTC28_CAN0_TX
flexcan4         | PTC31  | PTC31_CAN0_RX  P20/P21
                 | PTC30  | PTC30_CAN0_TX
flexcan5         | PTC11  | PTC11_CAN0_RX  P22/P23
                 | PTC10  | PTC10_CAN0_TX
===============  =======  ===============  =============

.. note::
   There is limitation by HAL SDK, so CAN only has support maximum 64 message buffers (MBs)
   and support maximum 32 message buffers for concurrent active instances with 8 bytes
   payload. We need to pay attention to configuration options:

   1. :kconfig:option:`CONFIG_CAN_MAX_MB` must be less or equal than the
      maximum number of message buffers that is according to the table below.

   2. :kconfig:option:`CONFIG_CAN_MAX_FILTER` must be less or equal than
      :kconfig:option:`CONFIG_CAN_MAX_MB`.

===============  ==========  ================  ================
Devicetree node  Payload     Hardware support  Software support
===============  ==========  ================  ================
flexcan0         | 8 bytes   | 96 MBs          | 64 MBs
                 | 16 bytes  | 63 MBs          | 42 MBs
                 | 32 bytes  | 36 MBs          | 24 MBs
                 | 64 bytes  | 21 MBs          | 14 MBs
flexcan1         | 8 bytes   | 64 MBs          | 64 MBs
                 | 16 bytes  | 42 MBs          | 42 MBs
                 | 32 bytes  | 24 MBs          | 24 MBs
                 | 64 bytes  | 14 MBs          | 14 MBs
flexcan2         | 8 bytes   | 64 MBs          | 64 MBs
                 | 16 bytes  | 42 MBs          | 42 MBs
                 | 32 bytes  | 24 MBs          | 24 MBs
                 | 64 bytes  | 14 MBs          | 14 MBs
flexcan3         | 8 bytes   | 32 MBs          | 32 MBs
                 | 16 bytes  | 21 MBs          | 21 MBs
                 | 32 bytes  | 12 MBs          | 12 MBs
                 | 64 bytes  | 7 MBs           | 7 MBs
flexcan4         | 8 bytes   | 32 MBs          | 32 MBs
                 | 16 bytes  | 21 MBs          | 21 MBs
                 | 32 bytes  | 12 MBs          | 12 MBs
                 | 64 bytes  | 7 MBs           | 7 MBs
flexcan5         | 8 bytes   | 32 MBs          | 32 MBs
                 | 16 bytes  | 21 MBs          | 21 MBs
                 | 32 bytes  | 12 MBs          | 12 MBs
                 | 64 bytes  | 7 MBs           | 7 MBs
===============  ==========  ================  ================

.. note::
   A CAN bus usually requires 60 Ohm termination at both ends of the bus. This may be
   accomplished using one of the included CAN termination boards. For more details, refer
   to the section ``6.3 CAN Connectors`` in the Hardware User Manual of `NXP MR-CANHUBK3`_.

I2C
===

I2C is provided through LPI2C interface with 2 instances ``lpi2c0`` and ``lpi2c1``
on corresponding connectors ``P4``, ``P3``.

=========  =====  ============
Connector  Pin    Pin Function
=========  =====  ============
P3.2       PTD9   LPI2C1_SCL
P3.3       PTD8   LPI2C1_SDA
P4.3       PTD14  LPI2C0_SCL
P4.4       PTD13  LPI2C0_SDA
=========  =====  ============

ADC
===

ADC is provided through ADC SAR controller with 3 instances. ADC channels are divided into
3 groups (precision, standard and external).

.. note::
   All channels of an instance only run on 1 group channel at the same time.

FS26 SBC Watchdog
=================

On normal operation after the board is powered on, there is a window of 256 ms
on which the FS26 watchdog must be serviced with a good token refresh, otherwise
the watchdog will signal a reset to the MCU. This board configuration enables
the FS26 watchdog driver that handles this initialization.

.. note::

   The FS26 can also be started in debug mode (watchdog disabled) following
   these steps:

   1. Power off the board.
   2. Remove the jumper ``JP1`` (pins 1-2 open), which is connected by default.
   3. Power on the board.
   4. Reconnect the jumper ``JP1`` (pins 1-2 shorted).

External Flash
==============

The on-board MX25L6433F 64M-bit multi-I/O Serial NOR Flash memory is connected
to the QSPI controller port A1. This board configuration selects it as the
default flash controller.

Ethernet
========

This board has a single instance of Ethernet Media Access Controller (EMAC)
interfacing with a `NXP TJA1103`_ 100Base-T1 Ethernet PHY. Currently, there is
no driver for this PHY and this board default pin strapping configuration for
the PHY (RMII, master, autonomous mode enabled, polarity correction enabled)
allows to use it without software configuration.

The 100Base-T1 signals are available in connector ``P9`` and can be converted to
100Base-T using a Ethernet media converter such as `RDDRONE-T1ADAPT`_.

Programming and Debugging
*************************

Applications for the ``mr_canhubk3`` board can be built in the usual way as
documented in :ref:`build_an_application`.

This board configuration supports `Lauterbach TRACE32`_ and `SEGGER J-Link`_
West runners for flashing and debugging applications. Follow the steps described
in :ref:`lauterbach-trace32-debug-host-tools` and :ref:`jlink-debug-host-tools`,
to setup the flash and debug host tools for these runners, respectively. The
default runner is J-Link.

Flashing
========

Run the ``west flash`` command to flash the application using SEGGER J-Link.
Alternatively, run ``west flash -r trace32`` to use Lauterbach TRACE32.

The Lauterbach TRACE32 runner supports additional options that can be passed
through command line:

.. code-block:: console

   west flash -r trace32 --startup-args elfFile=<elf_path> loadTo=<flash/sram>
      eraseFlash=<yes/no> verifyFlash=<yes/no>

Where:

- ``<elf_path>`` is the path to the Zephyr application ELF in the output
  directory
- ``loadTo=flash`` loads the application to the SoC internal program flash
  (:kconfig:option:`CONFIG_XIP` must be set), and ``loadTo=sram`` load the
  application to SRAM. Default is ``flash``.
- ``eraseFlash=yes`` erases the whole content of SoC internal flash before the
  application is downloaded to either Flash or SRAM. This routine takes time to
  execute. Default is ``no``.
- ``verifyFlash=yes`` verify the SoC internal flash content after programming
  (use together with ``loadTo=flash``). Default is ``no``.

For example, to erase and verify flash content:

.. code-block:: console

   west flash -r trace32 --startup-args elfFile=build/zephyr/zephyr.elf loadTo=flash eraseFlash=yes verifyFlash=yes

Debugging
=========

Run the ``west debug`` command to start a GDB session using SEGGER J-Link.
Alternatively, run ``west debug -r trace32`` to launch the Lauterbach TRACE32
software debugging interface.

References
**********

.. target-notes::

.. _NXP MR-CANHUBK3:
   https://www.nxp.com/design/development-boards/automotive-development-platforms/s32k-mcu-platforms/s32k344-evaluation-board-for-mobile-robotics-incorporating-100baset1-and-six-can-fd:MR-CANHUBK344

.. _NXP S32K344:
   https://www.nxp.com/products/processors-and-microcontrollers/s32-automotive-platform/s32k-auto-general-purpose-mcus/s32k3-microcontrollers-for-automotive-general-purpose:S32K3

.. _NXP FS26 Safety System Basis Chip:
   https://www.nxp.com/products/power-management/pmics-and-sbcs/safety-sbcs/safety-system-basis-chip-with-low-power-fit-for-asil-d:FS26

.. _NXP TJA1103:
   https://www.nxp.com/products/interfaces/ethernet-/automotive-ethernet-phys/asil-b-compliant-100base-t1-ethernet-phy:TJA1103

.. _RDDRONE-T1ADAPT:
   https://www.nxp.com/products/interfaces/ethernet-/automotive-ethernet-phys/ethernet-media-converter-for-drones-rovers-mobile-robotics-and-automotive:RDDRONE-T1ADAPT

.. _Lauterbach TRACE32:
   https://www.lauterbach.com

.. _SEGGER J-Link:
   https://wiki.segger.com/NXP_S32K3xx
