ODrive Micro + Renishaw EVOLUTE 26-bit BiSS-C: NO_RESPONSE

Hi,

I’m trying to read a Renishaw EVOLUTE linear BiSS-C readhead with an ODrive Micro and always get NO_RESPONSE. The same encoder, transceiver and wiring work fine with an STM32 Nucleo.
There are still parts of this I don’t fully understand, so some of my questions may sound a bit odd. Thanks for bearing with me, and I’d appreciate any guidance.

Setup

  • ODrive Micro: FW 0.6.12-1
  • Encoder: Renishaw EVOLUTE EL26BBB100F10A (linear, BiSS-C unidirectional, 26-bit position, 100 nm)
    • Readhead installed and aligned; set-up LED indicates OK
  • Adapter: TI THVD1451 (full-duplex RS-422, no enable pins)
  • Wiring:
    • Micro SCK → THVD1451 D; Y/Z → MA+/MA−
    • SLO+/SLO− → A/B; R → Micro MISO
    • nCS (G00) not connected
    • Tried with and without 120 Ω termination across A/B, same result
  • Power: encoder + transceiver from Micro J4 5V (also tried an external 5V, same result)

Config

odrv0.spi_encoder0.config.mode = SpiEncoderMode.BISSC
odrv0.spi_encoder0.config.singleturn_bits = 26
odrv0.spi_encoder0.config.multiturn_bits = 0

spi_encoder0.config.baudrate: tried several values.

Symptoms

  • spi_encoder0.status = NO_RESPONSE, n_errors keeps increasing, spi_encoder0.raw = 0
  • The odrv.spi_encoder0.warning flag toggles True/False. Higher baudrate → more often True; at 0.25 MHz it is always True.

Reference that works

NUCLEO-G491RE, SPI1 receive-only master, 8-bit, MSB first, 2.3125 Mbit/s, CPOL high, CPHA 1st edge. With the same transceiver and encoder, full frames are received correctly.

Scope capture (Micro, approximate values, screenshot attached)

  • SCK idles Low
  • t = 0 µs: SCK goes High and stays High
  • t ≈ 2 µs and ≈ 7 µs: two short bursts
  • t ≈ 3 µs: encoder data line goes Low
  • t ≈ 14 µs: main clock burst starts, ~39 µs long, ~1.5–1.6 MHz (~60 clocks, estimated)
  • A complete frame (~36 bits) appears after the Start bit around the 5th main clock

My guess (I’m not sure about this) is that the encoder is responding, but it’s being triggered by the SCK activity before the main clock burst. If so, SLO would already be Low by the time the main burst starts, and maybe the firmware treats that as no response.

Questions

  1. I’ve read in the docs that, since BiSS-C is a standardized protocol, other resolutions beyond the tested 18–20-bit encoders should theoretically work. Is that also expected for a 26-bit single-turn encoder like this one?
  2. Is there a recommended reference adapter circuit for BiSS-C on the Micro?
  3. Could SPI clock polarity/phase (CPOL/CPHA) be related? On the Nucleo I use CPOL high, but on the Micro SCK idles Low, and as far as I can tell CPOL/CPHA can’t be configured there. Does the BiSS-C mode expect an inverting adapter, or is the idle level not an issue?

If you have any suggestions for a fix or experiments to try, I’m happy to run them. Thanks!

Hi!

Your guess is right. On the Micro, the SPI clock is shared with the onboard SPI devices, so you see a burst on SCK every control cycle even when the ODrive isn’t talking to your encoder – that’s the high section with the two short bursts at the start of your capture. A regular SPI encoder ignores that since its nCS stays high, but BiSS-C has no chip select, so the EVOLUTE takes the first burst as a request (SLO drops right after it) and is already mid-cycle when the real read starts.

So the clock to the encoder has to be gated with nCS. What we’ve typically seen work is inverting nCS and using it to drive the driver-enable (DE) pin of an RS-422/RS-485 transceiver, so MA is only driven during the encoder read – e.g. an SN65C1168E, 2x THVD1420/THVD1450, or 1x THVD1452. The receiver side (SLO → R → MISO) can stay always-on.

If you’d rather keep the THVD1451, an OR gate in front of D does the same job (e.g. 74AHCT1G32, powered from the same 5V): SCK and nCS (G00) in, output to D. MA then sits high whenever nCS is high (BiSS-C is idle-high), and only gets the clock during the encoder read.

No inverting adapter needed, CPOL isn’t the issue here.

A few other notes:

  • Set the baudrate back to the default (1687500). At 0.25 MHz the read can’t finish within a control cycle, so it’ll always error out.
  • The EVOLUTE is rated up to 250 mA at 5V, and the Micro’s 5V outputs are 100 mA combined, so I’d strongly recommend an external supply; keeping the RS4xx transceivers powered from the Micro domain is fine, that way the logic-level comms stay on the Micro ground domain, and then you can accept a bit of ground bounce between the Micro and the EVOLUTE through the RS4xx link (which can typically handle at least +/- 5-7V common mode).
  • 26-bit single-turn should be fine, the frame fits. Your singleturn_bits / multiturn_bits config is right.

Let me know how it goes!