Comunicación SPI durante la Programación

Estoy usando el ATtiny861a y lo he hecho para que el SPI se conecte a una radio y una fuente de memoria externa a través de dos pines de selección de chip diferentes pero compartiendo la misma línea MISO/MOSI/CLK.

Corrígeme si me equivoco, pero ¿existen dos formas diferentes de conectar la programación del ISP al circuito? La primera forma es que necesito poner una resistencia en cada línea MISO/MOSI/CS/SCK antes del 'Esclavo' y la otra forma es que pongo una resistencia Pull-up/Pull-down en las líneas CS. Encontré esto en otro sitio. ( http://www.societyofrobots.com/robotforum/index.php?action=dlattach;topic=10394.0;attach=4420;imagen )

¿Qué forma de programar el circuito sería mejor (más eficiente energéticamente durante la instalación sin programación/más fácil)? El circuito será un nodo inalámbrico por lo que no estará "funcionando" cuando lo estemos programando.

(del enlace de arriba) Si estoy usando 1.8V para alimentar mi circuito, ¿cambiaría las resistencias pull-up para conectarlas a 1.8V? ¿Hay alguna desventaja (más consumo de energía) en usar Pull-up versus Pull-down? ¿Las resistencias pull-up/pull-down son intercambiables o solo se pueden conectar a ciertos pines? Si el consumo de energía es importante, ¿qué valores de resistencia debo usar?

Los AVR impulsan activamente sus líneas SPI.
Sé que manejan las líneas SPI, pero estoy tratando de averiguar cómo debo conectar el circuito para ISP. Sé que el ISP actúa como maestro cuando está conectado y la MCU se convierte en esclavo temporalmente, sin embargo, tengo otros dispositivos conectados a las mismas líneas MISO/MOSI/CLK y no quiero que reciban nada durante la programación, Solo quiero que la MCU reciba los datos.

Respuestas (1)

Si los dispositivos esclavos son verdaderos módulos SPI seleccionados como esclavos, si su selección de reloj se eleva, deberían poner todas sus salidas en tres estados y dejar de escuchar sus entradas.

Así que el esquema que vinculaste funciona. Solo imagina que el +5V dice "VCC", porque debería. El pull-up siempre debe ir al VCC de su dispositivo total.

En ese sistema, solo funcionarán los pull-ups, porque los CS de los dispositivos esclavos deben aumentar en el modo de programación, cuando programa un Atmel, se reinicia y sus salidas se vuelven tri-state (flotantes). Por lo tanto, las resistencias elevarán automáticamente el CS.

El valor de la resistencia que seguirá funcionando depende de dos cosas: su velocidad de programación y la capacitancia de las trazas CS en su dispositivo. Como tampoco lo sé, no puedo asesorarlo completamente, pero en promedio, estimaría que 10kOhm debería estar bien para un dispositivo pequeño y una velocidad de programación de 250kHz o menos. Eso probablemente permitirá que el CS del esclavo se cargue hasta el máximo antes del primer pulso de reloj útil con programadores AVR estándar.

Cualquier cosa mucho más alta que 10k a 1.8V no le ofrecerá ahorros que notará. A 1,8 V, el 10k solo consumirá 180 uA cuando se afirma el SS, y estoy dispuesto a apostar que las acciones de conmutación y comunicaciones en el AVR usarán mucho más que eso, y mucho menos el dispositivo esclavo.

Puede experimentar con 22k y 50k si lo desea, pero sea realista acerca de todos los parámetros: cuando CS es bajo, se está comunicando. Comunicar es un drenaje razonable en sí mismo.

En cuanto a la radio, usaré un CC2520 de Texas Instruments. No estoy 100% seguro de qué fuente de memoria externa usaré. Si tengo algo conectado a una resistencia pull-up, ¿ese objeto siempre consume energía?
Un módulo de radio (no estaba seguro de si realmente lo decía en serio) eliminará del agua casi cualquier resistencia en la línea CS, así que no se preocupe demasiado por eso. Tengo que ir a trabajar ahora, así que no puedo mirar las hojas de datos por usted, pero busque lo que hacen cuando CS es alto. Si CS es alto, deben identificar su salida como tri-state/flotante/high-Z. Aunque de TI apenas sospecho otra cosa que no sea un comportamiento correcto, como ocurre con todas las demás marcas principales de chips/memorias.
Soy nuevo en AVR/Microcontroladores/todo esto, lo siento si esta es una pregunta estúpida. ¿Qué quieres decir con soplar el drenaje de casi cualquier resistencia? Esto es lo que adjuntaré (el chip en sí es el cc2520 pero está conectado a los pines de salida que conectaré a mi MCU) ti.com/graphics/tool/cc2520emk_800.jpg
Un módulo de radio utilizará > 10 mA (a menudo > 30 mA). Como puse en la respuesta, una resistencia de 10k ya solo usa alrededor de 180uA. Drenaje de la resistencia <<< drenaje del módulo. No hay necesidad de grandes resistencias. "Blow out of the water" es una figura retórica que puede haber sido una mala elección en un foro internacional (dice el holandés ;-) ) de mi parte. Como dije: también necesito ganar dinero, así que estoy realmente fuera por un tiempo ahora.
¡Oye, si no eres holandés, no eres gran cosa! Si tengo el CS de la radio conectado a una resistencia pull-up, ¿la radio siempre consumirá energía? ¿Incluso si pongo la radio en "reposo"? (LPM2 si observa la hoja de datos) Sé que la radio consumirá mucha energía y eso está bien, pero me gustaría minimizar el consumo de energía cuando la radio no está funcionando.
Cuando la radio no está funcionando, no se está comunicando, cuando no se está comunicando, su CS no se reduce. Cuando su CS no es bajo, la resistencia no cuesta nada. Entonces, cuando está dormido, no puede usar nada y aún así no vencer a la resistencia, pero incluso dormido, probablemente use> 100uA. De cualquier manera, como señalé, la resistencia no será su peor usuario. Como digo en la respuesta, incluso el Atmel usará más para comunicarse y estar despierto de lo que desperdicia la resistencia, la radio solo aumentará ese consumo en gran medida, ya que no está durmiendo cuando te estás comunicando.
Solo para aclarar: ¿Entonces la resistencia pull-up no consumirá corriente cuando el CS esté alto? ¿Solo consumirá energía cuando el microcontrolador lo cambie a bajo?
La corriente a través de una resistencia a través de la cual cae una diferencia de 0V solo puede ser 0A. Entonces sí.