Anteriormente he preguntado acerca de ejecutando I2C sobre CAN PHY a través de cables Cat5e para mi proyecto de domótica. Ahora, después de una ronda de ahorro y experimentación de dinero, me parece que abusar del chip RS485 MAX1487
puede ser una idea más barata que I2C sobre CAN. Ahora necesito un protocolo para permitir que el dispositivo host (con Ethernet) y los nodos satelitales se comuniquen entre sí.
Entorno
El entorno es el mismo: Cat5e en un entorno de interferencia extraterrestre muy hostil, el cable ya tiene RJ45 engarzado en el pinout TIA / EIA-568-B, y el presupuesto es muy ajustado. Entonces, ¿es este un pinout adecuado que transmite tanto energía como señal al dispositivo de destino?
- N / C
- N / C
- D +
- + 5V
- + 5V
- D-
- GND
- GND
También una restricción adicional: todos los chips utilizados aquí DEBEN estarán disponibles en el paquete DIP. La MCU preferida para mí es ATtiny85
para los nodos satélites y ATmega328P
para el nodo con acceso a Ethernet.
Capa física
Y dado que todos los dispositivos en el sistema tienen algún tipo de MCU, puedo hacer que el bus se comunique entre ellos. Sin embargo, tengo que evitar la colisión. ¿Funcionarán este protocolo físico y el esquema de prevención de colisiones?
- Hable usando el chip de capa física RS485
MAX1487
a la velocidad de transmisión de UART 9600bps y 8 / N / 1. - La red de terminación / polarización resistiva hace que la línea flote en 1. Conduzca el bus solo cuando se envía 0 (ya que
MAX1487
puede triplicar sus controladores). - Habla cuando el bus está inactivo, a.k.a lee como 1, durante al menos 5 bits de tiempo.
- Lea cada bit enviado de vuelta inmediatamente después de la transmisión, así como antes de transmitir el siguiente bit. Siempre que se encuentre una falta de coincidencia, cancele la transmisión y retroceda por un tiempo pseudoaleatorio antes de retransmitir.
- La primera transmisión de todos los nodos que simplemente se conectan debe retrasarse y usar el mismo tiempo de retroceso pseudoaleatorio que el choque de colisión.
Hablar aquí significa conducir el autobús. Elegí el chip MAX1487
que puede tener su transmisor apagado cuando no se usa. Red de polarización normal:
Capa de enlace
Y dado que es multipunto, se debe usar algún tipo de direccionamiento, lo que conduce a este protocolo enmarcado:
Formato de cuadro (usando la sintaxis de la estructura C):
struct frame {
uint16_t magic; // = 0x55aa
uint16_t source_address;
uint16_t target_address;
uint16_t payload_type; // Like EtherType
uint16_t payload_length; // Exclude padding, if any
uint8_t payload[]; // Padded to 2-byte boundary
uint16_t checksum; // CRC16 of entire frame before this frame
}
Las direcciones de origen y destino están codificadas en el chip, ya sea durante la programación, o utilizan algún valor específico del chip durante la fabricación, como el valor de calibración RC del AVR. La dirección de destino 0xffff
significa fotograma transmitido.
Preguntas
- ¿Será este protocolo lo suficientemente bueno como un protocolo de control de automatización del hogar?
- ¿Se podrá extender este protocolo a IPv4 o IPv6?