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.