¿Se puede usar I2C con sensores momentáneos?

[editar: aclarar la pregunta] ¿Es posible ver eventos en esclavos I2C, o un equivalente funcional?

Estoy pensando en un nuevo proyecto. Estoy usando un ESP-12F como placa lógica principal para controlar y recibir entradas de varios módulos conectados (por ejemplo, botón pulsador, sensor de haz, válvula solenoide, disparador del obturador) Cada módulo (esclavo) está basado en PIC y se comunica con el ESP- 12 (maestro) usando I2C. El envío de comandos para válvulas y disparadores a través de I2C es sencillo. Sin embargo, no estoy seguro de cómo utilizar I2C para eventos momentáneos activados por esclavos.

¿Debería seguir enviando solicitudes de estado a esos módulos y buscar cambios de esa manera? También estoy considerando usar la lógica XOR para cambiar el nivel de otra línea, que puedo detectar a través de una interrupción para activar la solicitud de estado.

Mi dispositivo es sensible al tiempo, me gustaría obtener una respuesta a un disparador de entre 50 y 100 microsegundos.

Soy nuevo en todo esto, así que siéntete libre de corregirme en cualquier cosa fundamental que me esté perdiendo.

Haga una pregunta, las personas no pueden responder si no tienen una pregunta directa que responder. electronics.stackexchange.com/help/how-to-answer Esta publicación parece estar basada principalmente en opiniones, hay muchas maneras de lograr lo que quieres lograr. ¿Quieres la mejor manera?

Respuestas (4)

Los términos del arte aquí son Sondeo , es decir, verificar repetidamente el sensor en busca de cambios, frente a Interrupción , recibir alertas a pedido de un cambio.

No, I2C no proporciona un protocolo de interrupción directamente. Un subconjunto de I2C, llamado SMBUS, lo hace. Tiene el SMBALERT#, en el que el dispositivo host tiene un solo pin de interrupción al que se pueden conectar todos los dispositivos esclavos y, cuando se activa, el host leerá la dirección de respuesta de alerta especial (0001 100x) y cualquier esclavo que tenga una solicitud pendiente. alerta escribirá su dirección específica. Luego, el host lee directamente de él. Si hay más de una Alerta pendiente, se lleva a cabo el arbitraje y el Host deberá leer el ARA varias veces.

Buen truco, puede omitir el pin de interrupción y sondear desde el ARA de todos modos, y solo si obtiene una dirección válida intenta leer desde el esclavo. Esto puede reducir la cantidad de veces que intenta sondear, si tiene varios dispositivos esclavos.

Por supuesto, puede implementar esto en I2C con bastante facilidad, si puede programar los dispositivos esclavos y el dispositivo host.

Alternativamente , puede hacer que todos los microcontroladores sean maestros y esclavos, implementando una configuración I2C Multi-Master . Haga que los módulos se conviertan en maestros y escriban en su dispositivo principal. Luego, su dispositivo principal cambia al modo maestro, para volver a leer.

O simplemente deje su dispositivo principal como esclavo y haga que los módulos como maestros escriban en él según sea necesario.

¡Fantástica información, gracias! Echaré un buen vistazo a SMBUS. Durante un tiempo había considerado usar dos canales I²C, pero los microcontroladores con dos canales I²C de hardware eran más caros y no pude encontrar mucha información sobre cómo golpear un dispositivo esclavo (solo muchos ejemplos de dispositivos maestros). Sin embargo, no estaba pensando en cambiar los roles de los dispositivos en un solo canal... También, una idea interesante sobre invertir el rol maestro/esclavo. No creo que funcione en mis requisitos porque mis módulos serán una mezcla de dispositivos/sensores de entrada y salida.

El bus I 2 C per se no tiene la capacidad de que un esclavo alerte al maestro de forma asíncrona.

Puede sondear al esclavo, si eso se ajusta a sus requisitos (latencia, por ejemplo).

Puede agregar líneas separadas para dispositivos esclavos para alertar al maestro de forma asíncrona. Estas líneas estarían fuera de banda con respecto al bus I 2 C (no formarían parte del bus I 2 C en sí). Por ejemplo, aquí hay un expansor de E/S I2C estándar PCA9554 , que tiene una salida de alerta.

Gracias, es bueno saber que mi pensamiento estaba bastante encaminado. Buen enlace al chip PCA9554 también. Mis módulos se conectarán en serie a través de contactos externos, por lo que me gustaría obtener todo a través de las líneas I²C o, como máximo, otra línea que todos los módulos puedan compartir. Pero ahora que sé sobre el paralelo expandido que definitivamente puede ayudarme a tomar algunas decisiones, ¡gracias!

Para una línea de interrupción/solicitud, no usaría XOR, ya que dos solicitudes simultáneas se cancelarían. Si desea tener una línea de solicitud/interrupción común, use cable-OR: haga que los controladores se abran y drenen con un pull-up (al igual que las líneas I2C) alimentados a una entrada de interrupción activa baja en su MCU. De esta manera, cuando alguno de tus esclavos se acerque tanto, tu amo sabrá encuestar a todos.

¡Buen punto! No había pensado en eventos simultáneos. No es que sea muy probable, pero habría sido doloroso rastrear un error tan difícil de reproducir como ese.

Un chip como el PCF8575 proporciona expansión de entrada y salida I2C con funcionalidad de interrupción incorporada.

Gracias, todavía no me he encontrado con ese. ¡Lo miraré!