¿Cómo programo 2 nodos CAN para transmitir continuamente en sucesión?

5

Supongamos que tengo tres nodos CAN: A, B y C. Sabemos que cuando dos nodos transmiten al mismo tiempo, el nodo que tiene el menor SID prevalecerá sobre el bus y el otro nodo tendrá que proporcionar el bus al primer nodo. Lo que quisiera hacer es que los nodos B y C enviarán continuamente la trama CAN al nodo A en sucesión (por ejemplo, nodo B - > nodo A, nodo C - > nodo A, nodo B - > nodo A). ¿Puedo simplemente asignar un SID inferior a B que a C y simplemente hacer el siguiente fragmento de código?

Nodo B

while(1) sendCANmsg(data, NODE_A, sizeof(data), RTR_OFF);

Nodo C

while(1) sendCANmsg(data, NODE_A, sizeof(data), RTR_OFF);

Dentro de sendCANmsg, aquí está el fragmento:

TXB0CONbits.TXREQ = 1;  // Request Message Transmission
while (TXB0CONbits.TXREQ); // Wait until message is sent.

Por cierto, estoy usando PIC18F25k80 para implementar esto. Estaba pensando que después de que el nodo B enviara el mensaje, cuando el nodo C está a punto de enviar su mensaje. El nodo B ganará nuevamente el arbitraje de bus, por lo que el nodo C no tendrá posibilidad de transmisión. Así que remedio que solo puedo pensar es en insertar un pequeño retraso como:

while(1) {
    sendCANmsg(data, NODE_A, sizeof(data), RTR_OFF);
    delay_us(10);
}

¿O me equivoco? :)

    
pregunta Xegara

2 respuestas

4

Dado que este método hace que el bus se acerque al 100%, asumiremos que estos 3 nodos son los únicos en el bus. En función de su tiempo de demora de 10 µs, también asumimos que la velocidad del bus es de 500 kbps (es decir, 5 bits de demora, o 1 bit por debajo de la espera posterior al arbitraje entre mensajes).

Si el método funcionará o no depende en gran medida de los detalles de implementación de su controlador CAN. Una forma más confiable de lograr esto sería tener a los nodos B y C esperando para leer el mensaje de cada uno antes de enviarlos (con el nodo B inicialmente transmitiendo sin esperar). I.E .:

  1. Despertar
  2. El nodo C espera el mensaje B
  3. El nodo B transmite
  4. El nodo B espera el mensaje C
  5. El nodo C transmite
  6. El nodo C espera el mensaje B
  7. Etc.

Para tener en cuenta la desincronización, cada período de espera debe tener un tiempo de espera, después del cual el nodo transmite, independientemente de que haya recibido el mensaje del otro nodo.

Esto igualará la utilización del bus y dejará a cada controlador capaz de realizar otras tareas mientras espera el mensaje (en lugar de intentar transmitir continuamente en caso de una pérdida de arbitraje).

Tenga en cuenta que este es un uso poco convencional de CAN. Es posible que le sirvan mejor un protocolo más simple, como SPI (el nodo A tendría que sondear B y C, pero no tendría que haber arbitraje, y todo podría ser DMA y / o dirigido por interrupciones).

    
respondido por el Scott Winder
3

Primero, los nodos no tienen ID, los mensajes sí.

Esto es complicado, y no es para lo que se diseñó CAN. Debería funcionar si cada nodo se demora un poco después de cada transmisión exitosa. No recuerdo si el hardware del PIC 18F25K80 le avisa cuándo se envía realmente un marco, pero probablemente lo haga. El otro nodo solo necesita una ventana corta para ver el final del cuadro y comenzar a transmitir. Una vez que este segundo nodo comience a transmitir, el primero retrasará su mensaje hasta el siguiente final del cuadro automáticamente de todos modos.

Sin embargo, esto suena como un abuso del bus CAN, y una mejor respuesta podría ser un replanteamiento de la arquitectura general.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas