Necesitábamos un protocolo de ruido inmune, de bajo costo, multipunto, maestro múltiple (en tiempo real y distribuido) y parece que el bus CAN solo cumple con estos requisitos.
Dado que no hay controladores de lata (hardware de capa de enlace de datos) para MCU de muy bajo costo (como STM32F0) y no hay API fácil de usar que pudimos encontrar para comenzar, no podemos considerar el bus CAN como una pila de comunicación predeterminada de nuestros proyectos.
Entonces, creo que puedo implementar una capa muy pequeña que permitirá implementar cualquier protocolo (como Modbus) sobre UART sobre la capa física CAN mientras aprovecho la detección de colisión de datos utilizando 1 byte inicial como cebo.
Además, supongo que cualquier hardware I2C o 1-Wire puede usar directamente un transmisor CAN para su protocolo de bus con un simple truco de resistencia de diodo, similar a 1-cable < - > uart diodo-resistencia hackear.
Sospecho que me estoy perdiendo algo, ya que este enfoque trae consigo muchas ventajas con un esfuerzo relativamente pequeño, aunque no hay ninguna implementación que pueda encontrar para este propósito.
¿Hay consecuencias ocultas en esta encuesta?
Editar
1-Wire (con corte UART) no funciona con el transceptor CAN MCP2551, ya que el transceptor comienza a alimentarse con cero (dominante) en el punto final (el lado de 1-Wire) lo que evita que cualquier dispositivo escriba "1" en el bus hasta que la función de "detección permanente de TXD" del transceptor asuma el control. Por lo tanto, es inútil desde el punto de vista del "simple extensor de rango de 1 cable". Lo que significa que los pines RXD
/ TXD
del transceptor de bus CAN no se pueden convertir en una línea de drenaje abierta con un simple truco de conversión de 1 cable / uart, por lo que tampoco funcionará con un bus I2C.
Edit-2
El uso de 1 byte como cebo no es eficaz, ya que tenemos que usar solo 1 bit como cero, lo que significa que tenemos que usar 100 bits solo para direccionar si planeamos conectar 100 dispositivos en el mismo bus porque aunque pudimos detectar alguien más está hablando al mismo tiempo pero no podemos detectar la prioridad (por ejemplo, si node#0b101
y node#0b011
hablan al mismo tiempo, leeremos 0b001
, que es la misma respuesta cuando node#0b011
y% El node#0b001
habla. Por lo tanto, node#011
nunca sabrá si tiene la prioridad o no. Por lo tanto, esto es imposible si no usamos una técnica de bit banging y leemos el RX
puerto bit a bit. Lo que no tiene sentido porque está reinventando el bus CAN como se mencionó.