SPI bus CS signal Time Bug between TMC and CPU
fixus971 opened this issue · 1 comments
Good morning. I finally found the cause of the communication problems that randomly popped up every now and then.
It's a generic problem that occurs with faster CPUs and in my case:
TMC5160 and CPU Adafruit-Esp32-Feather-v2 SPI bus at 1MHz
The problem is that the TMC5160 requires an impulsive deactivation of the CS(ChipSel) signal between data request and response recovery but a pause is completely missing in the communication soft so with fast CPUs it can happen that this OnOff impulse is invisible to the driver.
__attribute__((weak))
uint32_t TMC2130Stepper::read(uint8_t addressByte) {
uint32_t out = 0UL;
int8_t i = 1;
beginTransaction();
switchCSpin(LOW);
transfer(addressByte);
// Clear SPI
transferEmptyBytes(4);
// Shift the written data to the correct driver in chain
// Default link_index = -1 and no shifting happens
while(i < link_index) {
transferEmptyBytes(5);
i++;
}
switchCSpin(HIGH);
switchCSpin(LOW);
^^^^^^^^^^^^^ No Pause
My solution is
file: TMC2130Stepper.cpp
__attribute__((weak))
void IRAM_ATTR TMC2130Stepper::switchCSpin(bool state) {
digitalWrite(_pinCS, state);
esp_timer_get_time(); //900ns but very stable
}
In the forums there are many other solutions to count nano sec but all of them sooner or later fail due to some type of internal optimization of the CPU:
delayMicroseconds(1); //1500ns is too long
ESP.getCycleCount(); //400 40ns sometimes
cpu_hal_get_cycle_count();
cpu_ll_get_cycle_count();
xthal_get_ccount();
asm("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;");.. //400 40ns sometimes
{ volatile int i; for(i=0; i<1; ++i) {} } //520ns 40ns sometimes
The tests were performed with a Logic Analyzer at 50MHz.
As a Trigger, to see the defect you need to continuously read the 4:IOIN address and activate an output when version is different from 30: in the event of an error it returns 4 because the registers do not rotate and the value sent remains.
I made my fix as indicated and it works for hours but I am writing to report the problem which I believe more and more people will run into given the increasingly faster CPUs.
Furthermore, I need a stable solution from Teemuatlut because I intend to develop other devices.
Thanks for everything, -Federico
Thanks for posting this. I wonder if this is an issue I've been struggling with using the Teensy 4