AM261x Motor Control SDK  2025.00.00
EnDat

Introduction

EnDat is a bidirectional interface for position encoders. During EnDat operation, the EnDat receiver receives position information from the EnDat position encoder.

Note
This implementation using Peripheral input/output mode of PRU-ICSS. Refer Peripheral IF mode for more details.

Features Supported

  • EnDat 2.2 command set
  • EnDat 2.1 command set
  • Interrupted and continuous clock mode
  • Cable length up to 100m @8MHz
  • Propagation delay compensation - Automatic estimation of propagation delay
  • Receive on-the-fly CRC verification of position, parameters and additional information
  • Two modes of operation - host trigger and periodic trigger
  • Channel select
  • Same clock frequency for all channels in multi channel mode within the same PRU-ICSS slice
    • Different PRU slices can simultaneously handle encoders operating at different frequencies
  • Support for periodic trigger using PRU-ICSS IEP timer module
  • Dual channel support using two independent PRU cores (PRU0 and PRU1)
    • Each PRU core handles one encoder channel independently
    • Different PRU slices can operate encoders at different frequencies
    • Each channel requires a separate EnDat instance in SysConfig
  • Safety Readiness: Recovery time
  • Clock up to 16MHz with single channel
    Note
    In three channel interface of PRU-ICSS, receive (Rx) is oversampled at 8x of send (Tx). Therefore, the encoder interface frequency "f" should be such that Tx source clock value is divisible by "f" and Rx source clock value is divisible by "8*f".
  • Possible interface speeds with different source clock combinations:
    Clock Source

    Interface Speed

    PRU UART Clock (160 MHz) 1MHz, 2MHz, 4MHz, 5MHz, 10MHz
    PRU Core Clock (225 MHz)

    1MHz, 5MHz

Features Not Supported

In general, peripherals or features not mentioned as part of "Features Supported" section are not supported in this release, including the below:

  • Independent clock frequency for each channel in multi channel mode within the same PRU-ICSS slice
    • Clock frequency is a PRU-ICSS slice level configuration
    • Each channel within the same PRU-ICSS slice in multi-channel mode will have same clock frequencies

Limitations

SysConfig Features

Note
It is strongly recommend to use SysConfig where it is available instead of using direct SW API calls. This will help simplify the SW application and also catch common mistakes early in the development cycle.
Attention
For each PRU-ICSS slice being used for EnDat, one module instance should be created in SysConfig. For 2 channel example using 2 PRUs, 2 instances need to be added.

SysConfig can be used to configure the following:

  • Selecting the ICSS instance
  • Selecting the ICSSM instance (Tested on ICSSM1)
  • Selecting the ICSSM PRU slice (Tested on ICSSM1-PRU0 and ICSSM1-PRU1)
  • Configuring PINMUX
  • Channel selection
  • IEP event selection for periodic trigger mode
  • Selecting RX and TX source clock
  • Booster Pack Support: Enable when using BP-AM2BLDCSERVO
Note
EnDat firmware is tested with ICSS Core Clock running at 225 MHz frequency or ICSS UART Clock running at 160 MHz only.

Periodic Trigger Modes

The EnDat driver supports two types of periodic trigger modes for continuous position sampling:

CMP Mode (Compare Event Mode)

In CMP mode, the IEP timer compare event triggers position sampling. Compare events occur when the IEP timer counter matches the configured compare value. This mode enables fixed-rate periodic sampling.

Configuration:

  • Compare event range: CMP0-CMP15 (0-15)
  • Configured via endat_config_periodic_trigger_cmp_mode() API
  • IEP compare event number set via endat_config_iep_cmp_event() API
  • Event selection can be done in SysConfig
  • IEP configuration and CMP event configuration should be done in application. Driver uses above APIs to inform firmware to enable CMP periodic mode and uses the configured CMP event to start sampling periodically.

CAP Mode (Capture Event Mode)

In CAP mode, external signals trigger position sampling through IEP capture events. The capture event is triggered on the rising edge of the external input pulse, enabling event-driven position capture. Internal signals can also be mapped to IEP capture events via XBAR.

Configuration:

  • Capture event range: CAP0-CAP7 (0-7)
  • Configured via endat_config_periodic_trigger_cap_mode() API
  • IEP capture event number set via endat_config_iep_cap_event() API
  • Event selection can be done in SysConfig
  • IEP configuration and CAP event configuration should be done in application. Driver uses above APIs to inform firmware to enable CAP periodic mode and uses the configured CAP event to start sampling periodically.
Note
  • External signal must be routed to IEP capture input (if needed) in application
  • CAP6 and CAP7 support falling edge detection as well. In EnDat, rising edge is used always.
Attention
Both IEP event configuration APIs (endat_config_iep_cmp_event() and endat_config_iep_cap_event()) are automatically called during endat_init() with values configured in SysConfig.

PRU-ICSS Resource Usage

  • Utilizes the Peripheral IF mode (3-channel peripheral interface mode) for EnDat communication. Maximum of 3 channels are available per PRU slice. (Refer Peripheral IF mode for more details)
  • Each channel has 4 pins (Clock, Data out, Data in, Output enable)
  • Following table contains details of memory usage, IEP usage and interrupt controller usage:
Attention
In addition to the following resources used by PRU firmware, SDK examples also configure IEP0 CMP0 for IEP counter reset in periodic trigger CMP mode.
Configuration per slice PRU Core(s) Memory Usage IEP Usage Interrupt Controller (INTC) Usage

Description

Single channel PRUx DMEM:188 Bytes, from offset 0x00 to 0xBB offset
IMEM: ~ 5.57 kB
TCMB0: 40 Bytes, 40 Bytes of memory can be located anywhere within the offset range 0x00 to 0x78, depending on the selected channel.
CMP Mode: IEP0 CMPy for trigger (CMPy selected in SysConfig)
CAP Mode: IEP0 CAPy for trigger (CAPy selected in SysConfig)
INTC event/input number 18 or 21 (pr0_pru_mst_intr[2/5]_intr_req) is used to trigger interrupt to Arm® Cortex®-R5F based on slice

IEP, CMP/CAP events and INTC signal are used only in periodic trigger modes

Attention
TCMB0 memory is a part of R5F, not PRU-ICSS.
Note
For pin usage, see Pin Multiplexing section.

ENDAT Design

EnDat Protocol Design explains the design in detail.

Example

EnDat Diagnostic

API

APIs for ENDAT Encoder

Note
Arm is a registered trademark of Arm Limited (or its subsidiaries or affiliates) in the US and/or elsewhere.