Esta es una pregunta de referencia. He eliminado un par de comentarios que lo hicieron menos obvio. (La pregunta es respondida por el autor de la pregunta).
Nick Gammon
Respuestas:
10
Este tutorial que di en la Conferencia Embedded Linux trata de responder las preguntas, proporcionando enlaces a una descripción más detallada de los temas abordados y utilizando el ejemplo práctico de conducir un dron 4WD, donde un Arduino Mini Pro actúa como esclavo y controla las 4 ruedas independientes . El documento original se puede encontrar aquí .
Nota: Esta respuesta está actualmente en progreso, ya que adapto los aspectos más destacados del enlace.
Aplicaciones típicas del bus I2C
Interfaz con periféricos relativamente lentos. Ej: sensores, actuadores mecánicos.
Controlando periféricos "rápidos", que usan otros canales para intercambiar datos. Ej: códecs.
En una PC, el sistema operativo generalmente interactúa sobre I2C con:
medidores de temperatura y voltaje de batería;
controladores de velocidad del ventilador;
códecs de audio.
En caso de que haya varios controladores de bus disponibles, los periféricos se agrupan por velocidad, de modo que los más rápidos no son penalizados por los más lentos.
Una introducción rápida al bus I2C: características clave
Bus serie
Solo 2 líneas: Serial CLock y Serial DAta (más tierra).
4 velocidades: 100kHz, 400kHz, 1MHz, 3.2MHz.
Típicamente, 1 dispositivo maestro y 1 o más esclavos.
Las comunicaciones siempre son iniciadas por un dispositivo maestro.
Varios maestros pueden coexistir en el mismo bus (multimaestro).
Drenaje abierto: tanto SDA como SCL necesitan resistencias pull-up.
"Estiramiento de reloj"
El maestro controla SCL, pero un esclavo puede mantenerlo presionado (porque abre el drenaje), si necesita ajustar la velocidad.
El maestro debe verificar este escenario.
Un esclavo puede atascarse y atascar el bus: es necesario restablecer las líneas del maestro al esclavo.
Por lo general, el direccionamiento de 7 bits, pero también es compatible con 10 bits.
Protocolo lógico: los niveles de voltaje reales no se especifican y dependen de implementaciones individuales. Ej: 1.8V / 3.3V / 5.0V
RTOS: preferencia, tareas, semáforos, tic de sistema dinámico, etc.
Huella pequeña: el enlace solo utiliza código / datos.
Distinción entre RTOS y BSP a través de HAL.
GPLv3 para uso no comercial.
Desarrollado activamente, pero ya maduro.
Admite AVR de 8 bits.
Sin embargo, tenía un soporte BSP limitado para AVR, falta de: - interrumpe el controlador para GPIO AVR (agregado). - Soporte I2C para el modo esclavo AVR (personalizado). Que tuvo que desarrollarse por separado como parte del Drone SW para el AVR .
Definiendo los Parámetros de Comunicación
Para cada rueda:
Ciclo de trabajo de la señal PWM utilizada para controlarlo: 1 byte. 0xFF = par máximo / 0x00 = sin par.
Dirección de rotación - 1 byte.
0x00 = inactivo
0x01 = reverso
0x02 = adelante
0x03 = bloqueado
Período promedio entre ranuras del codificador óptico: 2 bytes.
Escribir cualquier cosa restablece la medida.
Índice de parámetros - 1 mordisco:
0 = ciclo de trabajo
1 = dirección
2 = Periodo promedio
Índices de rueda - 1 mordisco:
0 = trasero izquierdo
1 = trasero derecho
2 = Delantero derecho
3 = Frente izquierdo
4 = todos
Sub Protocolo: Definiendo los Registros
Formato de registro: 0xαβ
- α = Índice de parámetro - β = Índice de rueda
Dirección (elegida arbitrariamente): 0x10
Formato de pirata de bus:
- [= bit de inicio -] = bit de finalización - r = byte de lectura - dirección veces 2 (desplazamiento a la izquierda 1), para bit R / W
Ejemplo: en formato Bus Pirate
[i2c_addr reg_addr = (parm, rueda) reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
Respuestas:
Este tutorial que di en la Conferencia Embedded Linux trata de responder las preguntas, proporcionando enlaces a una descripción más detallada de los temas abordados y utilizando el ejemplo práctico de conducir un dron 4WD, donde un Arduino Mini Pro actúa como esclavo y controla las 4 ruedas independientes . El documento original se puede encontrar aquí .
Nota: Esta respuesta está actualmente en progreso, ya que adapto los aspectos más destacados del enlace.
Aplicaciones típicas del bus I2C
Controlando periféricos "rápidos", que usan otros canales para intercambiar datos. Ej: códecs.
En una PC, el sistema operativo generalmente interactúa sobre I2C con:
En caso de que haya varios controladores de bus disponibles, los periféricos se agrupan por velocidad, de modo que los más rápidos no son penalizados por los más lentos.
Una introducción rápida al bus I2C: características clave
URL de referencia:
Ejemplo de configuración de bus
Características del Protocolo (simplificado)
Ejemplo de tráfico de autobuses
Esclavos personalizados
¿Por qué crear un esclavo I2C personalizado?
¿Cómo diseñar un esclavo I2C personalizado?
Diseño del Master I2C
Criterios de diseño clave:
Depuración: divide y vencerás
Tome el control directo del autobús con un dispositivo ad-hoc. Ejemplos:
Examine el bus con un analizador lógico o un medidor de alcance / avanzado. Ejemplos:
Utilice el depurador de circuito / emulador de circuito específico de esclavo.
Ejemplo: AVR Dragon para chips AVR (Arduino UNO, Nano, Mini, MiniPro)
BUS Pirate
Adaptador USB a I2C
sigrok y pulseview
logotipo de sigrok (componente de fin de semana)
ejemplo de pulseview (visualizador)
Ejemplo de analizador lógico de gama baja
Ejemplo: dirigir un dron 4WD
Prototipo construido con 2 Arduino Mini Pro.
¿Qué hace el esclavo en el ejemplo?
El esclavo I2C:
Diagrama de bloques de alto nivel del esclavo I2C.
Selección del esclavo: Arduino Mini Pro
ICD específico de esclavo: AVR Dragon
Selección del sistema operativo: ChibiOS
Sin embargo, tenía un soporte BSP limitado para AVR, falta de: - interrumpe el controlador para GPIO AVR (agregado). - Soporte I2C para el modo esclavo AVR (personalizado). Que tuvo que desarrollarse por separado como parte del Drone SW para el AVR .
Definiendo los Parámetros de Comunicación
Para cada rueda:
Ciclo de trabajo de la señal PWM utilizada para controlarlo: 1 byte. 0xFF = par máximo / 0x00 = sin par.
Dirección de rotación - 1 byte.
Período promedio entre ranuras del codificador óptico: 2 bytes.
Índice de parámetros - 1 mordisco:
Índices de rueda - 1 mordisco:
Sub Protocolo: Definiendo los Registros
Formato de registro: 0xαβ - α = Índice de parámetro - β = Índice de rueda
Dirección (elegida arbitrariamente): 0x10
Formato de pirata de bus: - [= bit de inicio -] = bit de finalización - r = byte de lectura - dirección veces 2 (desplazamiento a la izquierda 1), para bit R / W
Ejemplo: en formato Bus Pirate
[i2c_addr reg_addr = (parm, rueda) reg_value]
El auto gira en sentido horario.
fuente