Ich habe fünf SPI-SRAM-Chips, die ich von einem einzelnen Arduino aus steuern möchte. Ich habe solche Setups gesehen, die SCLK
, MOSI
und MISO
, mit separaten SS
Pins teilen:
(Bild mit freundlicher Genehmigung von Wikipedia)
Ich möchte jedoch vermeiden, fünf Pins für separate SS
Freigaben zu verwenden. Ich denke darüber nach, einen Zähler zu verwenden, um die verschiedenen Slaves auszuwählen, damit ich den Countdown auf 2 Pins reduzieren kann.
Die Idee ist, zwei Stifte für die Richtung und die Uhr des Zählers zu verwenden. Der Code würde in etwa so aussehen:
int currentSlave = 1; // on setup I'll set the counter to 1
void SelectSlave(int id)
{
// error checking
if (id < 1 || id > 5) Serial.writeln("Invalid slave ID passed to SelectSlave.");
// calculate the ID difference
int diff = abs(id - currentSlave);
if (diff == 0) return; // no need to do anything
if (id > currentSlave) set(CTR_DIRECTION); // increment
if (id < currentSlave) clear(CTR_DIRECTION); // decrement
// calculate the number of clock pulses to send to the counter
int pulses = 0;
if (id > currentSlave) pulses = (1 << (id - 1)) - (1 << (currentSlave - 1));
if (id < currentSlave) pulses = (1 << (currentSlave - 1)) - (1 << (id - 1));
// send the clock pulses
for(int i = 0; i < pulses; i++)
{
set(CTR_CLOCK);
delay(1);
clear(CTR_CLOCK);
delay(1);
}
}
Ich habe ein paar Fragen:
SS
Ein- und Ausschalten mehrerer Pins während des Zwischenzählzeitraums?Sie könnten einen Serial-In-Parallel-Out-Shifter wie 74HC164 in Betracht ziehen. Du brauchst 2 Stifte. Mit 2 Pins können Sie beliebig viele Freigaben generieren. Ein 74HC138-Decoder würde mehr Pins benötigen, wenn die Anzahl der Ausgänge zunimmt. Ein Zähler würde in einigen Fällen viele viele Taktimpulse benötigen, um jeweils nur einen Ausgang zu aktivieren. Der 74HC164-Shifter benötigt höchstens n Taktimpulse, um n Freigaben zu erzeugen.
Der typische Weg, dies zu tun, ist mit einem Demux oder Decoder 3 bis 8 Decoder .
In Ihrem Fall würden Sie jedoch 3 Signale benötigen, um die 5 Chipauswahlleitungen mit diesem Ansatz zu erzeugen (Sie erhalten tatsächlich 8 Ausgänge für 3 Eingänge).
Ihr Ansatz hat auch Vorteile, solange Sie keine Daten senden, während Sie Ihre Chipauswahloptionen durchlaufen. Die meisten Zähler haben eine voreingestellte Zeile oder eine Methode, sie beim Start zu löschen.
CLK
Pin zu senden), sollte es bei diesem Ansatz kein Problem geben?Ich hatte in der Vergangenheit ein ähnliches Problem, aber mit nur zwei SPI-Geräten. Meine Lösung bestand darin, einen PIC12F1822 als SS-Umschalter zu verwenden. Es lief mit 8 MIPS unter Verwendung seines internen Oszillators und hatte Code, der diese Funktion ausführte:
if SS input goes low then
if MOSI is low, then
set SS_OUT_1 low
else
set SS_OUT_2 low
end if
end if
if SS input goes high then
set SS_OUT_1 high
set SS_OUT_2 high
end if
Es hat sich einfach ewig darauf geschleift. Der Code wurde in etwa 20 Assembleranweisungen geschrieben und hatte eine ziemlich gute Latenz von etwa einer Mikrosekunde IIRC.
Sie könnten einen sehr ähnlichen Code schreiben, mit dem Sie eine beliebige Anzahl von Slaves auswählen können, indem Sie MOSI als Up / Down-Signal verwenden, EG
bits = 0b11111110
begin loop
if SS input goes low then
if MOSI is low, then
bits <<= 1
else
bits >>= 1
end if
SS_PORT = bits
end if
if SS input goes high then
SS_PORT = 0b11111111
end if
end loop
Obwohl Sie einen PIC mit mehr Pins verwenden müssten, z. B. PIC12LF1840T48A .
trosley
Polynom
trosley
Polynom
~n
statt zählenn
. Anstelle von1, 2, 4, 8, 16
würden die Impulszahlen also sein30, 29, 27, 23, 15
.trosley
Polynom