Changelog¶
What changed in each release of the driver. Entries marked BREAKING need source changes in code that used the affected API.
Unreleased¶
Breaking changes¶
- BREAKING:
tmcl::Parametersno longer containsHEARTBEAT_MONITORING_CONFIG,HEARTBEAT_MONITORING_TIMEOUT,WAKE_PIN_CONTROL_ENABLEorGO_TO_TIMEOUT_POWER_DOWN_STATE. They are global bank-0 parameters and aliased axis ids ¾/10/11 (3 and 4 areMOTOR_PWM_FREQUENCYandCOMMUTATION_MODE), sowriteParameter(HEARTBEAT_MONITORING_TIMEOUT, …)wrote the commutation mode. Usetmcl::GlobalParamBank0::…withwriteGlobal(),globals.writeBank0()or theheartbeat/powersubsystems. Astatic_assertnow rejects duplicate axis ids. - BREAKING:
readGlobal(tmcl::Parameters, bank, …)andwriteGlobal(tmcl::Parameters, bank, …)are deleted; they sent axis ids with SGP/GGP. Use the newreadGlobal(GlobalParamBankN id, …)/writeGlobal(GlobalParamBankN id, …), which deduce the bank from the enum type, or the rawuint16_toverloads. - BREAKING (behaviour):
writeGlobalParameter()/readGlobalParameter()return false without touching the chip when a bank enum id is passed with a different bank number. - BREAKING (behaviour): the SPI handshake no longer waits a fixed 1000 µs between the request
and the reply-request; it polls NOT_READY (see "Changed"). Restore the old timing with
comm.setTmclTiming(tmc9660::TmclSpiTiming::legacy()). - BREAKING (behaviour):
heartbeat.configureAuto({.enable = true})arms the watchdog on the driver's own transport (SPI for an SPI comm type) instead of always on UART. SetHeartbeatConfig::interfaceto choose explicitly.
Fixed¶
- SPI requests answered
NOT_READYwere silently dropped (the reference manual says the command in such a datagram is ignored); they are now re-sent. This was the cause of the "REPLY_INVALID_CMDon back-to-back transfers" symptom. - SPI replies are checked against the request's opcode; a reply that belongs to another datagram is no longer returned as the answer.
RamDebug::startCapture()sent type 6 (SET_TRIGGER_MASK_SHIFT); it now sends type 7 (ENABLE_TRIGGER).readData()used opcodeReadMem; it now usesRamDebugtype 9 (READ_SAMPLE).getStatus()reportedCOMPLETEas running.Heartbeatdocs named bank-0 ids 10/11; they are ¾.configureHeartbeat()writes the timeout before the interface.
Added¶
TmclSpiTiming(frame gap, poll back-off, poll budget, opcode check) withsetTmclTiming()/tmclTiming(), andTmclSpiStatscounters.- Pipelined batches:
SpiCommInterface::transferTMCLBatch()(N accesses in N + 1 datagrams) andTMC9660::readParameters(),writeParameters(),readGlobalParameters(),writeGlobalParameters(),sendCommandBatch(),RamDebug::readSamples(). - Full RAMDebug API: one call per Table 16 type code,
Channel/Trigger/CaptureConfig,configure()/start(),getState(),getInfo(). Heartbeat::HeartbeatConfig::interfaceandHeartbeat::transportInterface().- Host unit tests (
-DHF_TMC9660_BUILD_TESTS=ON) with mock SPI/UART transports, and a CI workflow. - ESP32 example
tmcl_timing(single vs pipelined access latency, gap sweep, histogram). - Timing and throughput documentation (
docs/timing.md).
Changed¶
- Documentation moved to the HardFOC MkDocs platform: new page set (quickstart, hardware, architecture, API
guide, porting, testing), code snippets compiled by the host build from
tests/docs/, Doxygen under/api/, versioned with mike. The Jekyll site files and the doxygen-awesome submodule are gone. setSpiRetryMaxCount()/setSpiRetryInterval()now setTmclSpiTiming::maxPollsand a fixed poll interval. The default budget is 60 re-sends with a 20 → 200 µs back-off (about 11.5 ms).- With
TMC9660_DISABLE_DEBUG_LOGGING,sendCommand()skips its per-access name lookup and formatting.