Arduino R4 SPI cambio velocità

Ciao a tutti,
mi sono imbattuto in un comportamento anomalo durante la configurazione della velocità della SPI.
Il problema è il seguente:

  1. Configuro la SPI con la velocità di 20MHz

  2. Chiamo la funzione di SPI.begin();

  3. Invio un byte e misuro il clock a di 12MHz (Arduino configura la massima F possibie)

  4. Disabilito la SPI con la funzione SPI.end

  5. Inizializzo di nuovo la SPI richiamando le mie configurazioni della SPI

  6. Invio un byte e misuro il clock a di 1MHz anche se il valore impostato è 12MHz

  7. Si ripete il loop e ora misuro sempre 1MHz di clock anche se imposto 20MHz

Qui sotto il codice di esempio per riprodurre il problema

#include <SPI.h>
uint32_t clkSPI = 20000000;
BitOrder bitOrder = MSBFIRST;
uint8_t spiMode = SPI_MODE0;
SPISettings mySettings(clkSPI, bitOrder, spiMode);


void setup() {
}

void loop() {  
  clkSPI = 20000000;
  SPI.begin();
  mySettings = SPISettings(clkSPI, bitOrder, spiMode);
  SPI.beginTransaction(mySettings);
  SPI.transfer(0x00);
  SPI.endTransaction();
  SPI.end();
  
  delay(1000);

  //
  SPI.begin();
  mySettings = SPISettings(clkSPI, bitOrder, spiMode);
  SPI.beginTransaction(mySettings);
  SPI.transfer(0x00);
  SPI.endTransaction();
  SPI.end();
  
  delay(1000);
}

Mentre se cambio la velocità dopo aver riaperto la SPI non noto problemi ovvero il clock cambia da 12MHz->3MHz->12MHz->3MHz...e così via


Qui sotto il codice di esempio

#include <SPI.h>
uint32_t clkSPI = 20000000;
BitOrder bitOrder = MSBFIRST;
uint8_t spiMode = SPI_MODE0;
SPISettings mySettings(clkSPI, bitOrder, spiMode);


void setup() {

}

void loop() {
  
  clkSPI = 20000000;
  SPI.begin();
  mySettings = SPISettings(clkSPI, bitOrder, spiMode);
  SPI.beginTransaction(mySettings);
  SPI.transfer(0x00);
  SPI.endTransaction();
  SPI.end();
  
  delay(1000);

  clkSPI = 3000000;
  SPI.begin();
  mySettings = SPISettings(clkSPI, bitOrder, spiMode);
  SPI.beginTransaction(mySettings);
  SPI.transfer(0x00);
  SPI.endTransaction();
  SPI.end();
  
  delay(1000);
}

A questo punto ho indagato nel core di Arduino ArduinoCore-renesas e ho trovato che ogni chiamata SPI.begin(SPI.cpp) iniziallizza la velocità ad un default che è 1MHz

SPI.h
arduino::SPISettings const DEFAULT_SPI_SETTINGS = arduino::SPISettings(1000000, MSBFIRST, arduino::SPI_MODE0);

Poi analizzando SPI.beginTransaction in SPI.cpp

void ArduinoSPI::beginTransaction(arduino::SPISettings settings)
{
  if (!_is_initialized)
    begin();

  if (_settings != settings) //<-SOLO SE È DIVERSO DAL SETTING PRECEDENTE
  {
    configSpiSettings(settings);
    _settings = settings; //<-COPIA LA NUOVA IMPOSTAZIONE
    /*
    if (_is_sci) {
      _close(&_spi_sci_ctrl);
      _open(&_spi_sci_ctrl, &_spi_cfg);
    } else {
      _close(&_spi_ctrl);
      _open(&_spi_ctrl, &_spi_cfg);
    }
    */
  }
}

La funzione cambia configurazione solo se la varibile "_settings" è diversa dal "setting"... questo spiega il perchè vedo funzionare la configurazione a 20MHz solo una volta .
Avete altre idee?

Grazie Jampag
PS:Ho questa necessità di aprire e chiudere la SPI perchè nel mio progetto devo liberare i pin SPI e poi ho la necessità di cambiare la SPI dinamicamente a volte.