Usar un contador para reducir el número de pines para la selección del esclavo SPI

2

Tengo cinco chips SPI SRAM, que quiero eliminar de un solo Arduino. He visto configuraciones como esta, que comparten SCLK , MOSI y MISO , con SS pins separados:


(imagencortesíadeWikipedia)

Sinembargo,megustaríaevitarusarcincopinesparahabilitarSSporseparado.Estoyconsiderandousaruncontadorparaseleccionarlosdiferentesesclavos,asíquepuedoreducirlacuentaa2pines.

Laideaesusardospinesparaladirecciónyelrelojdelcontador.Elcódigoseveríaalgoasí:

intcurrentSlave=1;//onsetupI'llsetthecounterto1voidSelectSlave(intid){//errorcheckingif(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:

  • ¿Hay algún problema relacionado con la activación y desactivación de varios SS pins durante el período de recuento provisional?
  • ¿Puedo confiar en (la mayoría) de los contadores configurados en cero cuando se encienden por primera vez?
  • ¿Hay otras / mejores formas de reducir el número de pines en este tipo de configuración?
pregunta Polynomial

3 respuestas

3

Podría considerar un desplazador de serie en paralelo como 74HC164. Necesitas 2 pines. Puedes generar tantas habilitaciones como desees 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. El desplazador 74HC164 necesita como máximo n pulsos de reloj para producir n habilitaciones.

    
respondido por el user9224
5

La forma típica de hacerlo es con un demux o descodificador descodificador de 3 a 8 .

Sin embargo, en su caso, necesitaría 3 señales para producir las 5 líneas de selección de chip utilizando este enfoque (en realidad obtiene 8 salidas para 3 entradas).

Su enfoque también tiene mérito, siempre y cuando no envíe datos mientras realiza un ciclo a través de las opciones de selección de chip. La mayoría de los contadores tienen una línea predeterminada o algún método para eliminarlos en el inicio.

    
respondido por el Matt
1

He enfrentado un problema similar en el pasado, pero solo con dos dispositivos SPI. Mi solución fue usar un PIC12F1822 como conmutador SS. Funcionó 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 entrelazó para siempre en eso. El código fue escrito en aproximadamente 20 instrucciones del ensamblador, y tenía una latencia bastante buena de alrededor de un microsegundo IIRC.

Podrías escribir un código muy similar para permitirte seleccionar cualquier número de esclavos, usando MOSI como una señal de arriba / abajo, E.G.

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 E.G. PIC12LF1840T48A .

    
respondido por el Rocketmagnet

Lea otras preguntas en las etiquetas