With this program you can configure and run a CAN compatible (also LSS protocol compatible) motor through the mbed\'s CANbus. Further more it gives a basic template that lets you create your own CAN messages. I\'ve implemented a configuration and a running example that the program runs through. Also there\'s 2 kinds of loops it can go into after it\'s ran through it\'s configuration and/or speed setting. It can continuously ask for the motor\'s status (node guarding kind of thing) OR it can continuously ask for the motor\'s position. Make sure you have a if, (elsif), else structure so the counter doesn\'t run out of control. I\'ve tried to put as many comments in as I could. I hope it helps you in understanding the basics of CAN and running devices. I\'m new to it myself, so any critisism is welcome. Enjoy.
Diff: main.cpp
- Revision:
- 0:af731d8a8d2c
- Child:
- 1:3759c5f6cf76
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Feb 11 14:57:24 2011 +0000 @@ -0,0 +1,167 @@ +#include "mbed.h" +#include "CAN.h" + +Ticker ticker; +DigitalOut led1(LED1); +DigitalOut led2(LED2); +CAN can1(p9, p10); // rd, td +CAN can2(p30, p29); + +int counter = 0; +char data[8]; +CANMessage msg; + + +void send() { + if(counter==0) { + //--------Global Start nodes + data[0] = (char)(0x01); // NMT Start RemoteNode + data[1] = (char)(0x00); // Global + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(0000,data,2))) { + printf("Startup sent \n"); + } + led1 = !led1; + counter ++; + } + else if(counter==1) { + //--------LSS Configure mode + data[0] = (char)(0x04); // LSS Set Mode + data[1] = (char)(0x01); // Mode Configure + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,2))) { + printf("LSS Config mode sent \n"); + } + led1 = !led1; + counter ++; + } + else if(counter==2) { + //--------LSS Set Node_ID + data[0] = (char)(0x11); // LSS Set Node_ID + data[1] = (char)(0x01); // to Node_ID: 01 + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,2))) { + printf("LSS Set Node_ID to 0x01 sent \n"); + } + led1 = !led1; + counter ++; + } + else if(counter==3) { + //--------LSS Save Config + data[0] = (char)(0x17); // LSS Save Config + data[1] = (char)(0x00); + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,1))) { + printf("LSS Save Config sent \n"); + } + led1 = !led1; + counter ++; + } + else if(counter==4) { + //--------LSS Set Baudrate + data[0] = (char)(0x13); // LSS Set Baudrate + data[1] = (char)(0x00); // + data[2] = (char)(0x02); // Baudrate index (500kb/s) + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,3))) { + printf("LSS Config mode sent \n"); + } + led1 = !led1; + counter ++; + } + /*else if(counter==5) ( + //--------LSS Set Bit timing + data[0] = (char)(0x15); // LSS Set Bit timing + data[1] = (char)(0x00); // Mode Configure + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,2))) { + printf("LSS Config mode sent \n"); + } + led1 = !led1; + counter ++; + }*/ + else if(counter==5) { + //--------LSS Operation Mode + data[0] = (char)(0x04); // LSS Set Mode + data[1] = (char)(0x00); // Mode operation + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,2))) { + printf("LSS Operation mode sent \n"); + } + led1 = !led1; + counter ++; + } + else { + //--------Inquire IDNode_ID + data[0] = (char)(0x5E); + data[1] = (char)(0x00); + data[2] = (char)(0x00); + data[3] = (char)(0x00); + data[4] = (char)(0x00); + data[5] = (char)(0x00); + data[6] = (char)(0x00); + data[7] = (char)(0x00); + if(can1.write(CANMessage(2021,data,1))) { + printf("Status check sent \n"); + } + led1 = !led1; + counter = 10; + } +} + +int main() { + can2.frequency(500000); //500kbit/s + can1.frequency(500000); + ticker.attach(&send, 1); //Send every second + while(1) { + if(can2.read(msg)) { + printf("Message read with ID: %d\n", msg.id); + printf("Data: %x", msg.data[0]); + printf(" %x", msg.data[1]); + printf(" %x", msg.data[2]); + printf(" %x", msg.data[3]); + printf(" %x", msg.data[4]); + printf(" %x", msg.data[5]); + printf(" %x", msg.data[6]); + printf(" %x\n", msg.data[7]); + printf("Length: %d", msg.len); + printf(", Type: %d", msg.type); + printf(", Format: %d\n\n", msg.format); + led2 = !led2; + } + } +} \ No newline at end of file