Table of Contents
Introducción a I2C y SPI con microcontroladores PIC
Microcontroladores de la familia PIC de Microchip son ampliamente utilizados en sistemas integrados, desde simples nodos de sensores hasta controladores industriales complejos. Una habilidad clave para cualquier desarrollador integrado es la capacidad de interactuar periféricos utilizando protocolos de comunicación serial. Dos de los más comunes son I2C (Circutor Inter-Integrado) y SPI (Interfaz Periférica Serial).
Este artículo proporciona una guía práctica y detallada para implementar los microcontroladores I2C y SPI. Cubriremos la configuración de hardware, registro de configuración, secuencias de códigos típicas y técnicas comunes de depuración. Al final tendrá el conocimiento de añadir con confianza la comunicación en serie a su próximo proyecto PIC.
Panorama general de I2C y SPI
Ambos protocolos son autobuses seriales sincronizados, pero difieren en arquitectura, velocidad y aplicación.
I2C (Circuente Inter-Integrado)
El sensor I2C utiliza sólo dos cables: SDA] (Datos seriales) y SCL (Clock serial). Cada dispositivo en el autobús tiene una dirección única de 7 bits o 10 bits, y la comunicación es master‐slave. El maestro genera el reloj y inicia transacciones k.
Debido a que sólo se necesitan dos cables, I2C ahorra pins I/O, lo que lo hace atractivo para pequeños PIC. Sin embargo, el protocolo es más complejo que SPI debido a la dirección, reconocer bits y el estiramiento del reloj.
SPI (Interfaz Periférica Serial)
SPI utiliza cuatro líneas: ]MOSI (Master Out Slave In), MISO] (Master In Slave Out), SCLK (Serial Clock), y SS
SPI es más sencillo de implementar en hardware pero requiere más pins – una línea SS dedicada por esclavo. Muchos microcontroladores PIC incluyen un módulo dedicado Master Synchronous Serial Port (MSSP) que puede configurarse para I2C o SPI.
Consideraciones de hardware para I2C y SPI
Antes de bucear en código, debe tener el hardware correcto.
Resistentes de montaje: Las líneas I2C son abiertas; requieren resistencias de arranque externas (típicamente 4.7 kΩ a 10 kΩ) para tirar de SDA y SCL a VDD. El valor depende de la capacidad de autobús y la velocidad. Para autobuses largos o modo rápido pueden resistirse.
Niveles de tensión:] Asegurar que su PIC y el periférico operan en el mismo voltaje lógico (por ejemplo, 3.3 V o 5 V). Si difieren, usen los cambiadores de nivel como el SparkFun BOB‐12009 o un simple circuito MOSFET.
Longitud de los autobuses y carga capacitiva: Para cables más largos (ambos centímetros), mantenga la capacitancia del autobús debajo del máximo especificado en su hoja de datos PIC (]PIC16F1xxxx (con frecuencia, se establece 400 pF para I2C). Para cables de reflexión más largos pueden causar velocidades de señal lentas.
Decoupling capacitors: Lugar 0.1 μF condensadores cerca de los pines de potencia de cada IC para suprimir el ruido que puede dañar datos.
Configuración de I2C en microcontroladores PIC
Los PIC más modernos incluyen el Master Synchronous Serial Port (MSSP) módulo que soporta tanto I2C como SPI. Nos centraremos en el MSSP en el modo maestro I2C para un PIC típico de 8 bits (p. ej., PIC16F18877).
Registros clave para I2C
- SSPxADD] – Valor de recarga de generadores de tasa de baluarte. La frecuencia de reloj I2C se deriva del reloj del sistema utilizando una fórmula: FSCL = F]OSC / (4 * (SSPxADD + 1)).
- SSPxSTAT] – Registro de estado. Los bits indican colisión de autobús, colisión de escritura, y si se ha detectado una condición de inicio/detenimiento.
- SSPxCON1 – Registro de control 1. Selecciona el modo I2C (maestro, esclavo) y permite el módulo.
- SSPxCON2] – Control de modo maestro. Comandos para el envío de Inicio, Reinicie, Pare y reconozca.
- SSPxBUF – El búfer de datos. Escribe enviar, leer para recibir.
Secuencia de inicialización de maestros I2C
- Desactivar el módulo MSSP aclarando el bit SSPEN] (SSPxCON1;5 péngt;).
- Establecer el modo maestro I2C (típicamente 0x08 en bits SSPxCON1 <3:0 comprimidos;).
- Configure la tasa de baud mediante la carga de SSPxADD con el valor adecuado.
- Configurar los pines SDA y SCL como entradas con puntos débiles (o utilizar resistencias externas).
- Permite el módulo estableciendo SSPEN.
- Opcionalmente, permite interrumpir para el MSSP.
Ejemplo: Lectura de un sensor de temperatura LM75
El LM75 tiene una dirección de 7 bits (típicamente 0x48 para los pines A0‐A2 a tierra). Para leer el registro de temperatura (punto 0x00), primero debe escribir el puntero, luego generar un comienzo repetido y leer.
] Inicio → byte (0x90) → espera para ACK → puntero byte (0x00) → espera para ACK → Parar
Leer secuencia de temperatura:
Cada intercambio de bytes requiere la encuesta del registro SSPxSTAT para el bit BF (Buffer Full) y la bandera de interrupción SSPxIF. Un error común se olvida de enviar el ACK/NACK después de recibir datos. Use el ACKDT] y ACKEN] bits en S acknowledgeSPxCON2 para controlar.
Pitfalls comunes I2C
- El estiramiento del reloj: Algunos esclavos mantienen SCL bajo para frenar el maestro. Permite el soporte del reloj estirado en el MSSP (configurar CKP] bit appropriately).
- Colisión de los autobuses: Si otro maestro intenta conducir el autobús, el MSSP establece la bandera BCLIF. Utilice esto para retratar la transacción.
- bus de mierda: Si un esclavo no libera SDA después de una transmisión, el autobús puede colgar. Implementar un tiempo que envía nueve pulsos de reloj para recuperar.
Configuración de SPI en microcontroladores PIC
El MSSP también puede funcionar en modo maestro o esclavo SPI. Cubriremos el modo maestro, que es más común.
Registros clave para SPI
- SPIxBRG – Generador de velocidad de Baud. Para SPI, la frecuencia de reloj es F]OSC / (2 * (SPIxBRG + 1)).
- SPIxSTAT] – Registro de estado. Contiene el bit BF, escribe colisión, recibe banderas de desbordamiento.
- SPIxCON1 – Registro de control 1. Seleccione la polaridad del reloj (CKP), fase del reloj (CKE), y punto de muestra (SMP).
- SPIxCON2 – Control adicional (por ejemplo, modo de marco, SS2 habilitar).
- SPIxBUF – El búfer de datos para transmitir y recibir (comprendido).
Secuencia de inicialización de SPI Master
- Desactivar el módulo SPI (SSPEN claro).
- Establece la polaridad y fase del reloj deseado. Modo 0] (CKP=0, CKE=1) es el más común: los datos se muestra en el borde de aumento y se desplaza en el borde de caída.
- Configure la tasa de baud en SPIxBRG. Para 1 MHz con un reloj de 16 MHz, SPIxBRG = 7.
- Seleccione el modo maestro (provisiones de MSPM = 0b0000 para el maestro SPI, reloj = FOSC/4).
- En muchos PIC, el pin SS es una entrada dedicada en modo maestro. Para la selección de esclavos, debe cambiar un pin GPIO separado conectado al chip-select del esclavo.
- Permite el módulo.
Ejemplo: Interfacing con un MCP3008 ADC de 8 canales
El MCP3008 es un ADC de 10 bits que se comunica a través de SPI en modo 0. Para leer un canal (por ejemplo, canal 0), el maestro envía tres bytes: un poco de inicio, un bit de un solo orden/diferencial, y la dirección del canal. El esclavo simultáneamente devuelve dos bytes de datos.
] 1. Conducir a las SS de baja.
2. Escribe 0x01 (profundidad) a SPIxBUF – espera a que BF se despeje
3. Escribe (canal TEN) a SPILTx [0]
Tenga en cuenta que cada escritura a SPIxBUF activa un receptor simultáneo. Debe leer el búfer después de cada escritura para evitar el desbordamiento.
Gestión de múltiples esclavos de SPI
Cada esclavo requiere un único pin de chip-select. Use un GPIO por esclavo. Asegúrese de que hay un pequeño retraso entre cambiar el pin SS y comenzar el reloj para cumplir con los requisitos de tiempo de configuración del esclavo. Muchos PIC le permiten utilizar el pin de hardware SS para la generación de esclavos automáticos sólo en modo de esclavo; en modo maestro usted debe hacerlo manualmente.
Debugging I2C and SPI Communication
Cuando las cosas no funcionan, siga un enfoque metódico:
- Utilice un analizador lógico o un osciloscopio. Esta es la herramienta de depuración más eficaz. Compruebe que el reloj está presente, las transiciones de datos se producen y las direcciones son correctas. Para I2C, verifique las condiciones de inicio/parada y reconozca bits.
- Verifique resistencias de la tirada. Si SDA o SCL se mantienen bajos, puede que tenga un dispositivo que sostiene el autobús. Desconecte a todos los esclavos excepto uno y vuelva a intentarlo.
- Verificar la tasa de baud. Medir la señal del reloj con un alcance. Para I2C, la frecuencia del reloj debe estar dentro de la especificación del esclavo.
- нерентенния dirección y orden bytes.Sea / fermento Un error común es enviar una dirección de 7 bits sin cambiar a la izquierda por uno (el bit R/W va en LSB). Recuerde que el byte de la dirección es (dirección ненненнненнненненные) не неленые R/W.
- Para SPI, verifique la polaridad y la fase del reloj. Muchos esclavos son sensibles al modo exacto. Consulte la hoja de datos del esclavo. Asegúrese también de que la línea chip-select es activa baja y conducida en consecuencia.
Si el depuración de hardware revela formas de onda correctas, el problema puede estar en su firmware. Use LEDs depuradores o una consola serie para imprimir registros de estado. Muchas tablas de desarrollo de PIC incluyen un programador/debugger a bordo (por ejemplo, MPLAB PICkit 4) que puede ayudarle a pasar por el código.
Software Bit-Banging como un respaldo
Si el periférico de hardware no está disponible o si debe utilizar un PIC que carece de un MSSP, puede implementar I2C o SPI en software utilizando los pines GPIO. Para la producción de bits I2C, se mueve SDA y SCL directamente, respetando los retrasos de tiempo. Para SPI, cambia de bits a través de un GPIO y simultáneamente lee el pin de entrada.
Temas avanzados
I2C Multi‐Master y bloqueo de velocidad de la caja
Cuando varios maestros comparten el autobús, debe manejar el arbitraje cuidadosamente. El MSSP en PIC admite el modo multi-master; monitorea el autobús y renunciará al control si otro maestro envía datos. Use la interrupción de la colisión del autobús (BCLIF) para detectar la pérdida de arbitraje y la reingresación después de un retraso aleatorio.
Para un I2C más rápido (por ejemplo, 400 kHz), permite el control de la tasa de rocío en los pines de salida (si está disponible) y utilizar resistores de la tirada más fuertes (por ejemplo, 2.2 kΩ). Algunos PIC tienen un SSPxADD que se puede configurar a valores más pequeños que cero utilizando un preescalador.
SPI Daisy‐Chaining y DMA
Algunos dispositivos SPI soportan la cadena daisy‐chaining, donde la salida de datos (MISO) de un dispositivo alimenta la entrada (MOSI) de la siguiente. Esto permite a múltiples esclavos con una sola línea de selección de chip. El MSSP puede manejar la cadena daisy si los dispositivos lo soportan.
Para SPI de alta velocidad, considere utilizar el controlador Direct Memory Access (DMA) del PIC (disponible en muchos PIC más nuevos). DMA puede transferir datos al/desde el buffer SPI sin intervención de CPU, liberando el núcleo para otras tareas. El periférico DMA se configura con fuente, destino y cuenta, y luego se activa por la interrupción del SPI.
Conclusión
I2C y SPI son herramientas esenciales en el kit de cualquier diseñador integrado. Con el módulo MSSP flexible que se encuentra en la mayoría de los microcontroladores PIC, implementar estos protocolos es sencillo una vez que usted entiende los parámetros de configuración y sincronización de registro. Siempre empezar con una prueba simple – un bucle de escritura/read de borrado – para verificar su hardware y la base de software.
Los datos siguen siendo su mejor amigo: Las hojas de datos oficiales de Microchip ] proporcionan mapas de registro exactos y diagramas de tiempo. Notas de aplicación tales como AN734] (I2C tips) y AN1009] (Uso de SPI) son recursos de gran valor.