TLMoto

Dependencies:   CANnucleo CANnucleo_Hello mbed

Fork of CANnucleo_Hello by Zoltan Hudak

Committer:
ser1516
Date:
Sat Oct 22 16:34:56 2016 +0000
Revision:
21:dd8c642ca404
Parent:
20:eb1a8042605e
comit antes de gerardo mexer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:c5e5d0df6f2a 1 /*
hudakz 16:a86f339d1c25 2 * An example showing how to use the CANnucleo library:
hudakz 0:c5e5d0df6f2a 3 *
ser1516 21:dd8c642ca404 4 * Two affordable (less than $3 on ebay) STM32F103C8T6 boards (20kB SRAM, 64kB Flash),
ser1516 21:dd8c642ca404 5 * (see [https://developer.mbed.org/users/hudakz/code/STM32F103C8T6_Hello/] for more details)
ser1516 21:dd8c642ca404 6 * are connected to the same CAN bus via transceivers (MCP2551 or TJA1040, or etc.).
ser1516 21:dd8c642ca404 7 * CAN transceivers are not part of NUCLEO boards, therefore must be added by you.
hudakz 6:7ff95ce72f6d 8 * Remember also that CAN bus (even a short one) must be terminated with 120 Ohm resitors at both ends.
hudakz 6:7ff95ce72f6d 9 *
hudakz 16:a86f339d1c25 10 * For more details see the wiki page <https://developer.mbed.org/users/hudakz/code/CANnucleo_Hello/>
hudakz 6:7ff95ce72f6d 11 *
hudakz 17:18d4d0ff26a6 12 * NOTE: If you'd like to use the official NUCLEO boards comment out line 22
hudakz 6:7ff95ce72f6d 13 *
hudakz 6:7ff95ce72f6d 14 * The same code is used for both NUCLEO boards, but:
hudakz 0:c5e5d0df6f2a 15 * For board #1 compile the example without any change.
ser1516 21:dd8c642ca404 16 * For board #2 comment out line 23 before compiling
hudakz 4:ccf4ac2deac8 17 *
hudakz 6:7ff95ce72f6d 18 * Once the binaries have been downloaded to the boards reset board #1.
hudakz 0:c5e5d0df6f2a 19 *
ser1516 21:dd8c642ca404 20 */
hudakz 0:c5e5d0df6f2a 21
ser1516 21:dd8c642ca404 22 //#define TARGET_STM32F103C8T6 1 // uncomment this line when using STM32F103C8T6 boards!
ser1516 21:dd8c642ca404 23 //#define BOARD1 1 // comment out this line when compiling for board #2
hudakz 0:c5e5d0df6f2a 24
ser1516 21:dd8c642ca404 25
hudakz 0:c5e5d0df6f2a 26
ser1516 21:dd8c642ca404 27 const unsigned int RX_ID = 0x100;
ser1516 21:dd8c642ca404 28 const unsigned int TX_ID = 0x101;
hudakz 6:7ff95ce72f6d 29
hudakz 19:872e304d7e17 30 #include "CANnucleo.h"
hudakz 16:a86f339d1c25 31 #include "mbed.h"
hudakz 16:a86f339d1c25 32
ser1516 21:dd8c642ca404 33 /*
hudakz 17:18d4d0ff26a6 34 * To avaoid name collision with the CAN and CANMessage classes built into the mbed library
hudakz 17:18d4d0ff26a6 35 * the CANnucleo's CAN and CANMessage classes have been moved into the CANnucleo namespace.
hudakz 20:eb1a8042605e 36 * Remember to qualify them with the CANnucleo namespace.
hudakz 17:18d4d0ff26a6 37 */
hudakz 17:18d4d0ff26a6 38 CANnucleo::CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
hudakz 17:18d4d0ff26a6 39 CANnucleo::CANMessage rxMsg;
hudakz 17:18d4d0ff26a6 40 CANnucleo::CANMessage txMsg;
ser1516 21:dd8c642ca404 41 CANnucleo::CANMessage throttle_txMsg;
ser1516 21:dd8c642ca404 42
ser1516 21:dd8c642ca404 43
ser1516 21:dd8c642ca404 44 DigitalOut led(PA_5);
ser1516 21:dd8c642ca404 45
hudakz 18:22977a898fe9 46 Timer timer;
hudakz 17:18d4d0ff26a6 47 int counter = 0;
hudakz 17:18d4d0ff26a6 48 volatile bool msgAvailable = false;
ser1516 21:dd8c642ca404 49 volatile bool to_send = false;
hudakz 0:c5e5d0df6f2a 50
hudakz 16:a86f339d1c25 51 /**
hudakz 16:a86f339d1c25 52 * @brief 'CAN receive-complete' interrup handler.
hudakz 16:a86f339d1c25 53 * @note Called on arrival of new CAN message.
hudakz 16:a86f339d1c25 54 * Keep it as short as possible.
ser1516 21:dd8c642ca404 55 * @param
ser1516 21:dd8c642ca404 56 * @retval
hudakz 16:a86f339d1c25 57 */
ser1516 21:dd8c642ca404 58 void onMsgReceived()
ser1516 21:dd8c642ca404 59 {
hudakz 16:a86f339d1c25 60 msgAvailable = true;
hudakz 16:a86f339d1c25 61 }
hudakz 16:a86f339d1c25 62
hudakz 16:a86f339d1c25 63 /**
hudakz 16:a86f339d1c25 64 * @brief Main
hudakz 16:a86f339d1c25 65 * @note
ser1516 21:dd8c642ca404 66 * @param
hudakz 16:a86f339d1c25 67 * @retval
hudakz 16:a86f339d1c25 68 */
ser1516 21:dd8c642ca404 69
ser1516 21:dd8c642ca404 70 bool key_switch = 0;
ser1516 21:dd8c642ca404 71
ser1516 21:dd8c642ca404 72 void flip()
ser1516 21:dd8c642ca404 73 {
ser1516 21:dd8c642ca404 74 key_switch = !key_switch;
ser1516 21:dd8c642ca404 75 led = key_switch;
ser1516 21:dd8c642ca404 76 txMsg.clear();
ser1516 21:dd8c642ca404 77 txMsg.id = 1000;
ser1516 21:dd8c642ca404 78 txMsg << key_switch;
ser1516 21:dd8c642ca404 79 to_send=1;
hudakz 16:a86f339d1c25 80
ser1516 21:dd8c642ca404 81
ser1516 21:dd8c642ca404 82
ser1516 21:dd8c642ca404 83 //to_send = 1;
ser1516 21:dd8c642ca404 84 }
ser1516 21:dd8c642ca404 85
ser1516 21:dd8c642ca404 86 Ticker flipper;
hudakz 0:c5e5d0df6f2a 87
ser1516 21:dd8c642ca404 88 typedef union can_union {
ser1516 21:dd8c642ca404 89 int i[2];
ser1516 21:dd8c642ca404 90 char bytes[8];
ser1516 21:dd8c642ca404 91 float f[2];
ser1516 21:dd8c642ca404 92 } data;
ser1516 21:dd8c642ca404 93 float received[12];
ser1516 21:dd8c642ca404 94 char missed_can=0;
ser1516 21:dd8c642ca404 95 int main()
ser1516 21:dd8c642ca404 96
ser1516 21:dd8c642ca404 97 {
ser1516 21:dd8c642ca404 98
ser1516 21:dd8c642ca404 99 flipper.attach(&flip, 5); // turn on or off
ser1516 21:dd8c642ca404 100 led=key_switch;
ser1516 21:dd8c642ca404 101 timer.start(); // start timer
ser1516 21:dd8c642ca404 102 char counter = 0;
ser1516 21:dd8c642ca404 103 printf("started\r\n"); can.frequency(1000000);
ser1516 21:dd8c642ca404 104 data data; // set bit rate to 1Mbps
ser1516 21:dd8c642ca404 105 can.attach(&onMsgReceived); // attach 'CAN receive-complete' interrupt handler
ser1516 21:dd8c642ca404 106 while(true) {
ser1516 21:dd8c642ca404 107
hudakz 16:a86f339d1c25 108 if(msgAvailable) {
hudakz 16:a86f339d1c25 109 msgAvailable = false; // reset flag for next use
ser1516 21:dd8c642ca404 110 rxMsg.clear();
ser1516 21:dd8c642ca404 111 can.read(rxMsg);
ser1516 21:dd8c642ca404 112 //printf("ID: \t%d\n\r", rxMsg.id);
ser1516 21:dd8c642ca404 113 /*for(int i=0;i<rxMsg.len;i++){
ser1516 21:dd8c642ca404 114 printf("\t%x",rxMsg.data[i]);
ser1516 21:dd8c642ca404 115 }
ser1516 21:dd8c642ca404 116 */
ser1516 21:dd8c642ca404 117 data.bytes[0] = rxMsg.data[0];
ser1516 21:dd8c642ca404 118 data.bytes[1] = rxMsg.data[1];
ser1516 21:dd8c642ca404 119 data.bytes[2] = rxMsg.data[2];
ser1516 21:dd8c642ca404 120 data.bytes[3] = rxMsg.data[3];
ser1516 21:dd8c642ca404 121 data.bytes[4] = rxMsg.data[4];
ser1516 21:dd8c642ca404 122
ser1516 21:dd8c642ca404 123 //printf("\r\n");
ser1516 21:dd8c642ca404 124 //printf("%f\t%d\r\n", data.f[0], data.bytes[4]);
ser1516 21:dd8c642ca404 125 // Filtering performed by software:
ser1516 21:dd8c642ca404 126 received[counter]=data.f[0];
ser1516 21:dd8c642ca404 127
ser1516 21:dd8c642ca404 128 counter++;
ser1516 21:dd8c642ca404 129 }
ser1516 21:dd8c642ca404 130 if(counter == 12) {
ser1516 21:dd8c642ca404 131 printf("=======================\r\n");
ser1516 21:dd8c642ca404 132 printf("%d: %f, %d: %f, %d: %f, %d: %f,%d: %f, %d: %f, %d: %f, %d: %f,%d: %f, %d: %f, %d: %f, %d: %f\r\n",1,received[0],2,received[1],
ser1516 21:dd8c642ca404 133 3,received[2],4,received[3],5,received[4],
ser1516 21:dd8c642ca404 134 6,received[5],7,received[6],8,received[7],
ser1516 21:dd8c642ca404 135 9,received[8],10,received[9],11,received[10],12,received[11]);
ser1516 21:dd8c642ca404 136 counter = 0;
ser1516 21:dd8c642ca404 137 }
ser1516 21:dd8c642ca404 138 if(to_send) {
ser1516 21:dd8c642ca404 139 to_send = 0;
ser1516 21:dd8c642ca404 140 if(can.write(txMsg)) {
ser1516 21:dd8c642ca404 141 printf("sent message");
ser1516 21:dd8c642ca404 142
ser1516 21:dd8c642ca404 143 } else {
ser1516 21:dd8c642ca404 144
ser1516 21:dd8c642ca404 145 printf("transmission error\n\r");
ser1516 21:dd8c642ca404 146 //to_send=1;
hudakz 0:c5e5d0df6f2a 147 }
hudakz 0:c5e5d0df6f2a 148 }
hudakz 0:c5e5d0df6f2a 149 }
ser1516 21:dd8c642ca404 150
hudakz 0:c5e5d0df6f2a 151 }
hudakz 7:2dce8ed51091 152
hudakz 12:e91e44924194 153
hudakz 17:18d4d0ff26a6 154