Code for the mbed NXP LPC1768. To be used on The Robot Studio Master Boards. License : Simplified BSD.

Dependencies:   MODSERIAL mbed

Committer:
rrknight
Date:
Thu Feb 28 17:31:55 2013 +0000
Revision:
0:369222671f3c
Child:
1:95d85c81bb11
high speed reading works

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rrknight 0:369222671f3c 1 #include"mbed.h"
rrknight 0:369222671f3c 2
rrknight 0:369222671f3c 3 #define MODSERIAL_DEFAULT_RX_BUFFER_SIZE 512
rrknight 0:369222671f3c 4 #define MODSERIAL_DEFAULT_TX_BUFFER_SIZE 1024
rrknight 0:369222671f3c 5 #include "MODSERIAL.h"
rrknight 0:369222671f3c 6
rrknight 0:369222671f3c 7 //Define
rrknight 0:369222671f3c 8 #define NUMBER_MAX_EPOS2_PER_SLAVE 15
rrknight 0:369222671f3c 9 #define NUMBER_MSG_PER_PACKET 15
rrknight 0:369222671f3c 10 #define NUMBER_BYTES_PER_MSG 7
rrknight 0:369222671f3c 11 #define NUMBER_SLAVE_BOARDS 3
rrknight 0:369222671f3c 12 #define EPOS2_OK 0
rrknight 0:369222671f3c 13 #define EPOS2_ERROR -1
rrknight 0:369222671f3c 14 #define LOOP_PERIOD_TIME 20000 //20 ms
rrknight 0:369222671f3c 15
rrknight 0:369222671f3c 16 //SPI RxTx FIFO bits
rrknight 0:369222671f3c 17 #define TNF 0x02
rrknight 0:369222671f3c 18 #define TFE 0x01
rrknight 0:369222671f3c 19 #define RNE 0x04
rrknight 0:369222671f3c 20
rrknight 0:369222671f3c 21 MODSERIAL ros(p28, p27, 1024, 512); // tx, rx
rrknight 0:369222671f3c 22 Serial pc(USBTX, USBRX); //terminal for debug
rrknight 0:369222671f3c 23 DigitalOut ledchain[] = {(LED1), (LED2), (LED3), (LED4)}; //used for debugging
rrknight 0:369222671f3c 24 DigitalOut logicPin(p26); //to record with Logic analyser on an event, pin high.
rrknight 0:369222671f3c 25
rrknight 0:369222671f3c 26 char* readBufferSerial; //[NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer of packets read by the master (written by the ros node on pc side)
rrknight 0:369222671f3c 27 uint8_t writeBufferSPI[NUMBER_SLAVE_BOARDS][NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer ready to be sent over SPI to different slaves
rrknight 0:369222671f3c 28 uint8_t readBufferSPI[NUMBER_SLAVE_BOARDS][NUMBER_MSG_PER_PACKET][NUMBER_BYTES_PER_MSG]; //buffer read by the master on SPI bus
rrknight 0:369222671f3c 29
rrknight 0:369222671f3c 30 Timer timer;
rrknight 0:369222671f3c 31 uint64_t begin, end;
rrknight 0:369222671f3c 32 uint8_t numberCmds[NUMBER_SLAVE_BOARDS];
rrknight 0:369222671f3c 33
rrknight 0:369222671f3c 34 bool newCmd_detected = false;
rrknight 0:369222671f3c 35 uint8_t nbArrows = 0;
rrknight 0:369222671f3c 36
rrknight 0:369222671f3c 37 uint8_t i=0;
rrknight 0:369222671f3c 38 uint8_t j=0;
rrknight 0:369222671f3c 39
rrknight 0:369222671f3c 40 char rByte = 0x00;
rrknight 0:369222671f3c 41 bool threeArrowsFound = false;
rrknight 0:369222671f3c 42
rrknight 0:369222671f3c 43 // Called everytime a new character goes into
rrknight 0:369222671f3c 44 // the RX buffer. Test that character for '/'
rrknight 0:369222671f3c 45 // Note, rxGetLastChar() gets the last char that
rrknight 0:369222671f3c 46 // we received but it does NOT remove it from
rrknight 0:369222671f3c 47 // the RX buffer.
rrknight 0:369222671f3c 48 void rxCallback(MODSERIAL_IRQ_INFO *q)
rrknight 0:369222671f3c 49 {
rrknight 0:369222671f3c 50 logicPin = 1;
rrknight 0:369222671f3c 51
rrknight 0:369222671f3c 52 MODSERIAL *serial = q->serial;
rrknight 0:369222671f3c 53
rrknight 0:369222671f3c 54 if ( serial->rxGetLastChar() == '/')
rrknight 0:369222671f3c 55 {
rrknight 0:369222671f3c 56 //pc.printf("new1\n");
rrknight 0:369222671f3c 57 //newline_detected = true;
rrknight 0:369222671f3c 58 serial->move(readBufferSerial, NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG, '\n');
rrknight 0:369222671f3c 59 serial->rxBufferFlush();
rrknight 0:369222671f3c 60 //pc.printf("new\n");
rrknight 0:369222671f3c 61 //for(int n=0; n<1; n++)
rrknight 0:369222671f3c 62 //{
rrknight 0:369222671f3c 63 //pc.printf("new2\n\r");
rrknight 0:369222671f3c 64 //pc.printf("0x%02X\n", s[0]);
rrknight 0:369222671f3c 65 //pc.printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", s[0], s[1], s[2], s[3], s[4], s[5], s[6]);
rrknight 0:369222671f3c 66 //}
rrknight 0:369222671f3c 67 }
rrknight 0:369222671f3c 68 /*
rrknight 0:369222671f3c 69 rByte = serial->rxGetLastChar();
rrknight 0:369222671f3c 70
rrknight 0:369222671f3c 71 if(nbArrows < 3)
rrknight 0:369222671f3c 72 {
rrknight 0:369222671f3c 73 if(rByte == 0x3C)
rrknight 0:369222671f3c 74 {
rrknight 0:369222671f3c 75 nbArrows++;
rrknight 0:369222671f3c 76 }
rrknight 0:369222671f3c 77 else
rrknight 0:369222671f3c 78 {
rrknight 0:369222671f3c 79 nbArrows = 0;
rrknight 0:369222671f3c 80 }
rrknight 0:369222671f3c 81
rrknight 0:369222671f3c 82 if(nbArrows == 3)
rrknight 0:369222671f3c 83 {
rrknight 0:369222671f3c 84 threeArrowsFound = true;
rrknight 0:369222671f3c 85 }
rrknight 0:369222671f3c 86 }
rrknight 0:369222671f3c 87 else
rrknight 0:369222671f3c 88 {
rrknight 0:369222671f3c 89 readBufferSerial[i][j] = rByte;
rrknight 0:369222671f3c 90 //pc.printf("i=%d j=%d\n", i,j);
rrknight 0:369222671f3c 91
rrknight 0:369222671f3c 92 j++;
rrknight 0:369222671f3c 93 if(j >= NUMBER_BYTES_PER_MSG)
rrknight 0:369222671f3c 94 {
rrknight 0:369222671f3c 95 j = 0;
rrknight 0:369222671f3c 96 i++; //next cmd
rrknight 0:369222671f3c 97
rrknight 0:369222671f3c 98 if(i >= NUMBER_MSG_PER_PACKET)
rrknight 0:369222671f3c 99 {
rrknight 0:369222671f3c 100 nbArrows = 0;
rrknight 0:369222671f3c 101 i = 0;
rrknight 0:369222671f3c 102 j = 0;
rrknight 0:369222671f3c 103 serial->rxBufferFlush();
rrknight 0:369222671f3c 104 //serial->txBufferFlush();
rrknight 0:369222671f3c 105
rrknight 0:369222671f3c 106 for(int n=0; n<1; n++)
rrknight 0:369222671f3c 107 {
rrknight 0:369222671f3c 108 pc.printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", readBufferSerial[n][0], readBufferSerial[n][1], readBufferSerial[n][2], readBufferSerial[n][3], readBufferSerial[n][4], readBufferSerial[n][5], readBufferSerial[n][6]);
rrknight 0:369222671f3c 109 }
rrknight 0:369222671f3c 110 }
rrknight 0:369222671f3c 111 }
rrknight 0:369222671f3c 112 }
rrknight 0:369222671f3c 113 */
rrknight 0:369222671f3c 114 logicPin = 0;
rrknight 0:369222671f3c 115 }
rrknight 0:369222671f3c 116
rrknight 0:369222671f3c 117 int main()
rrknight 0:369222671f3c 118 {
rrknight 0:369222671f3c 119 ros.baud(460800); //460800 works //921600 don't
rrknight 0:369222671f3c 120 pc.baud(115200);
rrknight 0:369222671f3c 121
rrknight 0:369222671f3c 122 i=0;
rrknight 0:369222671f3c 123 j=0;
rrknight 0:369222671f3c 124
rrknight 0:369222671f3c 125 //init alloc
rrknight 0:369222671f3c 126 readBufferSerial = (char*)malloc(NUMBER_MSG_PER_PACKET*NUMBER_BYTES_PER_MSG*sizeof(char*));
rrknight 0:369222671f3c 127
rrknight 0:369222671f3c 128 ros.attach(&rxCallback, MODSERIAL::RxIrq);
rrknight 0:369222671f3c 129
rrknight 0:369222671f3c 130 pc.printf("*** Start Master Main ***\n\r");
rrknight 0:369222671f3c 131
rrknight 0:369222671f3c 132 logicPin = 0;
rrknight 0:369222671f3c 133
rrknight 0:369222671f3c 134 // Wait here until we detect the \n going into the buffer.
rrknight 0:369222671f3c 135 while(!newCmd_detected);
rrknight 0:369222671f3c 136
rrknight 0:369222671f3c 137 // When we get here the RX buffer now contains a sentence.
rrknight 0:369222671f3c 138 // ...
rrknight 0:369222671f3c 139
rrknight 0:369222671f3c 140 }