Francesco Masciari
/
can_multithreadingX_vesctest
A test for vescs
main.cpp
- Committer:
- DunkelAmber
- Date:
- 2019-06-15
- Revision:
- 2:12431dd6475f
- Parent:
- 1:9ecda2b969c2
File content as of revision 2:12431dd6475f:
#include "mbed.h" //5.4.7 (144) #include "canid.hpp" #define BIG_ENDIAN const PinName can1rxPins[] = {PA_11}; const PinName can1txPins[] = {PA_12}; const PinName can2rxPins[] = {PB_5}; const PinName can2txPins[] = {PB_6}; uint64_t counter=0; //CAN1 //0,0=OK 0,1=OK 0,2=OK 1,0=OK 1,1=OK 1,2=OK 2,0=OK 2,1=OK 2,2=OK //CAN" //0,0=RX_OK 0,1=OK 1,0=RX_OK 1,1=OK CAN can1(can1rxPins[0], can1txPins[0]); CAN can(can2rxPins[0], can2txPins[0]); //UART1, Tx, Rx (Debug) DigitalOut led1(LED1); Thread sendThread(osPriorityAboveNormal, 2048); Thread canrx; CANMessage messageIn; CANMessage messageOut; void setID (CANMessage& message, uint32_t device_id, uint32_t content_id) { uint32_t id = device_id; id |= (uint32_t)content_id << 8; id |= 0x80000000; // Set EFF(Extended Frame Format) flag true message.id = id; } uint64_t cantoi(CANMessage message) { uint64_t ret=0; #ifdef BIG_ENDIAN for(int i=message.len-1, k=0; i>=0; i--, k++) { ret += message.data[i] << (8*k); } #else //LITTLE ENDIAN for(int i=0, k=0; i>=message.len-1; i++, k++) { ret += message.data[i] << (8*k); } #endif return ret; //pose = message.data[0] + (message.data[1] << 8) + (message.data[2] << 16) + (message.data[3] << 24); } template <class data_t> void xtocan(data_t _data, unsigned int n_bytes, CANMessage& message) { data_t data = 0; message.len = n_bytes; int mask = 0xff; // last 8 bits #ifdef BIG_ENDIAN for(int i=message.len-1; i>=0; i--) { message.data[i] = data & mask; data = data>>8; } #else //LITTLE ENDIAN for(int i=0; i<message.len; i++) { message.data[i] = data & maks; data = data>>8; } #endif return; } /* DEPRECATED void ui64tocan(uint64_t data, CANMessage& message) { for(int i=message.len-1; i>=0; i--) { //printf("dataconv:\t% 12llu\n\r", data); message.data[i] = data & 0x00000000000000ff; data = data>>8; } }*/ void canRxIsr() { while(1) { if(can.read(messageIn)) { led1 = !led1; printf("received from %lu\t%llu\n\r", messageIn.id, cantoi(messageIn)); } } } //pose = messageIn.data[0] + (messageIn.data[1] << 8) + (messageIn.data[2] << 16) + (messageIn.data[3] << 24); void sendMessage() { int status = can.write(messageOut); printf("Send status: %d\r\n", status); } void sendMessageLoop() { while (true) { counter += 1; messageOut.id = 1000; // DELETEME setID(messageOut, 1, BLDC_SET_RPM); messageOut.format = CANExtended; messageOut.data[0]=25; messageOut.len = 8; xtocan<uint64_t>(counter, 8, messageOut); //ui64tocan(counter, messageOut); printf("sending couter: %llu\t| CAN data: %llu\n\r", counter, cantoi(messageOut)); sendMessage(); osDelay(1000); } } int main() { printf("CAN receive / transmit test.\r\n"); can.frequency(500000); messageOut.id = 1000; messageOut.format = CANExtended; messageOut.data[0]=24; messageOut.len = 8; canrx.start(canRxIsr); printf("CAN receive / .\r\n"); sendThread.start(&sendMessageLoop); printf("CAN \r\n"); while (true) { led1 = 0; osDelay(1000); } }