Hello Everyone
I am working on Teensy 4.1 trying to send and receive UAVCAN packets, I use Libcanard, and referring to the documentation in GitHub - OpenCyphal/libcanard: A compact implementation of the Cyphal/CAN protocol in C for high-integrity real-time embedded systems I could generate can frames, actually I am still new with this protocol and I have some doubts regarding the output frames, as mentioned in the documentation the first two bytes of the first frame generated supposed to be the CRC but I do not see that, I am using canardTxPush, canardTxPeek, and canardTxPop to parse the packet and split it (if needed) to a set of frames.
Hint: I am using the “malloc()” and the “free()” functions to allocate and deallocate the memory because the o1heap library does not work on Teensy and I do not know why.
I print the input and output of my program as the following:
program start...
Input packet:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
number of frames enqueued: 4
Generated frames>>>>
0 1 2 3 4 5 6 160
7 8 9 10 11 12 13 0
14 15 16 17 18 19 20 32
221 10 64 134 169 14 0 0
program finish......
the following is the simple code I use:
#include <Arduino.h>
#include <FlexCAN_T4.h>
#include "LIBCAN.h"
FlexCAN_T4<CAN1, RX_SIZE_256, TX_SIZE_16> can1;
CAN_message_t can_msg;
static void* my_all;
static void* mal(CanardInstance* const canard, const size_t amount){
my_all = (void*)malloc(amount);
return my_all;
}
static void fre(CanardInstance* const canard, void* const pointer){
free(pointer);
}
void setup()
{
Serial.begin(9600);
can1.begin();
Serial.println("program start...");
CanardInstance canard2 = canardInit(&mal, &fre);
canard2.node_id = 42;
CanardTxQueue queue = canardTxInit(10, CANARD_MTU_CAN_CLASSIC);
uint64_t addr2 = (uint64_t)canard2.memory_allocate;
static uint8_t my_message_transfer_id;
const CanardTransferMetadata transfer_metadata = {
.priority = CanardPriorityNominal,
.transfer_kind = CanardTransferKindMessage,
.port_id = 1234, // This is the subject-ID.
.remote_node_id = CANARD_NODE_ID_UNSET, // Messages cannot be unicast, so use UNSET.
.transfer_id = my_message_transfer_id,
};
uint64_t tx_deadline_usec = 0xEE;
uint8_t paylo[60];
Serial.println("Input packet:");
for(int y=0; y<21; y++){
paylo[y] = y;
Serial.print(y);
Serial.print(" ");
}
Serial.println();
++my_message_transfer_id; // The transfer-ID shall be incremented after every transmission on this subject.
int32_t result = canardTxPush(&queue, // Call this once per redundant CAN interface (queue).
&canard2,
tx_deadline_usec, // Zero if transmission deadline is not limited.
&transfer_metadata,
21, // Size of the message payload (see Nunavut transpiler).
paylo);
if (result < 0)
{
Serial.println("Error!!!!!!");
}
Serial.print("number of frames enqueued: ");
Serial.println(result);
const CanardTxQueueItem* data;
uint8_t* payload_array;
Serial.println();
Serial.println("Generated frames>>>>");
for(int c=0; c<result; c++){
delay(1000);
data = canardTxPeek(&queue);
payload_array = (uint8_t*)data->frame.payload;
for(int i=0; i<CANARD_MTU_CAN_CLASSIC; i++){
can_msg.buf[i] = payload_array[i];
Serial.print(payload_array[i], HEX);
Serial.print(" ");
}
Serial.println();
canard2.memory_free(&canard2, canardTxPop(&queue, data));
}
CanardRxSubscription heartbeat_subscription;
}
void loop()
{
Serial.println("program finish......");
while(true);
}
My questions are as the following:
- why I can not see the CRC bytes at the beginning of the first frame?
- As shown that there are some additional bytes at last frame generated, what do they mean and from where they come?
- where can I find the standard DSDL definition and how to use it?
Thanks in advance