En protocolos normales como UART o I2C (Single-Ended), la señal es un voltaje medido en referencia a Tierra (GND). Si un pulso electromagnético de una válvula de gas golpea el cable, suma voltaje. Un "0" lógico de repente se convierte en un "1" lógico, y los datos se corrompen.
Para solucionar esto, los estándares industriales como el RS485, CAN Bus y USB utilizan Pares Diferenciales. En lugar de un cable, usamos dos (A y B, o D+ y D-). Cuando el transmisor quiere enviar un "1", sube el voltaje del cable A y baja el del cable B. El receptor no lee la señal referenciada a tierra, sino que lee la diferencia matemática entre A y B ($V_{diff} = V_A - V_B$).
Si el ruido electromagnético golpea un par diferencial bien ruteado, el pico de voltaje golpea a *ambos cables por igual*. Si el ruido le suma +2V al cable A, también le suma +2V al cable B. Cuando el receptor hace la resta ($(V_A + 2V) - (V_B + 2V)$), ¡los 2V de ruido se anulan matemáticamente! Esto es la inmunidad perfecta.
Para que la cancelación de ruido funcione, el pico electromagnético debe golpear ambos cables exactamente al mismo tiempo y con la misma intensidad. En KiCad, no puedes rutear los cables A y B por separado. Debes nombrarlos en el esquemático usando sufijos especiales (ej. RS485_P y RS485_N). Al pasar al diseño físico (Pcbnew), usas la herramienta Route Differential Pair (Tecla 6).
KiCad trazará ambas pistas en paralelo, asegurándose de que la distancia entre ellas (Gap) y su longitud sean perfectamente simétricas en cada curva. A esto se le llama mantener la Impedancia Controlada.
Ejercicio 1: El STM32 no tiene un puerto físico RS485; tiene puertos UART (Single-Ended de 3.3V). Para usar un Par Diferencial, colocamos un Transceptor de hardware en la PCB (como el MAX3485). Este chip tiene un pin físico de control (DE/RE) que debes accionar desde tu código en C para decirle al chip si debe transmitir o escuchar. Escribe el driver Bare-Metal para controlar el flujo del bus diferencial.
#include <stdint.h>
#include <stdbool.h>
// --- 1. DEFINICIONES DE HARDWARE BARE-METAL ---
volatile uint32_t *GPIOA_BSRR = (volatile uint32_t *)0x40020018; // Registro de seteo rápido
// El Pin PA8 controla los pines RE (Receive Enable) y DE (Data Enable) del MAX3485
#define PIN_RS485_DIR 8
// Macros O(1) para conmutación del chip transceptor
// ALTO (1): Habilita el transmisor diferencial (TX)
#define RS485_MODO_TRANSMITIR() (*GPIOA_BSRR = (1 << PIN_RS485_DIR))
// BAJO (0): Habilita el receptor diferencial (RX) y pone el TX en alta impedancia
#define RS485_MODO_ESCUCHAR() (*GPIOA_BSRR = (1 << (PIN_RS485_DIR + 16)))
extern void uart_transmitir_byte(uint8_t dato);
extern void delay_microsegundos(uint32_t us);
// --- 2. TRANSMISIÓN SEGURA EN BUS DIFERENCIAL ---
void enviar_litros_rs485(uint8_t* trama_datos, uint8_t longitud) {
// 1. Tomar el control del bus diferencial
RS485_MODO_TRANSMITIR();
// Pequeño retardo para que la capacitancia de las pistas A y B se estabilice
delay_microsegundos(10);
// 2. Transmitir por la UART del STM32.
// El chip MAX3485 convertirá instantáneamente nuestro Single-Ended a Par Diferencial.
for(uint8_t i = 0; i < longitud; i++) {
uart_transmitir_byte(trama_datos[i]);
}
// IMPORTANTE: Esperar a que el hardware termine físicamente de sacar
// el último bit antes de soltar el bus. (Revisar bandera TC = Transmission Complete)
// esperar_bandera_uart_tc();
// 3. Soltar el bus para permitir que la Oficina Central nos responda
RS485_MODO_ESCUCHAR();
}
int main(void) {
// Inicialización por defecto: El Despachador siempre escucha
RS485_MODO_ESCUCHAR();
while(1) {
// Máquina de estados de comunicación Modbus RS485...
}
return 0;
}
Objetivo del día: Ruteo de Telemetría Robusta (Capa Física RS485).
Para interconectar 10 Despachadores de Gas en una misma planta, tu placa contará con borneras para cable par trenzado RS485. En el software KiCad, asignarás una "Clase de Red" a las etiquetas RS485_A y RS485_B, estableciendo un ancho de pista de 0.25mm y una separación exacta de 0.15mm.
Al seleccionar la herramienta de ruteo diferencial (tecla 6) desde los pines del chip MAX3485 hacia el conector, verás cómo KiCad dibuja dos pistas paralelas que se curvan en perfecta sincronía. Físicamente, esto garantiza que cualquier inducción magnética que arroje la bomba de gas afectará ambos cables idénticamente, siendo filtrado matemáticamente por el amplificador receptor en el otro extremo. Gracias al transceptor físico y al control del pin de dirección en tu código C, tu Despachador podrá transmitir auditorías financieras a 1,200 metros de distancia sin perder un solo bit.