¿Los pines GPIO del MCP23S17 necesitan protección contra descargas electrostáticas (ESD) dentro de este circuito?

Escribí sobre este sistema antes. Centraré mis preguntas ahora en la dirección de "protección ESD".

Tengo un sistema basado en SPI en el que una Raspberry habla con un dispositivo de expansión GPIO mediante comunicación SPI. El chip lee y/o escribe '0'/'1' y lo envía a la Raspberry por bus.

El circuito del expansor GPIOs es un circuito muy simple, pero algunos días un peligroso sobreconsumo/sobrecalentamiento (casi se quema) se dispara aleatoriamente después de horas de funcionamiento correcto. Esto se detiene cuando reinicio el dispositivo. Después de esto, el dispositivo tiene un comportamiento normal y un consumo normal. Hoy en día el sistema se está conectando y probando en una protoboard. Entonces, el cableado o el material de laboratorio pueden estar afectando poco o mucho.

Algunas personas sugieren que este comportamiento parece ser un "bloqueo" causado por ESD. De lo contrario, podría ser causado por picos de voltaje, picos positivos o GND negativos. Entonces, me dijeron que mis GPIO deben protegerse con resistencias, diodos y capacitores. Pero no veo ningún ejemplo con diodos, Cs y Rs protegiendo entradas/salidas en otros proyectos basados ​​en microcontroladores o microprocesadores. Lo más que he visto son resistencias en serie en algunos de los pines GPIO.

Mi circuito es mucho más simple que los que he visto:

ingrese la descripción de la imagen aquí

  1. 8 pines de expansión serán entradas. El resto serán salidas.

  2. Las salidas del expansor escribirán '0', nunca '1'.

  3. Las entradas del expansor tienen un Rpull interno que pone la entrada a 3,3 V cuando no está conectado.

  4. Puse un cable en cada salida y este cable podría conectarse directamente a las entradas o no. Entonces, cuando lea los 8 pines de entrada, los que están conectados a las entradas leerán '0', y el resto, leerá '1'.

  5. Una entrada leería estos 3 escenarios:

    • '1' (cuando no está conectado),
    • Escritura de salida '0' (si están conectados)
    • '0' = GND (si un punto GND hace contacto directo con una entrada).

Una característica particular de este sistema es que el resto de veces no se configurarán GPIOs como entradas o salidas. Entonces, durante una ejecución, un pin se puede configurar como entrada durante la inicialización, pero en la siguiente ejecución, el mismo pin se puede configurar para que sea una salida.

Este fenómeno de sobrecalentamiento no ocurre más de una o dos veces al día. Pero me temo que una vez sería suficiente para destruir el sistema.

En el diseño final de PCB, los pines GPIO se rastrearán a través de la placa para lograr un conector de 64 pines. La entrada y la salida se conectarán a través de un cable que conectará -o no- dos de los pines del conector de 64 pines por conexión humana durante la ejecución. De esta forma, se podría cerrar un circuito entre una entrada y una salida. Pero también podría haber circuitos abiertos entre el resto de entradas y salidas.

He agregado 10K Rs en cada dispositivo GPIO y estoy usando 100nF entre VDD y GND. Parece que no sucede más hace dos días, pero me gustaría asegurar mis GPIO si el circuito realmente lo necesita.

¿Este circuito necesita protección GPIO? ¿Son suficientes estas resistencias?

Si no tenía tapas de derivación sobre los pines de suministro en el chip, eso por sí solo puede causar todo tipo de problemas. Pero dado que probó tantas cosas a la vez, es imposible saber qué ayudará y qué no. Habría tratado de averiguar si los dos pines se configuraron accidentalmente en ambas salidas, ya que entonces no es un bloqueo causado por ESD, sino tal vez un error de programación o comunicación.
¡UPS! lo siento, olvidé dibujarlo, ¡pero hay un condensador de 100nF! ¡lo siento mucho!
@Justme He leído mucha literatura sobre esto en los últimos 3 días, y una de las formas de protegerse frente a lo que dice: errores de programación y entradas configuradas como salidas, fue la serie R. Así que puse resistencias en serie en cada pin GPIO. Tiene dos funciones: limitación de corriente en caso de errores y mejora frente a ESD. Alguien me sugirió usar desde 10K hasta 200K. Pero sé que hay usuarios que han usado 200 ohmios cuando las entradas tienen botones pulsadores
Parece haber cierta confusión. Déjame aclarar. (1) La ESD generalmente destruye los componentes cuando una persona los manipula (a) antes de que el componente se inserte en el circuito, Y (b) la persona no está conectada a tierra y al mismo tiempo lleva una carga electrostática. Si sus componentes ya están en el circuito, entonces no hay problema de ESD. / continuar, ...
Quizás esté hablando de otras dos cosas: (1) sobrecarga de la red eléctrica. Cuando hay un apagón debido a una sobrecarga de la red (lo que dice "sobreconsumo", dicen demasiados contras de aire) tropezar con MCB. Y cuando todos se enciendan o apaguen al mismo tiempo después, puede haber sobretensiones o picos de la subestación cercana del edificio. Estos picos pueden estar por encima del pico de 220 V y restablecen el Rpi. Por lo general, no debería haber ningún daño para Rpi porque solo obtiene 5 V de energía del adaptador, no directamente de la red eléctrica, / para continuar, ...
Y hay otra cosa llamada "EMF posterior". Si está utilizando Rpi para controlar cargas inductivas, como motores, solenoides o ventiladores, tal vez utilizando un relé de 5 V o SSR. Luego, cuando apague (a) el relé y/o (b) el motor o el solenoide, puede haber un EMF inverso que es un pico de voltaje, a veces un par de veces de la fuente de alimentación original, lo que hace que la corriente fluya de regreso a la fuente de alimentación original. Circuito de Rpi. Este EMF de retorno generalmente se minimiza mediante el uso de (i) diodo de "retroceso", (ii) circuitos de optoaislamiento. Pero los picos pueden viajar a través de las líneas de tierra y activar/restablecer el Rpi. / continuar, ...
Y "engancharse" es otra cosa. Tome Rpi, por ejemplo, si un pin Rpi GPIO está en modo de entrada y el pin GPIO está conectado a través de una resistencia en serie a una fuente de 5V. Luego, hay un 5% de posibilidades de que ocurra un "enganche", que se fríe el circuito del pin GPIO del Rpi o se acorte la vida útil del Rpi. / continuar, ...
Para tener una idea aproximada de "engancharse", le gustaría leer mi respuesta a la siguiente pregunta: (1) "Rpi3 podría haber sido frito por un sensor de temperatura DHT11 mal conectado - Rpi SE Enganchando preguntas y respuestas": raspberrypi.stackexchange . com/questions/96560/… . Salud.
algunos comentarios al azar. (1) Si está utilizando MCP23S17, entonces está utilizando MOSI, MISO, CS de Rpi para hablar con MCP23S17. Si a lo que se refiere como GPIO son los pines GPIO de MCP23S17, entonces no se preocupe, porque cualquier pico, las cosas EMF traseras primero freirán MCP23S17, y Rpi escondido detrás debería ser "seguro". (2) Por lo general, cuando un GPIO Rpi o MCP23S17 está en modo de salida, y desea protegerlo contra un cortocircuito a tierra, o un cortocircuito a otro pin de salida GPIO y están luchando entre sí, entonces el truco habitual es usar una serie resistencia, digamos 330R o 470R. / continuar, ...
Usar 10K está bien si su GPIO es para controlar un dispositivo MOS con entrada de alta impedancia. Pero si el dispositivo es BJT, entonces la resistencia de polarización suele ser de 220R a 1k, entonces usar la serie 10k para proteger GPIO es un poco exagerado. Hablando casualmente en voz alta, mis disculpas por los errores tipográficos. Ah, hora de dormir. Nos vemos mañana.
Ah, olvidé que su Rpi también usa pines GPIO para configurar los pines de dirección (A0 a A2) del MCP23S17, pero eso no debería causar ningún problema. Una forma segura es simplemente atar esos pines A0 a A2 directamente a Vcc y/o tierra. Salud.
(1) Una cosa más, sobre el pin de reinicio MCP23x17. Al jugar con MCP23x17, descubrí que el chip de vez en cuando se vuelve loco y necesito presionar el botón de reinicio manual que instalo porque lo encuentro muy útil en la depuración. Sospecho que MCP23x17 es muy sensible al ruido, por lo que podría volverse loco si los cables de conexión SPI/I2C son muy largos (> 60 cm). (2) Otra cosa es que me parece una buena idea no conectar el pin de interrupción de MCP23x17 directamente a Rpi. En su lugar, utiliza Rpi para hacer un bucle en los registros de estado de interrupción del MCP23s17. Salud.
@ tlfong01 me temo que los usuarios humanos harán las conexiones de cables. Entonces, según usted, ESD podría suceder fácilmente. ¿Lo es?
@tifong bueno, como dije, las SALIDAS de MCP GPIO escribirán '0' y las salidas podrían conectarse por cable a las entradas de MCP GPIO (detectando el contacto entre la conexión de dos cables) o no (no conectadas a nada = detectando aislamiento entre dos cables). Las entradas se conectarán a las salidas. Entonces, a pesar de los cables de un solo polo, es una tecnología CMOS. Por supuesto, cada dirección de chip será la misma durante todo el ciclo de vida, así que los configuraré por VCC y GND. No necesitamos INT para nuestra aplicación. Y mi último comentario: continúa..
es que algo estaba provocando el sobrecalentamiento después de funcionar bien durante horas y la mayoría de la gente me dice que parece un bloqueo debido a picos o ESD. Cuando tengo un condensador de 1uF dentro de VDD-GND, sucedió dos veces. De repente comenzó a calentarse demasiado, los consumos van de 3W a 6W (por lo que parece un consumo de cortocircuito). Solo se detiene cuando se realiza el restablecimiento de MCP (es una de las cosas que suceden cuando se produce el bloqueo). Cambié 1uF por 100nF y parece que no pasa después de 2 días trabajando. Desconozco la causa de desencadenar la situación no deseada. Muchas gracias por su tiempo
@ tlfong01 Quiero que aclare una cosa más: cuando hablo de GPIO no me refiero a los GPIO de Raspberry, me refiero a los GPIO de dispositivos MCP. El dispositivo MCP se está sobrecalentando y me gustaría evitar que los componentes de mi PCB se fríen. El sistema no debe fallar fácilmente de esta manera.
(1) Sobre la cosa ESD. Es posible que haya notado que los proveedores generalmente envían los componentes en bolsas de plástico metálicas y también en esponjas metálicas. Eso es para antiestático. Los operadores en las fábricas de ensamblaje y prueba usan bandas antiestáticas como esta: "AliExpress Pulsera antiestática ajustable Muñeca de PVC Descarga electroestática ESD Cable Correa Mano con cable de conexión a tierra": aliexpress.com/popular/ground-strap.html . Soy un aficionado a jugar con componentes baratos, y nunca me molesto, porque las posibilidades de contraer el virus ESD son muy, muy pequeñas.
Es en los viejos tiempos, cuando los componentes electrónicos eran caros, que la gente se molestaba. O te quedas en un país muy seco, usando ropa de poli/plástico/nylon, entonces necesitas preocuparte. Por supuesto, todo el mundo tiene la posibilidad de ser alcanzado por un rayo. Tal vez debería buscar más en Google para tener una idea.
(2) Siempre recomiendo a los novatos que NO usen el riel de 5 V o 3 V de Rpi para alimentar el MCP23S17 u otros dispositivos periféricos, sino que usen una fuente de alimentación externa, al menos para la etapa de creación de prototipos. De esta manera, si MCP23S17 se vuelve loco, el Rpi aún se sienta feliz. Así que restablecí manualmente MCP23S17 y no es necesario restablecer Rpi, los programas continúan.
(3) Lo que dices sobre el sobrecalentamiento es un poco preocupante. MCP23S17 no puede manejar grandes corrientes. Usualmente uso chips de búfer para manejar grandes corrientes. Si está sobrecargando los 16 pines de salida GPIO con una gran corriente, tendrá un gran problema. Déjame revisar la hoja de datos de MCP23S17 para confirmar. Volveré en un minuto. Por cierto, soy un poco largo, así que vayamos a la sala de chat y continuemos más tarde.

Respuestas (1)

Pregunta

¿Cómo es que mi extensor GPIO MCP23S17 se calienta mucho y se vuelve loco?

/ continuar, ...


Respuesta

Parte 1 - Configuración de la prueba

Sugeriría comenzar con una versión más pequeña de los requisitos del usuario. Por ejemplo, en lugar de hacer las cosas muy flexibles, cualquier pin puede ser de entrada o salida, puede en la fase de prueba, permitir que solo entren 8 pines y solo salga otro pin.

PA0~7 configurado en modo de entrada

PB0~7 configurado en modo de salida

Solo cuando encuentre el modo fijo de entrada/salida de los pines OK en la prueba, entonces generalizará el programa.

mcp23017_test_v0.2_2020aug0101 PÚBLICO

mcp23017 prueba v02


Parte 2 - Aclaración sobre ESD y enganche

Es posible que haya notado que los proveedores generalmente envían los componentes en bolsas de plástico metálicas y también en esponjas metálicas. Eso es para antiestático.

Los operarios de las fábricas de montaje y ensayo llevan brazaletes antiestáticos como este:

Pulsera antiestática ajustable de AliExpress, muñeca de PVC, Cable de descarga electrostática ESD, correa de mano con cable de conexión a tierra .

Soy un aficionado a jugar con componentes baratos, y nunca me molesto, porque las posibilidades de contraer el virus ESD son muy, muy pequeñas.

Es en los viejos tiempos, cuando los componentes electrónicos eran caros, que la gente se molestaba. O te quedas en un país muy seco, usando ropa de poli/plástico/nylon, entonces necesitas preocuparte. Por supuesto, todo el mundo tiene la posibilidad de ser alcanzado por un rayo. Tal vez debería buscar más en Google para tener una idea.

(Ref. A.2) Equipo ESD que mejora la seguridad y la protección en el lugar de trabajo: AntiStat


Parte 3 - Recomendación para usar fuente de alimentación externa para MCP23S17

Siempre recomiendo a los novatos que NO usen el riel de 5 V o 3 V de Rpi para alimentar el MCP23S17 u otros dispositivos periféricos, sino que usen una fuente de alimentación externa, al menos para la etapa de creación de prototipos.

De esta manera, si MCP23S17 se vuelve loco, el Rpi aún se sienta feliz. Así que restablecí manualmente MCP23S17 y no es necesario restablecer Rpi, los programas continúan.


Parte 4 - Posibles causas de sobrecalentamiento

Lo que dices sobre el sobrecalentamiento es un poco preocupante.

MCP23S17 no puede manejar grandes corrientes. Usualmente uso chips de búfer para manejar grandes corrientes. Si está sobrecargando los 16 pines de salida GPIO con una gran corriente, tendrá un gran problema.

Revisé la hoja de datos e hice un resumen:

(1) Potencia total = 700 mW

(2) Pin VSS de corriente máxima = 150 mA

(3) Corriente máxima en pin VDD = 25 mA

(4) Corriente de pinza de entrada = ±20 mA

(5) Corriente de sujeción de salida = ±20 mA

(6) Corriente de salida máxima absorbida por cualquier pin de salida = 25 mA

(7) Corriente de salida máxima generada por cualquier pin de salida = 25 mA

Como puede ver, si carga 6 pines GPIO con 25 mA, entonces la corriente total supera el límite de 150 mA del pin Vss. Usualmente utilizo el chip ULN2803A de 8 tipos grandes para hacer todo el trabajo pesado. Cada uno de los 8 tipos grandes puede manejar 500 mA,...

Parece que usa 10Ω para la resistencia de protección/limitación en serie. Es posible que desee hacer los cálculos para asegurarse de que no se exceda el límite de corriente de GPIO individual y Vcc total.


Parte 5: prueba y programación de par/intercambio

A menudo es una buena idea utilizar más de dos muestras para realizar pruebas de par/intercambio. A menudo, un componente puede estar defectuoso al recibirlo o dañado por un cableado o una prueba descuidados. Muy a menudo, solo mediante la comparación y el contraste de intercambio se encuentran errores de cableado por descuido. Puede usar MCP23s08 o MCP23017 para pruebas cruzadas. Solo la parte de configuración es diferente en las versiones I2C y SPI de MCP23x17. Las principales funciones de operación son idénticas para MCp23SS17 y MCP23017 017. Tomar fotografías de vez en cuando es una buena documentación para referencia posterior.

mcp23s08


mcp23017 x 4


mcp23s17_2020ago0101

/ continuar, ...


Referencias

Parte A - Hojas de datos y artículos

(A.1) Hoja de datos de MCP23S17/MCP23017 - MicroChip

(A.2) Equipos ESD que mejoran la seguridad y la protección en el lugar de trabajo: AntiStat

(A.3) Energía limpia para cada IC, Parte 1: comprensión de los condensadores de derivación - Robert Keim, AAC 2015sep21

(A.4) Energía limpia para cada circuito integrado, Parte 2: Elección y uso de sus condensadores de derivación - Robert Keim. CAA 2015sep27

(A.5) Servocontrolador/PWM de 12 bits de 16 canales I2C de Adafruit - $15

(A.6) Hoja de datos del controlador PWM PCA9685 - NXP

(A.7) Hoja de datos mcp23s17 - Microchip

(A.8) Módulo AliExpress MCP23S17

(A.9) Módulo TaoBao MCP23S17

(A.10) Convertidor de nivel lógico (ULN2803, TBX/TSX0102/4/6/8, etc.) 1/2

(A.11) Convertidor de nivel lógico (ULN2803, TBX/TSX0102/4/6/8, etc.) 2/2

(A.12) TVS, diodo de sujeción MOV - Liz London 2019mar16

(A.13) (TVS) Diodo de supresión de voltaje transitorio - Wikipedia

(A.14) Diodos de protección ESD (diodos TVS) - Toshiba

(A.15) Protección ESD por diseño de chips y microcircuitos - Biblioteca en línea, Wiley

(A.16) ESD (descarga electrostática) - Wikipedia

(A.17) Tapas de desacoplamiento, diseño de PCB - Olin Lathrop, EE SE, 2011jun07, visto 80k veces


Parte B - Discusiones del foro

(B.1) ¿Por qué el dispositivo MCP23S17 se calienta demasiado de forma repentina y aleatoria Raspb 4A? - Eugenia Suárez EE SE 2020jul17

(B.2) ¿Necesito protección de pines GPIO MCP23S17 contra ESD de bloqueo dentro de este circuito? - Eugenia Suárez, EE SE, 2020jul29


Parte C - Esquemas

(C.1) mcp23s17_test_2020jul3002 Esquema de CircuitLab - tlfong01 2020jul3001

(C.2) mcp23017_test_v0.2_2020aug0101 PÚBLICO tlfong01 2020aug01


Apéndices

Apéndice A - Condensadores de derivación y desacoplamiento - Robert Keim, AAC

(A.3) Energía limpia para cada IC, Parte 1: comprensión de los condensadores de derivación - Robert Keim, AAC 2015sep21

(A.4) Energía limpia para cada circuito integrado, Parte 2: Elección y uso de sus condensadores de derivación - Robert Keim. CAA 2015sep27

Introducción

No es inconcebible que un estudiante de ingeniería dedicado y exitoso se gradúe de la universidad sin saber casi nada acerca de uno de los componentes más omnipresentes e importantes que se encuentran en los circuitos reales: el condensador de derivación. Incluso los ingenieros experimentados pueden no entender completamente por qué incluyen condensadores cerámicos de 0,1 µF junto a cada pin de alimentación de cada IC en cada placa de circuito que diseñan.

Este artículo proporciona información que lo ayudará a comprender por qué los capacitores de derivación son necesarios y cómo mejoran el rendimiento del circuito, y un artículo de seguimiento se centrará en los detalles relacionados con la elección de capacitores de derivación y las técnicas de diseño de PCB que maximizan su eficacia.


Solución

es conveniente que un problema tan grave pueda resolverse de manera efectiva con un componente simple y ampliamente disponible. Pero, ¿por qué el condensador? Una explicación sencilla es la siguiente: un capacitor almacena carga que se puede suministrar al circuito integrado con una resistencia en serie muy baja y una inductancia en serie muy baja.

Por lo tanto, las corrientes transitorias se pueden suministrar desde el condensador de derivación (a través de una resistencia e inductancia mínimas) en lugar de desde la línea de alimentación (a través de una resistencia e inductancia comparativamente grandes). Para entender mejor esto, necesitamos revisar algunos conceptos básicos relacionados con cómo un capacitor afecta un circuito.

Primero, sin embargo, una breve nota sobre la terminología: los componentes discutidos en este artículo se denominan regularmente " condensadores de derivación " y " condensadores de desacoplamiento ".

Aquí hay una distinción sutil: "desacoplamiento" se refiere a reducir el grado en que una parte de un circuito influye en otra, y "derivación" se refiere a proporcionar una ruta de baja impedancia que permite que el ruido "pase por" un IC en su camino. al nodo de tierra.

Ambos términos se pueden usar correctamente porque un condensador de derivación/desacoplamiento realiza ambas tareas. En este artículo, sin embargo, se prefiere el "condensador de derivación" para evitar confusiones con un condensador de desacoplamiento en serie que se usa para bloquear el componente de CC de una señal.

Un enfoque estándar

El análisis anterior nos ayuda a comprender un esquema de derivación clásico:

un capacitor de 10 µF dentro de una pulgada o dos del IC, y

un condensador cerámico de 0,1 µF lo más cerca posible del pin de alimentación:

El capacitor más grande suaviza las variaciones de baja frecuencia en el voltaje de suministro, y el capacitor más pequeño filtra con mayor eficacia el ruido de alta frecuencia en la línea de alimentación.

Si incorporamos estos condensadores de derivación en la simulación de 8 inversores discutida anteriormente, se elimina el zumbido y la magnitud de la perturbación de voltaje se reduce de 1 mV a 20 µV , ...


derivación fuente de alimentación, fusible


tapa de derivación de fuente de alimentación


interruptor de fuente de alimentación

Apéndice B - Problema de puesta a tierra y solución

(1) Problemas de bucle de tierra y cómo deshacerse de ellos - Tomi Engdahl 2013

(2) Fuente de alimentación RpiZero a través de un conector de alimentación/GPIO de 40 pines o conector microUSB

(3) Problema de conexión a tierra del circuito del botón pulsador Rpi GPIO


conexión a tierra adxl


Apéndice C - Protoplaca antigua MCP23S17/ MCP23017 para pruebas

Estoy pensando en usar mi viejo MCP23S17 o MCP23017 para hacer algunas pruebas. Mirando el desordenado cableado de mi vieja placa MCP23017, ahora recuerdo por qué la última vez dejé de trabajar en SPI MCP23S17 y cambié a I2C MCP23017, porque el cableado de bricolaje es muy complicado y es difícil solucionar problemas de hardware. Para I2C MCP23S17, hay borads de ruptura baratos, diciéndome mucho tiempo haciendo cableado.

cableado mcp23s17


placa mcp23s17


mcp23s17_write_read


mcp23017 frito


mcp23017_frito


Apéndice D - Notas de configuración de la protoplaca MCP23s17

configuración de mcp3s17


rpi4b spi 1


configuración de rpi4b spi 1


prueba de bucle invertido spi 1


Apéndice E: prueba de SPI 00, 01, 10, 11, 12 Bucle invertido y repetición de envío de un byte OK

# Program:
#   spi_loopback_v55.py  tlfong01  2020aug03hkt1220
#
# Function:
#   1. SPI one byte loopback
#   2. SPI repeatedly send one byte
#
# System Config: 
#   Rpi4B buster (r2020may23), python 3.7.3 (r2019dec20), thonny v3.2.7 (r2020jan22)
#   $ date Thu 25 Jun 2020 04:36:13 PM HKT
#   $ uname -a Linux raspberrypi 4.19.118-v7l+ #1311 SMP Mon Apr 27 14:26:42 BST 2020 armv7l GNU/Linux
#   $ ls /dev/ttyUSB* /dev/ttyUSB0
#   $ ls /dev/ttyS0 /dev/ttyS0
#   $ ls /dev/ttyAMA0 /dev/ttyAMA0

# Test Function Definitions:
#
# Test 1 - loopBackTest() - SPI port send and receive one byte.
# Function - Send one byte to MSOI and read it back from MISO.?
# Setup - Connet MOSI pin to MISO pin to form a loop.
#
# Test 2 - repeatSendByte() - SPI port repeatedly send out single bytes. ?
# Function - Repeat many times sending a byte, pause after each byte.

# 1. SPI ports setup notes
# To enable SPI and setup SPI 10, 11, 12 ports, add these two lines to /boot/config.txt
#   dtparam=spi=on
#   dtoverlay=spi1-3cs
# To list SPI devices
#   pi@raspberrypi:~ $ ls /dev/spi*
#   /dev/spidev0.0  /dev/spidev0.1  /dev/spidev1.0  /dev/spidev1.1  /dev/spidev1.2

# 2. Notes of loopback function
#   Call example - testLoopbackOneByte(spiPort00)
#   Function     - send byte 0x5b to SPI MOSI and read byte from MISO
#   Setup        - must connect MOSI pin to MISO pin to loop back
#   Note         - 1. Only checks if MISO echoes MOSI, CS0, CS1, CS2 is not checked
#                  2. To check if SPI 0, CS0, CS1, or SPI1 CS0, CS1, CS2, need a scope to display repeat send bytes 

from time import sleep
import spidev

# *** Setup SPI Ports ***

spiPort00 = spidev.SpiDev()
spiPort00.open(0,0)
spiPort00.max_speed_hz = 100000

spiPort01 = spidev.SpiDev()
spiPort01.open(0,1)
spiPort01.max_speed_hz = 100000

spiPort10 = spidev.SpiDev()
spiPort10.open(1,0)
spiPort10.max_speed_hz = 100000

spiPort11 = spidev.SpiDev()
spiPort11.open(1,1)
spiPort11.max_speed_hz = 100000

spiPort12 = spidev.SpiDev()
spiPort12.open(1,2)
spiPort12.max_speed_hz = 100000

# *** Define SPI Functions ***

def spiSendRecvOneByte(spiPort, sendByte):
  sendByteArray = [sendByte]
  recvByteArray = spiPort.xfer(sendByteArray)  
  return recvByteArray

def loopBackOneByte(spiPort, sendByte):
  recvByteArray = spiSendRecvOneByte(spiPort, sendByte)
  recvByte      = recvByteArray[0]

  print('\nBegin testLoopbackOneByte(),....')
  #print('')
  print('   sendByte = ', hex(sendByte))
  print('   recvByte = ', hex(recvByte))
  #print('')
  print('End testLoopbackOneByte(),....')
  return

def repeatSendOneByte(spiPort, sendByte, pauseTimeBetweenBytes, repeatCount):
  print('\nBegin repeatSendByte(),....')
  print('  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...')
  for i in range(repeatCount):
    spiSendRecvOneByte(spiPort, sendByte)
    sleep(pauseTimeBetweenBytes)
  print('End   repeatSendByte().')
  return

# *** Test Funtions ***

def testLoopbackOneByte(spiPort, dataByte):
  loopBackOneByte(spiPort, dataByte)
  return

def testRepeatSendOneByte(spiPort, dataByte, pauseSeconds, repeatTimes):
  repeatSendOneByte(spiPort, dataByte, pauseSeconds, repeatTimes)
  return
 
# *** Main ***

# *** Test SPI Loopback Functions, Comment out not required tests ***

print('\n*** testLoopbackOneByte(spiPort00, 0x5b) ***', end = '')
testLoopbackOneByte(spiPort00, 0x5b)

#print('\n*** testLoopbackOneByte(spiPort01, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort01, 0x5b)

#print('\n*** testLoopbackOneByte(spiPort10, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort10, 0x5b)

#print('\n*** testLoopbackOneByte(spiPort11, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort11, 0x5b)

#print('\n*** testLoopbackOneByte(spiPort12, 0x5b) ***', end = '')
#testLoopbackOneByte(spiPort12, 0x5b)


# *** Test SPI Repeat Send One Byte Functions, Comment out not required tests ***

# *** SPI 00, 01 Repeat Send One Byte ***

#print('\n*** testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000)

#print('\n*** testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000)

# *** SPI Repeat Send One Byte 10, 11, 12 ***

#print('\n*** testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000)

#print('\n*** testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000)

#print('\n*** testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000) ***', end = '')
#testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000)


# End of program


''' Smple output tlfong 01 2020aug03hkt1219

>>> %Run spi_loopback_v54.py

*** testLoopbackOneByte(spiPort00, 0x5b) ***
Begin testLoopbackOneByte(),....
   sendByte =  0x5b
   recvByte =  0x5b
End testLoopbackOneByte(),....

*** testLoopbackOneByte(spiPort01, 0x5b) ***
Begin testLoopbackOneByte(),....
   sendByte =  0x5b
   recvByte =  0x5b
End testLoopbackOneByte(),....

*** testLoopbackOneByte(spiPort10, 0x5b) ***
Begin testLoopbackOneByte(),....
   sendByte =  0x5b
   recvByte =  0x5b
End testLoopbackOneByte(),....

*** testLoopbackOneByte(spiPort11, 0x5b) ***
Begin testLoopbackOneByte(),....
   sendByte =  0x5b
   recvByte =  0x5b
End testLoopbackOneByte(),....

*** testLoopbackOneByte(spiPort12, 0x5b) ***
Begin testLoopbackOneByte(),....
   sendByte =  0x5b
   recvByte =  0x5b
End testLoopbackOneByte(),....
>>> 
 
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py

*** testRepeatSendOneByte(spiPort00, 0x5b, 0.001, 200000) ***
Begin repeatSendByte(),....
  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py

*** testRepeatSendOneByte(spiPort01, 0x5b, 0.001, 200000) ***
Begin repeatSendByte(),....
  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py

*** testRepeatSendOneByte(spiPort10, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py

*** testRepeatSendOneByte(spiPort11, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Python 3.7.3 (/usr/bin/python3)
>>> %Run spi_loopback_v54.py

*** testRepeatSendOneByte(spiPort12, 0xb5, 0.001, 200000) ***
Begin repeatSendByte(),....
  Now use a scope to display the SPI signals, MOSI, MISO, CSn, ...
End   repeatSendByte().
>>> 
 
'''
 
# *** End ***

Apéndice F - Repetir capturas de pantalla del alcance del byte de envío

repetir enviar byte 1/3


repetir enviar byte 2/3


repetir enviar byte 3/3


Apéndice G - Configuración de dos placas MCP23S17 Proto

doble mcp23s17

fin de respuesta

Sí, estaba haciendo mis pruebas en una fase de prueba en la que el puerto A es solo de entrada y el puerto B solo de salida. He leído su comentario sobre el uso de rieles Raspberry para el suministro de voltaje y suena interesante. Eres la primera persona que se ha referido a este hecho. Estaba usando una fuente externa hace 2 días y no aparece ningún sobrecalentamiento desde ese día. Estoy demasiado agradecido por su excelente y detallada descripción. Lo que dices sobre 3 puntos. Sobre corriente aparece cuando se sobrecalienta. Este es un consumo normal. Mis operaciones de escritura y lectura tienen menos de 1 mA de consumo de corriente. Todavía estoy leyendo la publicación completa.
Sí, una razón más para no usar el riel de alimentación de 5 V de Rpi es: (1) Si configura muchos pines GPIO MCP23S17 con una gran carga alta al mismo tiempo, habrá un gran consumo repentino de corriente, lo que provocará una caída en la potencia de Rpi. riel, digamos que si es inferior a 4.5V, Rpi podría volverse loco y cualquier cosa puede pasar. Verá que estoy usando un capacitor de paso de 10,000 uF de gran capacidad para evitar que la fuente de alimentación fluctúe. (2) Un truco que puede hacer es no encender/apagar los pines GPIO todos al mismo tiempo, sino secuencialmente, hacer una pausa de 1 a 10 milisegundos uno tras otro , por lo que la gran cantidad de corriente será muchas veces menor.
También puede notar que estoy usando un voltímetro para monitorear la fuente de alimentación, un polifusible y un fusible lento para proteger sobre la corriente, y el interruptor de alimentación rojo, que es una especie de "mango de hombre muerto del conductor del tren". Cada vez que huelo a plástico quemado, o el humo blanco se eleva, encenderé el interruptor rojo tan rápido como un rayo, como el luchador de kung fu. youtube.com/watch?v=jhUkGIsKvn0 :)
No soy ningún luchador de kung fu, y mis manos están temblando, casi siempre demasiado tarde para reaccionar cuando veo humo blanco o huele a plástico. Así que frio papas fritas a menudo. Busqué en mi informe de laboratorio y encontré un MCP23017 frito (¡No me pregunten cuántos MCP23017 he frito!): raspberrypi.org/forums/… . Salud.
¡Gracias! Pero mi circuito no debe tener un alto consumo, el consumo total de 16 pines llega a 0,25 mA. Me temo que el consumo loco suena como un cortocircuito interno (diodos de sujeción MCP o TRT que no deberían encenderse pero encienden y GND-VDD se cortocircuitaron). Pero la pregunta era: ¿por qué o qué están haciendo esto? Entonces, la gente me sugirió que tuviera problemas de "bloqueo" de la tecnología CMOS.
Un par de preguntas cortas. (P1) ¿Tiene otra placa proto cableada para realizar pruebas de intercambio? (P2) ¿Tiene más de un chip MCP23S17 para realizar pruebas de intercambio? (P3) ¿Alguna vez encendió MCP23S17 u otros dispositivos con 5 V y conectó los pines Rpi GPIO a esos dispositivos (podría causar un bloqueo)? (P4) ¿Tiene un esquema completo que muestre todas las conexiones posibles, como qué GPIO puede conectarse a qué GPIO o tierra? (P5) ¿Tiene una lista completa de programas o un gráfico de jerarquía de funciones que muestre qué funciones se relacionan con MCP23S17?
Entiendo que es posible que no le guste mostrar su lista de programas al público, porque es confidencial para la empresa. (P6) ¿Es posible cambiar a SPI 23S08 o I2C MCP23008 o MCP23017? He estado jugando con MCP23x08 y MCP23x17 porque a menudo me quedaba atascado en algún lugar y no podía encontrar el motivo, así que cambié de I2C a SPI o viceversa, solo para comprobar si me perdí algo importante. (P7) ¿Es posible cambiar al controlador I2C PCA9685 PWM?
Perdón por la larga lista de sugerencias y errores tipográficos. Sólo pensando en voz alta lluvia de ideas. Por cierto, una cosa más, solo para repetir, si tiene ESD o se bloquea, casi siempre el resultado es una muerte instantánea y no recuperable. Por lo tanto, no es probable que su sobrecalentamiento y congelación aleatorios e intermitentes se bloqueen, pero tal vez estén relacionados con el software, solo una suposición descabellada, no estoy seguro en absoluto. Buena suerte y ánimo.
Sin embargo, una cosa más. Hace algún tiempo descubrí que los pines SPI de mi Rpi3B+ estaban fritos, pero todo lo demás seguía funcionando bien. Desde entonces, siempre pruebo dos buses SPI al mismo tiempo, así que verán que estoy probando SPI, 00. 01, 10, 11, 12 al mismo tiempo. Normalmente empiezo con SPI 0,0 y para solucionar problemas, cambio a SPI 1,0 para comparar y contrastar. Quizás también pueda probar SPI 10, 11, 12 o incluso SPI 3, 4, 5, etc.
No entiendo por qué su carga total de MCP23S17 es solo de 0,25 mA. ¿Está manejando ULN2803A que a su vez maneja relés para motores de inducción de CA de gran corriente AC220V? Entonces es posible que tenga grandes aumentos de nivel y necesite usar diodos TVS para suprimirlos. También es posible que deba usar aislamiento óptico para evitar sobretensiones/ruidos que se retroalimentan a través de las líneas de tierra. Entonces podría considerar el aislamiento óptico total en el lado del relé/SSR. Consulte esta publicación para obtener más detalles: electronics.stackexchange.com/questions/505318/… . Salud.
Hola @tlfong01, estamos usando 3.3V para el suministro de MCP. a) no, no lo hacemos. b) no, solo tenemos uno y es de 3.3V. c) No, los pines VDD Raspberry Pi están conectados antes de encender todo. Por lo tanto, se nota que el sobrecalentamiento aparece horas después de estar funcionando bien sin detener la ejecución del interruptor de control. d)e) el esquema completo es lo que cargo. Los cables se conectan durante la ejecución como debe ser así en una operación real. los usuarios tomarán el extremo del cable y lo colocarán sobre otros puntos (que recibirán los cables de entrada a través de los conectores). Puerto A = entradas, PUERTO B = salidas. Intentaré compartir el código de Python pronto.
Estoy usando funciones de abstracción de alto nivel de la biblioteca de código abierto MCP23S17.py. Sobre tu duda de consumo creo que es algo obvio. 3.3V/100KOhms = 35uA (Rpull interno = 100K). Dado que las cargas de salida son las entradas del mismo dispositivo, se producirá un pequeño consumo total.
Muchas gracias por tu aclaración. Todavía hay algunas cosas más que necesito aclarar, por ejemplo. la corriente 3.3V/100k = 35uA . Tengo la sensación de que podríamos tener un fuerte desacuerdo aquí. Creo que necesito pensar mucho antes de presentar mi argumento.
Solo una nota rápida sobre ESD y Latching up. Es posible que desee leer Ref A1.5 en su tiempo libre. Sin embargo, nada urgente o importante. Este artículo es útil para mí porque solo conozco quizás solo el 20% de la imagen completa o el rompecabezas de ESD y Latch up Por cierto, miro sus comentarios anteriores y creo que es posible que haya leído artículos similares y, por lo tanto, debe ser viendo el 50% o más de la imagen. Ten un excelente fin de semana. Salud.
Gracias @ tlfong01, ¿a qué te refieres con Ref A1.5? ¿Es el título del artículo? Pasé algunos días tratando de reproducir la activación del pestillo pero ya no volvió, incluso con una gran tormenta eléctrica, y no sucedió nada malo. Estaba usando la fuente de Raspberry, pero no ocurrió el problema. Le he puesto un osciloscopio a Vin para ver si en algún momento cae o no el voltaje. Pero no lo hizo, también. Lo único que no hago es tocar los cables con las manos. Tal vez cuando manejo proto con mis manos, los cables de Vin han experimentado algún tipo de falta de contacto y, por lo tanto, Vin estaba teniendo fallas.
Necesito ver un poco más e intentar tocar los cables. Este es mi siguiente paso. Necesito ver si Vin se ha caído cuando se activa el "enganche". Pero también leeré el documento si lo encuentro. Gracias.
@Eugenia Suarez, Solo una respuesta rápida. (1) Lo siento, "Ref A 1.5" es un error tipográfico, debería decir "A.15" en mi lista de referencias. (2) Creo que "engancharse" es como una avalancha de montaña nevada, o romper el lomo del camello con la última gota. No podrá detectar el gatillo o la ruptura de las piernas (la unión del mos se rompe dentro del chip) hasta que sea demasiado tarde. (2) Por ejemplo, si conecta un pin Rpi GPIO con una resistencia en serie, digamos, incluso 10M Ohm a 5V, el disipador de corriente en el pin GPIO puede ser muy pequeño, pero romper una unión no necesita una gran corriente, es la pequeña "grieta" que se expande a gran desastre.
O puede intentar lo siguiente: "Siete pasos de depuración - @Tony Stewart Sunnyskyguy EE75": electronics.stackexchange.com/questions/516359/… . (1) Investigar (2) Medir todo lo relevante (3) Comparar con las especificaciones de los componentes (4) Continuar hasta el error (5) Analizar (6) Corregir (7) Validar si no Repetir. Ten un excelente fin de semana. O pruébame el único truco de solución de problemas del perezoso solucionador de problemas. Buena suerte y salud.
Una vez jugué con un kit de contador Guiger de juguete para aficionados, generando más de 2kV. Tal vez eso puede generar carga eléctrica estática para usted. O simplemente EMI, no estoy seguro: Refs 1: ¿Cómo puede una chispa de CC crear ondas EM? electronics.stackexchange.com/questions/517219/…
+1. Bonito detalle. || Re "... las posibilidades de contraer el virus ESD son muy, muy pequeñas". -> Los circuitos integrados modernos tienden a ser menos propensos a sufrir daños por descargas electrostáticas (ESD) que en los "buenos viejos tiempos", PERO la ESD aún puede ser problemática en algunos entornos. Uno puede tener 'suerte' y no darse cuenta y un cambio de ambiente puede causar estragos. El uso, por ejemplo, de láminas de goma butílica (utilizadas para techos) como tapete de banco, y aún más baratas las láminas de embalaje exteriores, proporciona una mesa de trabajo de baja ESD. La alfombra puede ser desagradable; una alfombrilla de goma de butilo puede ayudar. (Hace mucho tiempo tuvimos un porcentaje muy grande de fallas de EPROM, que se descubrió que se debían a ESD.