Seite 4 von 4

Re: Level Shifter zwischen Arduino und CC1101 - oder die Suche nach zu hoher Stromaufnahme

Verfasst: 05.01.2022, 21:29
von papa
Wenn es schaltbar sein muss, könnte man auch noch ein weiteres Template-Argumnt nehmen. Würde dann so aussehen:

Code: Alles auswählen

template <uint8_t CS,uint8_t MOSI,uint8_t MISO,uint8_t SCLK, class PINTYPE=ArduinoPins,bool SCKFloatOnIdle=false>
class AvrSPI {
   ...
   void select () {
    if( SCKFloatOnIdle==true) {
      PINTYPE::setOutput(SCLK);
    }
    PINTYPE::setLow(CS);
  }

  void deselect () {
    PINTYPE::setHigh(CS);
    if( SCKFloatOnIdle==true) {
      PINTYPE::setInput(SCLK);
    }
  }
  ...
}
Dann könnte man das einfach im Sketch entsprechend konfigurieren.

Re: Level Shifter zwischen Arduino und CC1101 - oder die Suche nach zu hoher Stromaufnahme

Verfasst: 05.01.2022, 21:51
von FUEL4EP
Hier ist dazu eine interessante Diskussion zu finden:

Der Clock kann machen, was er will, solange kein Slave adressiert ist.
Was jetzt aber tatsächlich der Idle-Pegel beim SPI-Clock ist, das wird
bei der fallenden Flanke vom Slave-Select festgelegt.

Denn es könnte ja durchaus sein, dass ich 4 Slaves am SPI habe:
einen mit Mode 0, einen mit Mode 1 usw. bis Mode 3.
Dann müsste der Idle-Pegel des Taktes beim Umschalten zwischen den 4
Slaves hin- und herwechseln.
Es können, wenn wir ganz flexibel sein wollen, Slaves mit den verschiedenen SPI Modi an einen SPI Bus betrieben werden. AsksinPP unterstützt meines Wissens bisher nur Mode 0.

SPI_modes.png
SPI_modes.png (14.09 KiB) 372 mal betrachtet


Hier sind die SPI Modes schön grafisch dargestellt und erklärt. Da steht auch
Depending on the CPHA bit, the rising or falling clock edge is used to sample and/or shift the data. The master must select the clock polarity and clock phase, as per the requirement of the slave.

Re: Level Shifter zwischen Arduino und CC1101 - oder die Suche nach zu hoher Stromaufnahme

Verfasst: 07.01.2022, 14:17
von FUEL4EP
papa hat geschrieben:
05.01.2022, 21:29
Wenn es schaltbar sein muss, könnte man auch noch ein weiteres Template-Argumnt nehmen. Würde dann so aussehen:

Code: Alles auswählen

template <uint8_t CS,uint8_t MOSI,uint8_t MISO,uint8_t SCLK, class PINTYPE=ArduinoPins,bool SCKFloatOnIdle=false>
class AvrSPI {
   ...
   void select () {
    if( SCKFloatOnIdle==true) {
      PINTYPE::setOutput(SCLK);
    }
    PINTYPE::setLow(CS);
  }

  void deselect () {
    PINTYPE::setHigh(CS);
    if( SCKFloatOnIdle==true) {
      PINTYPE::setInput(SCLK);
    }
  }
  ...
}
Dann könnte man das einfach im Sketch entsprechend konfigurieren.
Hallo papa,

danke für das großartige AsksinPP und den Patchvorschlag für Radio.h.

Ich habe Radio.h mit dem skizzierten Patch lokal gepatcht und im Sketch

Code: Alles auswählen

typedef AvrSPI<10, 11, 12, 13, ArduinoPins, true> RadioSPI;
konfiguriert.

Die gemessene Stromaufnahme in meiner Applikation mit LevelShiftern zwischen ATMega328P und CC1101 beträgt im Sleep Mode <100 uA. Als Anhang die CC1101 WOR Strompulse an einem 10 Ohm Shuntwiderstand gemessen. SCK ist in Sleepmode 'high'. Mein Sketch läuft damit stabil über längere Zeit. Ich kann allerdings nur dieses Single SPI Slave System validieren.
Aus meiner Sicht können wir den Patch so in AsksinPP übernehmen. Es wäre gut, wenn noch jemand mit einem Multi SPI Slave System den Patch vorher validiert.

Der Unterschied zu der von mir skizzierten Lösung ist, dass SCK hier nach jeder Deselektion als Eingang umprogrammiert wird. Bei meinem Lösungsansatz war das nur vor jedem Sleepmode. Die größere Anzahl von Flankenwechseln im Activemode kann m.E. toleriert werden.