BEI ZHANG
/
RM3100_SPI_SampleCode
RM3100 SPI sample code
main.cpp@0:71d5c1c75f0b, 2019-03-10 (annotated)
- Committer:
- BeiZhang
- Date:
- Sun Mar 10 01:45:12 2019 +0000
- Revision:
- 0:71d5c1c75f0b
RM3100 SPI Sample Code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BeiZhang | 0:71d5c1c75f0b | 1 | /** |
BeiZhang | 0:71d5c1c75f0b | 2 | * @file main.cpp |
BeiZhang | 0:71d5c1c75f0b | 3 | * |
BeiZhang | 0:71d5c1c75f0b | 4 | * @brief Sample interface for RM3100. |
BeiZhang | 0:71d5c1c75f0b | 5 | * |
BeiZhang | 0:71d5c1c75f0b | 6 | * @authors Betty Zhang |
BeiZhang | 0:71d5c1c75f0b | 7 | * @date 05/21/2018 |
BeiZhang | 0:71d5c1c75f0b | 8 | * @copyright (C) 2018 PNI Corp, Protonex LLC |
BeiZhang | 0:71d5c1c75f0b | 9 | * |
BeiZhang | 0:71d5c1c75f0b | 10 | * @copyright Disclosure to third parties or reproduction in any form |
BeiZhang | 0:71d5c1c75f0b | 11 | * whatsoever, without prior written consent, is strictly forbidden |
BeiZhang | 0:71d5c1c75f0b | 12 | * |
BeiZhang | 0:71d5c1c75f0b | 13 | */ |
BeiZhang | 0:71d5c1c75f0b | 14 | |
BeiZhang | 0:71d5c1c75f0b | 15 | #include "mbed.h" |
BeiZhang | 0:71d5c1c75f0b | 16 | #include "main.h" |
BeiZhang | 0:71d5c1c75f0b | 17 | #include "RM3100.h" |
BeiZhang | 0:71d5c1c75f0b | 18 | |
BeiZhang | 0:71d5c1c75f0b | 19 | |
BeiZhang | 0:71d5c1c75f0b | 20 | Serial comport(SERIAL_TX, SERIAL_RX); |
BeiZhang | 0:71d5c1c75f0b | 21 | |
BeiZhang | 0:71d5c1c75f0b | 22 | RM3100 rm3100; |
BeiZhang | 0:71d5c1c75f0b | 23 | |
BeiZhang | 0:71d5c1c75f0b | 24 | //Global variables |
BeiZhang | 0:71d5c1c75f0b | 25 | int serial_inchar; |
BeiZhang | 0:71d5c1c75f0b | 26 | float actual_rate; |
BeiZhang | 0:71d5c1c75f0b | 27 | |
BeiZhang | 0:71d5c1c75f0b | 28 | void OnSerial(void) |
BeiZhang | 0:71d5c1c75f0b | 29 | { |
BeiZhang | 0:71d5c1c75f0b | 30 | serial_inchar = comport.getc(); |
BeiZhang | 0:71d5c1c75f0b | 31 | } |
BeiZhang | 0:71d5c1c75f0b | 32 | |
BeiZhang | 0:71d5c1c75f0b | 33 | //============================================================================= |
BeiZhang | 0:71d5c1c75f0b | 34 | // Serial input Character (Key) Commands, courtesy of JM. |
BeiZhang | 0:71d5c1c75f0b | 35 | //============================================================================= |
BeiZhang | 0:71d5c1c75f0b | 36 | // This function is called upon every incomming serial character |
BeiZhang | 0:71d5c1c75f0b | 37 | void processSerialInchar(char key) |
BeiZhang | 0:71d5c1c75f0b | 38 | { |
BeiZhang | 0:71d5c1c75f0b | 39 | // The Simple Serial protocal mostly consists of single character commands |
BeiZhang | 0:71d5c1c75f0b | 40 | // send '?' to list available commands |
BeiZhang | 0:71d5c1c75f0b | 41 | |
BeiZhang | 0:71d5c1c75f0b | 42 | serial_inchar = NULL; |
BeiZhang | 0:71d5c1c75f0b | 43 | int tmrc_val, rate; |
BeiZhang | 0:71d5c1c75f0b | 44 | |
BeiZhang | 0:71d5c1c75f0b | 45 | switch (key) { |
BeiZhang | 0:71d5c1c75f0b | 46 | case '+': |
BeiZhang | 0:71d5c1c75f0b | 47 | rm3100.ChangeSampleRate(1); |
BeiZhang | 0:71d5c1c75f0b | 48 | break; |
BeiZhang | 0:71d5c1c75f0b | 49 | |
BeiZhang | 0:71d5c1c75f0b | 50 | case '-': |
BeiZhang | 0:71d5c1c75f0b | 51 | rm3100.ChangeSampleRate(-1); |
BeiZhang | 0:71d5c1c75f0b | 52 | break; |
BeiZhang | 0:71d5c1c75f0b | 53 | |
BeiZhang | 0:71d5c1c75f0b | 54 | case '>': |
BeiZhang | 0:71d5c1c75f0b | 55 | rm3100.ChangeCycleCount(1); |
BeiZhang | 0:71d5c1c75f0b | 56 | break; |
BeiZhang | 0:71d5c1c75f0b | 57 | |
BeiZhang | 0:71d5c1c75f0b | 58 | case '<': |
BeiZhang | 0:71d5c1c75f0b | 59 | rm3100.ChangeCycleCount(-1); |
BeiZhang | 0:71d5c1c75f0b | 60 | break; |
BeiZhang | 0:71d5c1c75f0b | 61 | |
BeiZhang | 0:71d5c1c75f0b | 62 | case 'a': |
BeiZhang | 0:71d5c1c75f0b | 63 | rm3100.DisplayREVIDReg(); |
BeiZhang | 0:71d5c1c75f0b | 64 | break; |
BeiZhang | 0:71d5c1c75f0b | 65 | case 'b': |
BeiZhang | 0:71d5c1c75f0b | 66 | rate = rm3100.GetSampleRate(&tmrc_val); |
BeiZhang | 0:71d5c1c75f0b | 67 | comport.printf("Host process rate = %3.1f Hz, reqRate = %d, TMRC=0x%X\n\r",actual_rate, rate, tmrc_val); |
BeiZhang | 0:71d5c1c75f0b | 68 | break; |
BeiZhang | 0:71d5c1c75f0b | 69 | case 'c': |
BeiZhang | 0:71d5c1c75f0b | 70 | rm3100.DisplayCycleCount(); |
BeiZhang | 0:71d5c1c75f0b | 71 | break; |
BeiZhang | 0:71d5c1c75f0b | 72 | |
BeiZhang | 0:71d5c1c75f0b | 73 | case 'q': |
BeiZhang | 0:71d5c1c75f0b | 74 | rm3100.SelfTest(); |
BeiZhang | 0:71d5c1c75f0b | 75 | break; |
BeiZhang | 0:71d5c1c75f0b | 76 | case 'r': |
BeiZhang | 0:71d5c1c75f0b | 77 | rm3100.RunCMM(1); //Run CMM |
BeiZhang | 0:71d5c1c75f0b | 78 | rm3100.ClearDrdyInt(); |
BeiZhang | 0:71d5c1c75f0b | 79 | break; |
BeiZhang | 0:71d5c1c75f0b | 80 | |
BeiZhang | 0:71d5c1c75f0b | 81 | case 's': |
BeiZhang | 0:71d5c1c75f0b | 82 | rm3100.RunCMM(0); //Stop |
BeiZhang | 0:71d5c1c75f0b | 83 | rate = rm3100.GetSampleRate(&tmrc_val); |
BeiZhang | 0:71d5c1c75f0b | 84 | comport.printf("Host process rate = %3.1f Hz, reqRate = %d, TMRC=0x%X\n\r",actual_rate, rate, tmrc_val); |
BeiZhang | 0:71d5c1c75f0b | 85 | break; |
BeiZhang | 0:71d5c1c75f0b | 86 | |
BeiZhang | 0:71d5c1c75f0b | 87 | case '?': { |
BeiZhang | 0:71d5c1c75f0b | 88 | u8 bar[45]; |
BeiZhang | 0:71d5c1c75f0b | 89 | memset(bar, 205, sizeof(bar)); |
BeiZhang | 0:71d5c1c75f0b | 90 | bar[sizeof(bar)-1] = 0; |
BeiZhang | 0:71d5c1c75f0b | 91 | comport.printf("\n\r"); |
BeiZhang | 0:71d5c1c75f0b | 92 | comport.printf(" RM3100 Commands\n\r"); |
BeiZhang | 0:71d5c1c75f0b | 93 | comport.printf(" Revision: %s\n\r",REVISION); |
BeiZhang | 0:71d5c1c75f0b | 94 | comport.printf(" %c%s%c\n\r", 201, bar, 187); |
BeiZhang | 0:71d5c1c75f0b | 95 | comport.printf(" %c Commands (case sensitive) %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 96 | // Status and configuration |
BeiZhang | 0:71d5c1c75f0b | 97 | comport.printf(" %c%s%c\n\r", 204, bar, 185); |
BeiZhang | 0:71d5c1c75f0b | 98 | comport.printf(" %c Settings and Status %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 99 | comport.printf(" %c%s%c\n\r", 204, bar, 185); |
BeiZhang | 0:71d5c1c75f0b | 100 | comport.printf(" %c a : Display REVID %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 101 | comport.printf(" %c b : Display host rate, request rate & TMRC %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 102 | comport.printf(" %c c : Display cycle count, gain & max rate %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 103 | comport.printf(" %c + : Increase Sample Rate %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 104 | comport.printf(" %c - : Decrease Sample Rate %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 105 | comport.printf(" %c > : Increase Cycle Count %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 106 | comport.printf(" %c < : Decrease Cycle Count %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 107 | |
BeiZhang | 0:71d5c1c75f0b | 108 | // Tests |
BeiZhang | 0:71d5c1c75f0b | 109 | comport.printf(" %c%s%c\n\r", 204, bar, 185); |
BeiZhang | 0:71d5c1c75f0b | 110 | comport.printf(" %c Tests %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 111 | comport.printf(" %c%s%c\n\r", 204, bar, 185); |
BeiZhang | 0:71d5c1c75f0b | 112 | comport.printf(" %c q : Run sensor Self tests %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 113 | comport.printf(" %c r : Run continous mode %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 114 | comport.printf(" %c s : Stop continous mode %c\n\r", 186, 186); |
BeiZhang | 0:71d5c1c75f0b | 115 | |
BeiZhang | 0:71d5c1c75f0b | 116 | comport.printf(" %c%s%c\n\r", 200, bar, 188); |
BeiZhang | 0:71d5c1c75f0b | 117 | |
BeiZhang | 0:71d5c1c75f0b | 118 | } |
BeiZhang | 0:71d5c1c75f0b | 119 | default: |
BeiZhang | 0:71d5c1c75f0b | 120 | break; |
BeiZhang | 0:71d5c1c75f0b | 121 | } |
BeiZhang | 0:71d5c1c75f0b | 122 | } |
BeiZhang | 0:71d5c1c75f0b | 123 | |
BeiZhang | 0:71d5c1c75f0b | 124 | int main() { |
BeiZhang | 0:71d5c1c75f0b | 125 | |
BeiZhang | 0:71d5c1c75f0b | 126 | int counter = 0; |
BeiZhang | 0:71d5c1c75f0b | 127 | Timer timer; |
BeiZhang | 0:71d5c1c75f0b | 128 | |
BeiZhang | 0:71d5c1c75f0b | 129 | |
BeiZhang | 0:71d5c1c75f0b | 130 | // Init user serial interface |
BeiZhang | 0:71d5c1c75f0b | 131 | comport.baud(921600); |
BeiZhang | 0:71d5c1c75f0b | 132 | comport.printf("\n\rRM3100 Host SPI Sample Code Ver %s on mBed\n\r",REVISION); |
BeiZhang | 0:71d5c1c75f0b | 133 | |
BeiZhang | 0:71d5c1c75f0b | 134 | //Set sample rate |
BeiZhang | 0:71d5c1c75f0b | 135 | rm3100.SetSampleRateReg(1); //in Hz |
BeiZhang | 0:71d5c1c75f0b | 136 | |
BeiZhang | 0:71d5c1c75f0b | 137 | //Start to CMM run |
BeiZhang | 0:71d5c1c75f0b | 138 | rm3100.RunCMM(1); |
BeiZhang | 0:71d5c1c75f0b | 139 | |
BeiZhang | 0:71d5c1c75f0b | 140 | // Setup interrupt callback functions |
BeiZhang | 0:71d5c1c75f0b | 141 | comport.attach(&OnSerial); // user input from serial term |
BeiZhang | 0:71d5c1c75f0b | 142 | |
BeiZhang | 0:71d5c1c75f0b | 143 | // Callback function to the rising edge |
BeiZhang | 0:71d5c1c75f0b | 144 | rm3100.DrdyCallBack(); |
BeiZhang | 0:71d5c1c75f0b | 145 | |
BeiZhang | 0:71d5c1c75f0b | 146 | //Clear Interrupt first |
BeiZhang | 0:71d5c1c75f0b | 147 | rm3100.ClearDrdyInt(); |
BeiZhang | 0:71d5c1c75f0b | 148 | |
BeiZhang | 0:71d5c1c75f0b | 149 | while (1) |
BeiZhang | 0:71d5c1c75f0b | 150 | { |
BeiZhang | 0:71d5c1c75f0b | 151 | |
BeiZhang | 0:71d5c1c75f0b | 152 | if (serial_inchar) |
BeiZhang | 0:71d5c1c75f0b | 153 | { |
BeiZhang | 0:71d5c1c75f0b | 154 | processSerialInchar(serial_inchar); // process user key commands |
BeiZhang | 0:71d5c1c75f0b | 155 | serial_inchar = NULL; |
BeiZhang | 0:71d5c1c75f0b | 156 | } |
BeiZhang | 0:71d5c1c75f0b | 157 | |
BeiZhang | 0:71d5c1c75f0b | 158 | if (counter <= 1) |
BeiZhang | 0:71d5c1c75f0b | 159 | timer.start(); |
BeiZhang | 0:71d5c1c75f0b | 160 | else if (counter >= 10) |
BeiZhang | 0:71d5c1c75f0b | 161 | { |
BeiZhang | 0:71d5c1c75f0b | 162 | timer.stop(); |
BeiZhang | 0:71d5c1c75f0b | 163 | float time = timer.read(); |
BeiZhang | 0:71d5c1c75f0b | 164 | actual_rate = 10.0/time; |
BeiZhang | 0:71d5c1c75f0b | 165 | if (actual_rate <= 150) { |
BeiZhang | 0:71d5c1c75f0b | 166 | __disable_irq(); // Disable Interrupts |
BeiZhang | 0:71d5c1c75f0b | 167 | comport.printf("Counter=%d, time=%3.3f s, Host Proc rate = %3.1f Hz\n\r",counter, time, actual_rate); |
BeiZhang | 0:71d5c1c75f0b | 168 | __enable_irq(); // Enable Interrupts |
BeiZhang | 0:71d5c1c75f0b | 169 | } |
BeiZhang | 0:71d5c1c75f0b | 170 | counter = 0; |
BeiZhang | 0:71d5c1c75f0b | 171 | timer.reset(); |
BeiZhang | 0:71d5c1c75f0b | 172 | } |
BeiZhang | 0:71d5c1c75f0b | 173 | |
BeiZhang | 0:71d5c1c75f0b | 174 | //Process Drdy Interrupt |
BeiZhang | 0:71d5c1c75f0b | 175 | if (rm3100.GetDrdyIntFlag()) |
BeiZhang | 0:71d5c1c75f0b | 176 | { |
BeiZhang | 0:71d5c1c75f0b | 177 | rm3100.SetDrdyIntFlag(0); |
BeiZhang | 0:71d5c1c75f0b | 178 | |
BeiZhang | 0:71d5c1c75f0b | 179 | //If sample rate is higher than 150Hz, serial port cannot process in time |
BeiZhang | 0:71d5c1c75f0b | 180 | //skip samples to make the host keep up, but to clear drdy interrupt |
BeiZhang | 0:71d5c1c75f0b | 181 | if ((actual_rate <= 150) || (counter == 1)) |
BeiZhang | 0:71d5c1c75f0b | 182 | rm3100.ReadRM3100(); |
BeiZhang | 0:71d5c1c75f0b | 183 | else |
BeiZhang | 0:71d5c1c75f0b | 184 | rm3100.ClearDrdyInt(); |
BeiZhang | 0:71d5c1c75f0b | 185 | |
BeiZhang | 0:71d5c1c75f0b | 186 | counter++; |
BeiZhang | 0:71d5c1c75f0b | 187 | } |
BeiZhang | 0:71d5c1c75f0b | 188 | } |
BeiZhang | 0:71d5c1c75f0b | 189 | } |