Esta é uma pergunta de referência. Excluí alguns comentários que tornaram isso menos óbvio. (A pergunta é respondida pelo solicitante).
Nick Gammon
Respostas:
10
Este tutorial que dei na Embedded Linux Conference tenta responder às perguntas, fornecendo links para uma descrição mais detalhada dos tópicos abordados e usando o exemplo prático de dirigir um drone 4WD, onde um Arduino Mini Pro atua como escravo e controla as 4 rodas independentes . O documento original pode ser encontrado aqui .
Nota: Atualmente, esta resposta está em andamento, pois adapto os destaques do link.
Aplicações típicas do barramento I2C
Interface com periféricos relativamente lentos. Ex: sensores, atuadores mecânicos.
Controlando periféricos "rápidos", que usam outros canais para troca de dados. Ex: codecs.
Em um PC, o sistema operacional geralmente interage pelo I2C com:
medidores de temperatura e voltagem da bateria;
controladores de velocidade do ventilador;
codecs de áudio.
No caso de vários controladores de barramento, os periféricos são agrupados por velocidade, para que os mais rápidos não sejam penalizados pelos mais lentos.
Uma rápida introdução ao barramento I2C - principais recursos
Barramento serial.
Apenas 2 linhas: Relógio Serial e Data Serial (mais terra).
4 velocidades: 100kHz, 400kHz, 1MHz, 3.2MHz.
Normalmente, 1 dispositivo mestre e 1 ou mais escravos.
As comunicações são sempre iniciadas por um dispositivo mestre.
Vários mestres podem coexistir no mesmo barramento (multimestre).
Dreno aberto: o SDA e o SCL precisam de resistores de pull-up.
“Alongamento do relógio”
O mestre controla o SCL, mas um escravo pode pressioná-lo (por exemplo, dreno aberto), se precisar ajustar a velocidade.
O mestre deve verificar esse cenário.
Um escravo pode ficar preso e congestionar o barramento: necessidade de redefinir linhas do mestre para o escravo.
Normalmente, o endereçamento de 7 bits, mas também 10 bits, é suportado.
Protocolo lógico: os níveis reais de tensão não são especificados e dependem de implementações individuais. Ex: 1.8V / 3.3V / 5.0V
RTOS: preempção, tarefas, semáforos, sistema dinâmico de tiques, etc.
Tamanho reduzido: vincule apenas código / dados usados.
Distinção entre RTOS e BSP através do HAL.
GPLv3 para uso não comercial.
Ativamente desenvolvido, mas já maduro.
Suporta AVR de 8 bits.
No entanto, havia suporte BSP limitado ao AVR, falta de: - interrompe o driver dos GPIOs do AVR (adicionado). - Suporte I2C para o modo escravo AVR (personalizado). O qual teve que ser desenvolvido separadamente como parte do Drone SW para o AVR .
Definindo os parâmetros de comunicação
Para cada roda:
Ciclo de trabalho do sinal PWM usado para acioná-lo - 1 byte. 0xFF = torque máximo / 0x00 = sem torque.
Sentido de rotação - 1 byte.
0x00 = inativo
0x01 = reverso
0x02 = encaminhar
0x03 = bloqueado
Período médio entre os slots do codificador óptico - 2 bytes.
Escrever qualquer coisa redefine a medida.
Índice de Parâmetros - 1 mordidela:
0 = Ciclo de Trabalho
1 = Direção
2 = Período médio
Índices das rodas - 1 mordidela:
0 = traseira esquerda
1 = Traseira Direita
2 = Frente Direita
3 = Frente Esquerda
4 = Todos
Subprotocolo: Definindo os Registros
Formato de registro: 0xαβ
- α = Índice de Parâmetros - β = Índice de Rodas
Endereço (escolhido arbitrariamente): 0x10
Formato Bus Pirate:
- [= bit inicial -] = bit final - r = byte lido - tempos de endereço 2 (shift esquerdo 1), para bit R / W
Exemplo - no formato Bus Pirate
[i2c_addr reg_addr = (parm, roda) 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
Respostas:
Este tutorial que dei na Embedded Linux Conference tenta responder às perguntas, fornecendo links para uma descrição mais detalhada dos tópicos abordados e usando o exemplo prático de dirigir um drone 4WD, onde um Arduino Mini Pro atua como escravo e controla as 4 rodas independentes . O documento original pode ser encontrado aqui .
Nota: Atualmente, esta resposta está em andamento, pois adapto os destaques do link.
Aplicações típicas do barramento I2C
Controlando periféricos "rápidos", que usam outros canais para troca de dados. Ex: codecs.
Em um PC, o sistema operacional geralmente interage pelo I2C com:
No caso de vários controladores de barramento, os periféricos são agrupados por velocidade, para que os mais rápidos não sejam penalizados pelos mais lentos.
Uma rápida introdução ao barramento I2C - principais recursos
URLs de referência:
Exemplo de configuração de barramento
Características do protocolo (simplificado)
Exemplo de tráfego de ônibus
Escravos personalizados
Por que criar um escravo I2C personalizado?
Como projetar um escravo I2C personalizado?
Projeto do mestre I2C
Critérios de design chave:
Depuração: Divida e Conquiste
Assuma o controle direto do barramento com um dispositivo ad-hoc. Exemplos:
Bisbilhotar o barramento com um analisador lógico ou um osciloscópio / medidor avançado. Exemplos:
Use o Debugger de circuito / Emulador de circuito específico do escravo.
Exemplo: AVR Dragon para chips AVR (Arduino UNO, Nano, Mini, MiniPro)
BUS Pirate
Adaptador USB para I2C
sigrok e pulseview
Logomarca do sigrok (componente bakend)
exemplo pulseview (visualizador)
Exemplo de analisador lógico low-end
Exemplo: dirigir um drone 4WD
Protótipo construído usando 2 Arduino Mini Pro.
O que o escravo faz no exemplo?
O escravo I2C:
Diagrama de blocos de alto nível do escravo I2C.
Selecionando o escravo: Arduino Mini Pro
CID específico do escravo: AVR Dragon
Selecionando o SO: ChibiOS
No entanto, havia suporte BSP limitado ao AVR, falta de: - interrompe o driver dos GPIOs do AVR (adicionado). - Suporte I2C para o modo escravo AVR (personalizado). O qual teve que ser desenvolvido separadamente como parte do Drone SW para o AVR .
Definindo os parâmetros de comunicação
Para cada roda:
Ciclo de trabalho do sinal PWM usado para acioná-lo - 1 byte. 0xFF = torque máximo / 0x00 = sem torque.
Sentido de rotação - 1 byte.
Período médio entre os slots do codificador óptico - 2 bytes.
Índice de Parâmetros - 1 mordidela:
Índices das rodas - 1 mordidela:
Subprotocolo: Definindo os Registros
Formato de registro: 0xαβ - α = Índice de Parâmetros - β = Índice de Rodas
Endereço (escolhido arbitrariamente): 0x10
Formato Bus Pirate: - [= bit inicial -] = bit final - r = byte lido - tempos de endereço 2 (shift esquerdo 1), para bit R / W
Exemplo - no formato Bus Pirate
[i2c_addr reg_addr = (parm, roda) reg_value]
O carro gira no sentido horário.
fonte