Table of Contents
Introdução ao I2C e SPI com microcontroladores PIC
Os microcontroladores da família PIC da Microchip são amplamente utilizados em sistemas embarcados, desde nós de sensores simples até controladores industriais complexos. Uma habilidade fundamental para qualquer desenvolvedor incorporado é a capacidade de interface periféricos usando protocolos de comunicação serial. Dois dos mais comuns são I2C (circuito integrado) e SPI (Inter-Inter-Inter-Integrated Circuit) e SPI (Serial Peripheral Interface). Dominar esses protocolos permite conectar sensores, chips de memória, monitores, ADCs e muitos outros dispositivos ao seu design PIC com fiação mínima e alta confiabilidade.
Este artigo fornece um guia prático e aprofundado para implementar I2C e SPI em microcontroladores PIC. Vamos cobrir configuração de hardware, configuração de registro, sequências de código típicas e técnicas de depuração comuns. No final, você terá o conhecimento para adicionar com confiança a comunicação serial ao seu próximo projeto PIC.
Visão geral da I2C e da SPI
Ambos os protocolos são ônibus seriais síncronos, mas diferem em arquitetura, velocidade e aplicação.
I2C (circuito inter-integrado)
O I2C usa apenas dois fios: ]SDA (Dados Seriais) e SCL[ (Relógio Serial). Cada dispositivo no autocarro tem um endereço único de 7 bits ou 10 bits, e a comunicação é master-slavo. O mestre gera o relógio e inicia transações. Vários mestres podem partilhar o autocarro com arbitragem. O modo padrão é executado a 100 kHz, o modo rápido a 400 kHz e o modo de alta velocidade até 3.4 MHz. O I2C é ideal para periféricos que não requerem velocidade de clarão, tais como sensores de temperatura, relógios em tempo real, EEPROMs e pequenos monitores.
Como só são necessários dois fios, o I2C economiza pinos de E/S, tornando-o atraente para pequenos PICs. No entanto, o protocolo é mais complexo do que o SPI por endereçar, reconhecer bits e esticar o relógio.
SPI (Interface Periférica Serial)
O SPI usa quatro linhas: MOSI (Master Out Slave In), MISO[ (Master In Slave Out), SCLK[ (Serial Clock), e SS[ (Slave Select). É um barramento completo – os dados são enviados e recebidos simultaneamente. O mestre gera o relógio e seleciona o escravo puxando o pino de seleção de chips (SS) baixo. O SPI é significativamente mais rápido do que o I2C, com velocidades em dezenas de MHz, e é o protocolo de escolha para dispositivos de alto rendimento, tais como cartões SD, monitores gráficos, ADCs e potenciómetros digitais.
SPI é mais simples de implementar em hardware, mas requer mais pinos – uma linha SS dedicada por escravo. Muitos microcontroladores PIC incluem um módulo dedicado Master Synchronous Serial Port (MSSP) que pode ser configurado para I2C ou SPI.
Considerações sobre hardware para I2C e SPI
Antes de mergulhar em código, você deve fazer o hardware certo.
Resistores de elevação: As linhas I2C são abertas; requerem resistências de elevação externas (normalmente 4,7 k
Níveis de tensão: Certifique-se de que o seu PIC e o periférico operam na mesma tensão lógica (por exemplo, 3,3 V ou 5 V). Se diferirem, use metamorfos de nível como SparkFun BOB-12009 ou um circuito MOSFET simples.
Comprimento do bus e carregamento capacitivo: Para fios mais longos (acima de algumas polegadas), mantenha a capacidade do barramento abaixo do máximo especificado na sua folha de dados PIC (]PIC16F1xxx datasheet[ frequentemente declara 400 pF para I2C).Para SPI, linhas mais longas podem causar reflexos de sinal; use taxas de relógio mais lentas e cabos blindados, se necessário.
Capacitores de desacoplamento:] Colocar capacitores 0,1 μF perto dos pinos de alimentação de cada CI para suprimir ruído que pode corromper dados.
Configuração I2C em Microcontroladores PIC
A maioria dos PIC modernos incluem o módulo Master Synchronous Serial Port (MSSP) que suporta tanto o I2C quanto o SPI. Vamos focar no MSSP no modo mestre I2C para um PIC típico de 8 bits (p. ex., PIC16F18877).
Registos de Chaves para I2C
- SSPxADD – Valor de recarga do gerador de taxa Baud. A frequência do relógio I2C é derivada do relógio do sistema utilizando uma fórmula: FSCL[ = FOSC[ / (4 * (SSPxADD + 1)). Para 100 kHz com um oscilador de 16 MHz, SSPxADD = 39.
- SSPxSTAT – Registo de estado. Os bits indicam colisão de barramento, gravação de colisão e se foi detectada uma condição de início/parada.
- SSPxCON1 – Registo de controlo 1. Seleciona o modo I2C (master, slave) e activa o módulo.
- SSPxCON2 – Controle de modo mestre. Comandos para enviar Iniciar, Reiniciar, Parar e reconhecer.
- SSPxBUF – Tampão de dados. Escreva para enviar, ler para receber.
Sequência de Inicialização Mestre I2C
- Desactivar o módulo MSSP, limpando o bit SPEN (SSPxCON1<5>).
- Definir o modo mestre I2C (normalmente 0x08 em bits SSPxCON1 <3: 0& gt;).
- Configure a taxa de baud carregando SSPxADD com o valor adequado.
- Configure os pinos SDA e SCL como entradas com puxões fracas (ou use resistores externos).
- Activar o módulo ao definir o SSPEN.
- Opcionalmente, habilite interrupções para o MSSP.
Exemplo: Leitura de um sensor de temperatura LM75
O LM75 tem um endereço de 7 bits (normalmente 0x48 para os pinos A0-A2 aterrados). Para ler o registo de temperatura (ponto 0x00), primeiro deve escrever o ponteiro, depois gerar um arranque e leitura repetidos.
Sequência do ponteiro: Início → byte do endereço (0x90) → esperar ACK → byte do ponteiro (0x00) → esperar por ACK → Stop.
Sequência da temperatura: Início → byte do endereço (0x91) → esperar por ACK → ler dois bytes (MSB, LSB) → NACK no último byte → Stop.
]
Cada troca de byte requer a votação do registo SSPxSTAT para o bit BF (Buffer Full) e a opção SSPxIF interromper. Um erro comum é esquecer de enviar o ACK/NACK após receber dados. Use o ACCDT[ e ACCKEN[] bits no SSPxCON2 para controlar o reconhecimento.
Pistácios I2C comuns
- Esticamento do clock: Alguns escravos mantêm SCL baixo para retardar o mestre. Habilite o suporte do alongamento do relógio no MSSP (configurar o ]CKP[] bit apropriadamente).
- Coisões de barramento: Se outro mestre tentar conduzir o barramento, o MSSP define a bandeira BCLIF. Use isto para tentar novamente a transação.
- Bus de estocada: Se um escravo não liberar SDA após uma transmissão, o ônibus pode ser suspenso. Implemente um tempo limite que envia nove pulsos de relógio para recuperar.
Configuração do SPI em Microcontroladores PIC
O MSSP também pode operar no modo mestre ou escravo SPI. Vamos cobrir o modo mestre, que é mais comum.
Registros de chaves para SPI
- SPIxBRG – Gerador de taxa de Baud. Para SPI, a frequência do relógio é FOSC[ / (2 * (SPIxBRG +1).
- SPIxSTAT – Registro de status. Contém o bit BF, escrever colisão, receber bandeiras de transbordamento.
- SPIxCON1 – Registo de controlo 1. Seleciona mestre/escravo, polaridade do relógio (CKP), fase do relógio (CKE) e ponto de amostra (SMP).
- SPIxCON2 – Controlo adicional (por exemplo, modo de moldura, activação SS2).
- SPIxBUF – Tampão de dados para transmissão e recepção (buffered).
Sequência de Inicialização Mestre SPI
- Desactivar o módulo SPI (limpar SSPEN).
- Definir a polaridade e fase desejadas do relógio. Mode 0 (CKP=0, CKE=1) é o mais comum: os dados são amostrados na borda ascendente e deslocados na borda descendente.
- Configurar a taxa de baud em SPIxBRG. Para 1 MHz com um relógio de 16 MHz, SPIxBRG = 7.
- Selecione o modo mestre (bits SSPM = 0b0000 para SPI master, clock = FOSC/4).
- Defina a direção do pino SS. Em muitos PICs, o pino SS é uma entrada dedicada no modo mestre. Para a seleção de escravos, você deve alternar um pino GPIO separado conectado ao chip-selecionado do escravo.
- Activar o módulo.
Exemplo: Conexão com um ADC de 8 canais MCP3008
O MCP3008 é um ADC de 10 bits que se comunica via SPI no modo 0. Para ler um canal (por exemplo, canal 0), o mestre envia três bytes: um bit de início, um bit de terminal/diferencial e o endereço do canal. O escravo retorna simultaneamente dois bytes de dados.
Sequência de transação:
]
1. Dirija SS baixo.
2. Escreva 0x01 (bit inicial) para SPIxBUF – espere que o bit BF fique limpo.
3. Escreva (canal □ 0x80) para SPIxBUF – leia o primeiro bytes de lixo da transferência anterior.[
4. Escreva 0x00 (dummy) para SPIxBUF – leia os 8 bits altos do resultado de conversão.
5. Escreva 0x00 novamente – leia os 2 bits baixos e os zeros que se seguem.
6. Dirija SS alto.
Note que cada gravação para SPIxBUF desencadeia uma recepção simultânea. Você deve ler o buffer após cada gravação para evitar o transbordamento.
Gerenciando vários escravos SPI
Cada escravo requer um pino único para selecionar o chip. Use um GPIO por escravo. Certifique-se de que há um pequeno atraso entre mudar o pino SS e iniciar o relógio para atender aos requisitos de tempo de configuração do escravo. Muitos PICs permitem que você use o pino SS para geração automática para seleção de escravos apenas no modo escravo; no modo mestre você deve fazê-lo manualmente.
Depurando a Comunicação I2C e SPI
Quando as coisas não funcionam, siga uma abordagem metódica:
- Use um analisador lógico ou osciloscópio. Esta é a ferramenta de depuração mais eficaz. Verifique se o relógio está presente, as transições de dados ocorrem e os endereços estão corretos. Para I2C, verifique as condições de início/parada e reconheça bits.
- Verifique resistências de tração. Se SDA ou SCL permanecerem baixos, você pode ter um dispositivo segurando o ônibus. Desconecte todos os escravos, exceto um e tente novamente.
- Verifique a taxa de baud. Medir o sinal do relógio com um escopo. Para I2C, a frequência do relógio deve estar dentro da especificação do escravo.
Examine o endereço e os bytes de comando. Um erro comum é enviar um endereço de 7-bits sem mudar para a esquerda por um (o bit R/W vai para o LSB). Lembre-se que o bytes de endereço é (endereço << 1) .- Para SPI, verifique a polaridade e a fase do relógio. Muitos escravos são sensíveis ao modo exato. Consulte a ficha de dados do escravo. Também assegure que a linha de seleção do chip esteja ativada e orientada de acordo.
Se a depuração de hardware revelar formas de onda corretas, o problema pode estar no seu firmware. Use LEDs de depuração ou uma consola serial para imprimir registos de estado. Muitas placas de desenvolvimento PIC incluem um programador/depurador a bordo (por exemplo, MPLAB PICkit 4) que pode ajudá-lo a passar pelo código.
Bit-Banging de software como um backup
Se o periférico de hardware estiver indisponível ou se você tiver que usar um PIC que não possua um MSSP, você pode implementar I2C ou SPI em software usando pinos GPIO. Para o bit-banging I2C, você alternar SDA e SCL diretamente, respeitando os atrasos de tempo. Para SPI, você muda bits para fora através de um GPIO e simultaneamente lê o pino de entrada. Bit-banging é flexível, mas consome ciclos de CPU e é mais lento. É também uma boa maneira de aprender o protocolo em um nível baixo.
Tópicos Avançados
Afinação de velocidade multi-mestre e relógio I2C
Quando vários mestres compartilham o barramento, você deve lidar com a arbitragem cuidadosamente. O MSSP no PIC suporta o modo multi-master; ele monitora o barramento e irá renunciar ao controle se outro mestre enviar dados. Use a interrupção de colisão de barramento (BCLIF) para detectar perda de arbitragem e tentar novamente após um atraso aleatório.
Para I2C mais rápido (por exemplo, 400 kHz), habilite o controle de taxa de giro nos pinos de saída (se disponível) e use resistores de tração mais fortes (por exemplo, 2,2 k
SPI Daisy-Chaining e DMA
Alguns dispositivos SPI suportam a cadeia-de-margaridas, onde a saída de dados (MISO) de um dispositivo alimenta a entrada (MOSI) do próximo. Isto permite que vários escravos com uma única linha de seleção de chips. O MSSP pode lidar com a cadeia-de-margaridas se os dispositivos o apoiarem.
Para SPI de alta velocidade, considere usar o controlador de acesso direto de memória (DMA) do PIC (disponível em muitos PICs mais recentes). DMA pode transferir dados para/a partir do buffer SPI sem intervenção de CPU, libertando o núcleo para outras tarefas. O periférico DMA é configurado com fonte, destino e contagem, então desencadeado pela interrupção SPI.
Conclusão
I2C e SPI são ferramentas essenciais em qualquer kit de designer incorporado. Com o módulo MSSP flexível encontrado na maioria dos microcontroladores PIC, a implementação desses protocolos é simples uma vez que você entende os parâmetros de configuração e tempo do registro. Sempre comece com um teste simples – um ciclo de gravação/leitura dummy – para verificar sua base de hardware e software.
As fichas de dados permanecem como o seu melhor amigo: as fichas de dados oficiais da Microchip fornecem mapas de registo exactos e diagramas de tempo. As notas de aplicação como AN734 (Dicas I2C) e AN1009[] (Uso SPI) são recursos valiosos. Pratique com um painel de desenvolvimento e um analisador lógico, e você ganhará rapidamente confiança na adição de qualquer periférico I2C ou SPI aos seus projetos baseados em PIC.