Can_open_masternode

Dependencies:   mbed

Committer:
sam_grove
Date:
Mon May 30 07:36:47 2011 +0000
Revision:
0:9dd7c6129683
Initial public release of master node example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:9dd7c6129683 1 /**************************************************************
sam_grove 0:9dd7c6129683 2 CAN OPEN SAMPLE - MBED MASTER
sam_grove 0:9dd7c6129683 3 **************************************************************/
sam_grove 0:9dd7c6129683 4 /*
sam_grove 0:9dd7c6129683 5 This file is part of CanFestival, a library implementing CanOpen Stack.
sam_grove 0:9dd7c6129683 6
sam_grove 0:9dd7c6129683 7 Copyright (C): Edouard TISSERANT and Francis DUPIN
sam_grove 0:9dd7c6129683 8 mbed Port: sgrove
sam_grove 0:9dd7c6129683 9
sam_grove 0:9dd7c6129683 10 See COPYING file for copyrights details.
sam_grove 0:9dd7c6129683 11
sam_grove 0:9dd7c6129683 12 This library is free software; you can redistribute it and/or
sam_grove 0:9dd7c6129683 13 modify it under the terms of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 14 License as published by the Free Software Foundation; either
sam_grove 0:9dd7c6129683 15 version 2.1 of the License, or (at your option) any later version.
sam_grove 0:9dd7c6129683 16
sam_grove 0:9dd7c6129683 17 This library is distributed in the hope that it will be useful,
sam_grove 0:9dd7c6129683 18 but WITHOUT ANY WARRANTY; without even the implied warranty of
sam_grove 0:9dd7c6129683 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
sam_grove 0:9dd7c6129683 20 Lesser General Public License for more details.
sam_grove 0:9dd7c6129683 21
sam_grove 0:9dd7c6129683 22 You should have received a copy of the GNU Lesser General Public
sam_grove 0:9dd7c6129683 23 License along with this library; if not, write to the Free Software
sam_grove 0:9dd7c6129683 24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
sam_grove 0:9dd7c6129683 25 */
sam_grove 0:9dd7c6129683 26 /******************************************************************************
sam_grove 0:9dd7c6129683 27 Project description:
sam_grove 0:9dd7c6129683 28
sam_grove 0:9dd7c6129683 29 Allow a user to change the bus state by sending COM messages to the device
sam_grove 0:9dd7c6129683 30 57600 baud 8-n-1 send "help" for a list of options and formating info
sam_grove 0:9dd7c6129683 31 CAN speed - 125k
sam_grove 0:9dd7c6129683 32
sam_grove 0:9dd7c6129683 33 ******************************************************************************/
sam_grove 0:9dd7c6129683 34
sam_grove 0:9dd7c6129683 35 #include "mbed.h"
sam_grove 0:9dd7c6129683 36 #include "main.h"
sam_grove 0:9dd7c6129683 37 #include "canfestival.h"
sam_grove 0:9dd7c6129683 38 #include "can_mbed.h"
sam_grove 0:9dd7c6129683 39 #include "mbed_master.h"
sam_grove 0:9dd7c6129683 40 #include "port_helper.h"
sam_grove 0:9dd7c6129683 41
sam_grove 0:9dd7c6129683 42 // Set used for main program timing control
sam_grove 0:9dd7c6129683 43 Ticker SysTimer;
sam_grove 0:9dd7c6129683 44 // flag used by the main program timing control interrupt
sam_grove 0:9dd7c6129683 45 uint8_t timer_interrupt = 0;
sam_grove 0:9dd7c6129683 46
sam_grove 0:9dd7c6129683 47 // CAN - put and take data from the stack
sam_grove 0:9dd7c6129683 48 uint8_t nodeID;
sam_grove 0:9dd7c6129683 49 uint8_t change_node_id;
sam_grove 0:9dd7c6129683 50 NMTStateAdjustment stack_state = reset;
sam_grove 0:9dd7c6129683 51
sam_grove 0:9dd7c6129683 52 // read a can message from the stack
sam_grove 0:9dd7c6129683 53 static Message m = Message_Initializer;
sam_grove 0:9dd7c6129683 54 const Message empty_msg = Message_Initializer;
sam_grove 0:9dd7c6129683 55
sam_grove 0:9dd7c6129683 56 int main()
sam_grove 0:9dd7c6129683 57 {
sam_grove 0:9dd7c6129683 58 // start the debug helper
sam_grove 0:9dd7c6129683 59 initHelper();
sam_grove 0:9dd7c6129683 60 // start the system timer
sam_grove 0:9dd7c6129683 61 SysTimer.attach_us(&serviceSysTimer, CYCLE_TIME*10);
sam_grove 0:9dd7c6129683 62 // Initialize the CANopen bus
sam_grove 0:9dd7c6129683 63 canInit(CAN_BAUDRATE);
sam_grove 0:9dd7c6129683 64 // Start timer for the CANopen stack
sam_grove 0:9dd7c6129683 65 initTimer();
sam_grove 0:9dd7c6129683 66 // set the default node id (1-127)
sam_grove 0:9dd7c6129683 67 nodeID = 0x7f;
sam_grove 0:9dd7c6129683 68 // Init the state
sam_grove 0:9dd7c6129683 69 setState(&mbed_master_Data, Initialisation);
sam_grove 0:9dd7c6129683 70 setNodeId (&mbed_master_Data, nodeID);
sam_grove 0:9dd7c6129683 71 // Put the master in operational mode
sam_grove 0:9dd7c6129683 72 setState(&mbed_master_Data, Operational);
sam_grove 0:9dd7c6129683 73
sam_grove 0:9dd7c6129683 74 // keep on loopin'
sam_grove 0:9dd7c6129683 75 while(1){
sam_grove 0:9dd7c6129683 76
sam_grove 0:9dd7c6129683 77 // just testing the rx functionality
sam_grove 0:9dd7c6129683 78 if (canReceive(&m)){
sam_grove 0:9dd7c6129683 79 // the stack can crash with interrupts enabled
sam_grove 0:9dd7c6129683 80 __disable_irq();
sam_grove 0:9dd7c6129683 81 // pass the message on and process it
sam_grove 0:9dd7c6129683 82 canDispatch(&mbed_master_Data, &m);
sam_grove 0:9dd7c6129683 83 // get back to work
sam_grove 0:9dd7c6129683 84 __enable_irq();
sam_grove 0:9dd7c6129683 85 // and print the message for debugging
sam_grove 0:9dd7c6129683 86 printMsg(m);
sam_grove 0:9dd7c6129683 87 // empty it for the next use
sam_grove 0:9dd7c6129683 88 m = empty_msg;
sam_grove 0:9dd7c6129683 89 }
sam_grove 0:9dd7c6129683 90
sam_grove 0:9dd7c6129683 91 // set the main loop exectuion speed at 10mS
sam_grove 0:9dd7c6129683 92 if (sys_timer){
sam_grove 0:9dd7c6129683 93 // Reset timer
sam_grove 0:9dd7c6129683 94 reset_sys_timer();
sam_grove 0:9dd7c6129683 95
sam_grove 0:9dd7c6129683 96 // look for COM requests
sam_grove 0:9dd7c6129683 97 serviceCOMCommands();
sam_grove 0:9dd7c6129683 98
sam_grove 0:9dd7c6129683 99 // change operational state??
sam_grove 0:9dd7c6129683 100 switch(stack_state){
sam_grove 0:9dd7c6129683 101
sam_grove 0:9dd7c6129683 102 case start:
sam_grove 0:9dd7c6129683 103 masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Start_Node);
sam_grove 0:9dd7c6129683 104 startSYNC(&mbed_master_Data);
sam_grove 0:9dd7c6129683 105 stack_state = undefined;
sam_grove 0:9dd7c6129683 106 break;
sam_grove 0:9dd7c6129683 107
sam_grove 0:9dd7c6129683 108 case reset:
sam_grove 0:9dd7c6129683 109 masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Reset_Node);
sam_grove 0:9dd7c6129683 110 startSYNC(&mbed_master_Data);
sam_grove 0:9dd7c6129683 111 stack_state = undefined;
sam_grove 0:9dd7c6129683 112 break;
sam_grove 0:9dd7c6129683 113
sam_grove 0:9dd7c6129683 114 case stop:
sam_grove 0:9dd7c6129683 115 masterSendNMTstateChange (&mbed_master_Data, 0x00, NMT_Stop_Node );
sam_grove 0:9dd7c6129683 116 stopSYNC(&mbed_master_Data);
sam_grove 0:9dd7c6129683 117 stack_state = undefined;
sam_grove 0:9dd7c6129683 118 break;
sam_grove 0:9dd7c6129683 119
sam_grove 0:9dd7c6129683 120 default:
sam_grove 0:9dd7c6129683 121 break;
sam_grove 0:9dd7c6129683 122 }
sam_grove 0:9dd7c6129683 123
sam_grove 0:9dd7c6129683 124 // Check if CAN address has been changed
sam_grove 0:9dd7c6129683 125 if(change_node_id == 1){
sam_grove 0:9dd7c6129683 126 reset_node_id();
sam_grove 0:9dd7c6129683 127 setState(&mbed_master_Data, Stopped); // Stop the node, to change the node ID
sam_grove 0:9dd7c6129683 128 setNodeId(&mbed_master_Data, nodeID); // Now the CAN adress is changed
sam_grove 0:9dd7c6129683 129 setState(&mbed_master_Data, Initialisation); // Set to Pre_operational, master must boot it again
sam_grove 0:9dd7c6129683 130 setState(&mbed_master_Data, Operational);
sam_grove 0:9dd7c6129683 131 stack_state = reset;
sam_grove 0:9dd7c6129683 132 }
sam_grove 0:9dd7c6129683 133
sam_grove 0:9dd7c6129683 134 // other events
sam_grove 0:9dd7c6129683 135 //sendPDOevent (&mbed_master_Data);
sam_grove 0:9dd7c6129683 136 }
sam_grove 0:9dd7c6129683 137 }
sam_grove 0:9dd7c6129683 138 }
sam_grove 0:9dd7c6129683 139
sam_grove 0:9dd7c6129683 140 // ISR for the Ticker
sam_grove 0:9dd7c6129683 141 void serviceSysTimer()
sam_grove 0:9dd7c6129683 142 {
sam_grove 0:9dd7c6129683 143 // just used for debugging purposes
sam_grove 0:9dd7c6129683 144 serviceHelper();
sam_grove 0:9dd7c6129683 145 // set a flag cleared by the main loop
sam_grove 0:9dd7c6129683 146 timer_interrupt = 1;
sam_grove 0:9dd7c6129683 147 }
sam_grove 0:9dd7c6129683 148