Tengo cinco chips SPI SRAM, que quiero controlar con un solo Arduino. He visto configuraciones como esta, que comparten SCLK
, MOSI
y MISO
, con SS
pines separados:
(imagen cortesía de Wikipedia)
Sin embargo, me gustaría evitar el uso de cinco pines para SS
habilitaciones separadas. Estoy considerando usar un contador para seleccionar los diferentes esclavos, así puedo reducir el conteo a 2 pines.
La idea es usar dos pines para la dirección del contador y el reloj. El código sería algo como esto:
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);
}
}
Tengo algunas preguntas:
SS
y desactivación de varios pines durante el período de conteo intermedio?Podría considerar una palanca de cambios de entrada en serie y salida en paralelo como 74HC164. Necesitas 2 pines. Puede generar tantas habilitaciones como desee con 2 pines. Un decodificador 74HC138 necesitaría más pines a medida que aumentara el número de salidas. Un contador necesitaría muchos pulsos de reloj para habilitar solo una salida a la vez en algunos casos. La palanca de cambios 74HC164 necesita como máximo n pulsos de reloj para producir n habilitaciones.
La forma típica de hacer esto es con un demultiplexor o decodificador de 3 a 8 decodificadores .
Sin embargo, en su caso, necesitaría 3 señales para producir las 5 líneas de selección de chips utilizando este enfoque (en realidad obtiene 8 salidas para 3 entradas).
Su enfoque también tiene mérito, siempre que no envíe datos mientras recorre las opciones de selección de su chip. La mayoría de los contadores tienen una línea preestablecida o algún método para borrarlos al inicio.
CLK
pin), ¿no debería haber ningún problema con este enfoque?Me he enfrentado a un problema similar en el pasado, pero con solo dos dispositivos SPI. Mi solución fue usar un PIC12F1822 como conmutador SS. Corría a 8 MIPS usando su oscilador interno y tenía un código que hacía esta función:
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
Simplemente se repitió para siempre en eso. El código se escribió en unas 20 instrucciones de ensamblador y tenía una latencia bastante buena de aproximadamente un microsegundo IIRC.
Podría escribir un código muy similar que le permita seleccionar cualquier número de esclavos, usando MOSI como una señal arriba/abajo, 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
Aunque tendrías que usar un PIC con más pines, EG PIC12LF1840T48A .
crosley
Polinomio
crosley
Polinomio
~n
en lugar den
. Entonces, en lugar de1, 2, 4, 8, 16
, el conteo de pulsos sería30, 29, 27, 23, 15
.crosley
Polinomio