Supongamos que tengo tres nodos CAN: A, B y C. Sabemos que cuando dos nodos transmiten al mismo tiempo, el nodo que tiene menos SID prevalecerá sobre el bus y el otro nodo tendrá que ceder el bus al primero. nodo. Lo que me gustaría hacer es que el nodo B y C envíen continuamente tramas 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 más bajo 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 envió el mensaje, cuando el nodo C está a punto de enviar su mensaje. El nodo B volverá a ganar el arbitraje del bus, lo que le dará al nodo C ninguna posibilidad de transmisión. Entonces, el remedio que solo se me ocurre es insertar un pequeño retraso como:
while(1) {
sendCANmsg(data, NODE_A, sizeof(data), RTR_OFF);
delay_us(10);
}
¿O estoy equivocado? :)
Dado que este método acerca el bus al 100 % de utilización, supondremos que estos 3 nodos son los únicos en el bus. Según su tiempo de retraso de 10 µs, también asumimos que la velocidad del bus es de 500 kbps (es decir, 5 bits de retraso, o 1 bit menos que la espera posterior al arbitraje entre mensajes).
Que el método funcione 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 el nodo B y C esperando para leer el mensaje del otro antes de enviarlo (con el nodo B transmitiendo inicialmente sin esperar). ES DECIR:
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 si recibió el mensaje del otro nodo.
Esto equilibrará la utilización del bus y dejará que cada controlador pueda 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 no convencional de CAN. Es posible que le sirva mejor un protocolo más simple, como SPI (el nodo A tendría que sondear a B y C, pero no tendría que haber arbitraje, y todo podría ser DMA y/o controlado por interrupciones).
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 retrasa deliberadamente un poco después de cada transmisión exitosa. No recuerdo si el hardware PIC 18F25K80 le permite saber cuándo se envía realmente un marco, pero probablemente lo haga. El otro nodo solo necesita una pequeña ventana 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 próximo final del marco automáticamente de todos modos.
Sin embargo, esto suena como un abuso del bus CAN, y una mejor respuesta podría ser repensar la arquitectura general.
Xegara
devanadera de scott
Xegara
devanadera de scott
Xegara