Jason Chang
/
9v1
Add I2CSlave to ov580 master.
main.cpp@5:60c20a7f7735, 2018-10-22 (annotated)
- Committer:
- claytonk
- Date:
- Mon Oct 22 23:09:36 2018 +0000
- Revision:
- 5:60c20a7f7735
- Parent:
- 4:fc0c93cb0197
- Child:
- 6:85d9ad912c14
explicitly set KillVCSEL to an input
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
claytonk | 0:605fe136b7ea | 1 | #include "mbed.h" |
claytonk | 0:605fe136b7ea | 2 | |
claytonk | 0:605fe136b7ea | 3 | /* |
claytonk | 0:605fe136b7ea | 4 | FEATURE REQUIREMENTS |
claytonk | 0:605fe136b7ea | 5 | |
claytonk | 3:6b14862f5f51 | 6 | - I2C write occurs on falling edge of strobe pulse to prevent unknown states |
claytonk | 3:6b14862f5f51 | 7 | |
claytonk | 3:6b14862f5f51 | 8 | - Stack check occurs on leading edge of strobe pulse to ensure strobes are |
claytonk | 3:6b14862f5f51 | 9 | set correctly |
claytonk | 0:605fe136b7ea | 10 | |
claytonk | 3:6b14862f5f51 | 11 | - Reoccuring enable from app that will prevent the emitters from remaining |
claytonk | 3:6b14862f5f51 | 12 | on if the app crashes and a turn off command isn't sent |
claytonk | 0:605fe136b7ea | 13 | - Can be a counter on the emitter enable > threshold |
claytonk | 3:6b14862f5f51 | 14 | - Better if it's a counter based on reads from the fault register |
claytonk | 0:605fe136b7ea | 15 | |
claytonk | 0:605fe136b7ea | 16 | -Flood/Dot tagging indicated on GPIO3 |
claytonk | 0:605fe136b7ea | 17 | - 0 Flood |
claytonk | 0:605fe136b7ea | 18 | - 1 DOT |
claytonk | 0:605fe136b7ea | 19 | |
claytonk | 0:605fe136b7ea | 20 | -Fault indication on GPIO4 to indicate to app to reboot |
claytonk | 0:605fe136b7ea | 21 | - 0 OK |
claytonk | 0:605fe136b7ea | 22 | - 1 Fault/Reboot |
claytonk | 0:605fe136b7ea | 23 | |
claytonk | 0:605fe136b7ea | 24 | I2C write commands |
claytonk | 0:605fe136b7ea | 25 | Reg: Information Condition |
claytonk | 4:fc0c93cb0197 | 26 | 0x0000 Emitter enable 0x00 Emitters off |
claytonk | 0:605fe136b7ea | 27 | 0x01 Dot on |
claytonk | 0:605fe136b7ea | 28 | 0x10 Flood on |
claytonk | 0:605fe136b7ea | 29 | 0x11 Flood / Dot on |
claytonk | 0:605fe136b7ea | 30 | |
claytonk | 4:fc0c93cb0197 | 31 | 0x0001 Dot fault Read from LM36011 |
claytonk | 0:605fe136b7ea | 32 | |
claytonk | 4:fc0c93cb0197 | 33 | 0x0002 Dot Current 0x00 - level_dot_max |
claytonk | 3:6b14862f5f51 | 34 | |
claytonk | 4:fc0c93cb0197 | 35 | 0x0003 Flood Fault Read from LM36011 |
claytonk | 3:6b14862f5f51 | 36 | |
claytonk | 4:fc0c93cb0197 | 37 | 0x0004 Flood Current 0x00 - level_flood_max |
claytonk | 0:605fe136b7ea | 38 | |
claytonk | 4:fc0c93cb0197 | 39 | 0x0005 Fault register bit[0] KILL_VCSEL fault |
claytonk | 3:6b14862f5f51 | 40 | bit[1] dot fault |
claytonk | 3:6b14862f5f51 | 41 | bit[2] flood fault |
claytonk | 3:6b14862f5f51 | 42 | bit[3] unstacked fault |
claytonk | 3:6b14862f5f51 | 43 | bit[4] ?not in app fault? |
claytonk | 3:6b14862f5f51 | 44 | bit[5-7] unused |
claytonk | 3:6b14862f5f51 | 45 | |
claytonk | 3:6b14862f5f51 | 46 | |
claytonk | 4:fc0c93cb0197 | 47 | 0x0006 Version number 0x70 = version 7.0 |
claytonk | 0:605fe136b7ea | 48 | |
claytonk | 0:605fe136b7ea | 49 | */ |
claytonk | 0:605fe136b7ea | 50 | |
claytonk | 3:6b14862f5f51 | 51 | /* DEFINES */ |
claytonk | 3:6b14862f5f51 | 52 | |
claytonk | 3:6b14862f5f51 | 53 | #define version_number 0x70 |
claytonk | 3:6b14862f5f51 | 54 | |
claytonk | 0:605fe136b7ea | 55 | // define pins for I2C |
claytonk | 0:605fe136b7ea | 56 | #define dot_sda p2 |
claytonk | 0:605fe136b7ea | 57 | #define dot_scl p4 |
claytonk | 0:605fe136b7ea | 58 | #define flood_sda p28 |
claytonk | 0:605fe136b7ea | 59 | #define flood_scl p3 |
claytonk | 0:605fe136b7ea | 60 | #define ov580_sda p30 |
claytonk | 0:605fe136b7ea | 61 | #define ov580_scl p31 |
claytonk | 3:6b14862f5f51 | 62 | |
claytonk | 3:6b14862f5f51 | 63 | // define strobe pins |
claytonk | 0:605fe136b7ea | 64 | #define strobe_dot p23 |
claytonk | 0:605fe136b7ea | 65 | #define strobe_flood p24 |
claytonk | 3:6b14862f5f51 | 66 | |
claytonk | 3:6b14862f5f51 | 67 | // define pmw pins |
claytonk | 0:605fe136b7ea | 68 | #define pwm_1_pin p29 |
claytonk | 0:605fe136b7ea | 69 | #define pwm_0_pin p5 |
claytonk | 0:605fe136b7ea | 70 | |
claytonk | 0:605fe136b7ea | 71 | // define LED pins |
claytonk | 0:605fe136b7ea | 72 | #define ledRed p12 |
claytonk | 0:605fe136b7ea | 73 | #define ledGreen p17 |
claytonk | 0:605fe136b7ea | 74 | #define ledBlue p13 |
claytonk | 0:605fe136b7ea | 75 | |
claytonk | 4:fc0c93cb0197 | 76 | /* THREAD */ |
claytonk | 4:fc0c93cb0197 | 77 | EventQueue queue; |
claytonk | 4:fc0c93cb0197 | 78 | |
claytonk | 4:fc0c93cb0197 | 79 | /* INTERRUPTS */ |
claytonk | 4:fc0c93cb0197 | 80 | //create interupts |
claytonk | 4:fc0c93cb0197 | 81 | InterruptIn int_strobe_dot(strobe_dot); |
claytonk | 4:fc0c93cb0197 | 82 | //InterruptIn int_strobe_flood(strobe_flood); // only need one interrupt in |
claytonk | 3:6b14862f5f51 | 83 | |
claytonk | 3:6b14862f5f51 | 84 | /* I/O */ |
claytonk | 0:605fe136b7ea | 85 | // initialize LEDs |
claytonk | 0:605fe136b7ea | 86 | DigitalOut red(ledRed,1); |
claytonk | 0:605fe136b7ea | 87 | DigitalOut green(ledGreen,1); |
claytonk | 0:605fe136b7ea | 88 | DigitalOut blue(ledBlue,1); |
claytonk | 0:605fe136b7ea | 89 | |
claytonk | 0:605fe136b7ea | 90 | // Initialize outputs |
claytonk | 3:6b14862f5f51 | 91 | DigitalOut pwm_0_output(pwm_0_pin,0); // GPIO 3 |
claytonk | 3:6b14862f5f51 | 92 | DigitalOut pwm_1_output(pwm_1_pin,0); // GPIO 4 |
claytonk | 0:605fe136b7ea | 93 | |
claytonk | 0:605fe136b7ea | 94 | // Initialize inputs |
claytonk | 0:605fe136b7ea | 95 | DigitalIn strobe0(p23,PullNone); |
claytonk | 0:605fe136b7ea | 96 | DigitalIn strobe1(p24,PullNone); |
claytonk | 0:605fe136b7ea | 97 | DigitalIn vcselFault(p25,PullNone); |
claytonk | 5:60c20a7f7735 | 98 | DigitalIn killVcsel(p26,PullNone); // vcselFault is 1V8 instead of 3V3 |
claytonk | 0:605fe136b7ea | 99 | |
claytonk | 3:6b14862f5f51 | 100 | /* REGISTERS */ |
claytonk | 0:605fe136b7ea | 101 | static uint8_t LM36011_addr = 0x64 << 1; //0xC8 |
claytonk | 0:605fe136b7ea | 102 | |
claytonk | 0:605fe136b7ea | 103 | // register names |
claytonk | 0:605fe136b7ea | 104 | static uint8_t enable_reg = 0x01; |
claytonk | 0:605fe136b7ea | 105 | static uint8_t configuration_reg = 0x02; |
claytonk | 0:605fe136b7ea | 106 | static uint8_t brightness_reg = 0x03; |
claytonk | 3:6b14862f5f51 | 107 | //static uint8_t torch_reg = 0x04; |
claytonk | 3:6b14862f5f51 | 108 | //static uint8_t flags_reg = 0x05; |
claytonk | 3:6b14862f5f51 | 109 | //static uint8_t device_id_reset_reg = 0x06; |
claytonk | 0:605fe136b7ea | 110 | |
claytonk | 0:605fe136b7ea | 111 | // register settings |
claytonk | 0:605fe136b7ea | 112 | static uint8_t enable_ir = 0x05; |
claytonk | 0:605fe136b7ea | 113 | static uint8_t disable_ir = 0x20; |
claytonk | 0:605fe136b7ea | 114 | static uint8_t enable_flash_timeout = 0x01; |
claytonk | 0:605fe136b7ea | 115 | |
claytonk | 0:605fe136b7ea | 116 | // level settings |
claytonk | 0:605fe136b7ea | 117 | static uint8_t level_flood_max = 0x66; // = 1.2 A |
claytonk | 3:6b14862f5f51 | 118 | static uint8_t level_dot_max = 0x5F; // = 1.03 A |
claytonk | 0:605fe136b7ea | 119 | //static uint8_t level_dot_max = 0x3F; // = 0.75 A |
claytonk | 0:605fe136b7ea | 120 | //static uint8_t level_dot_max = 0x3C; // = 0.70 A |
claytonk | 0:605fe136b7ea | 121 | //static uint8_t level_dot_max = 0x15 //0.257 A |
claytonk | 3:6b14862f5f51 | 122 | //static uint8_t level_dot_max = 0x1F; // = 352mA |
claytonk | 0:605fe136b7ea | 123 | |
claytonk | 3:6b14862f5f51 | 124 | char lm_on[2] = {enable_reg,enable_ir}; |
claytonk | 3:6b14862f5f51 | 125 | char lm_off[2] = {enable_reg,disable_ir}; |
claytonk | 0:605fe136b7ea | 126 | char lmSafety[2] = {configuration_reg,enable_flash_timeout}; |
claytonk | 0:605fe136b7ea | 127 | |
claytonk | 0:605fe136b7ea | 128 | char flashBrightness_dot[2] = {brightness_reg,level_dot_max}; |
claytonk | 0:605fe136b7ea | 129 | char flashBrightness_flood[2] = {brightness_reg,level_flood_max}; |
claytonk | 0:605fe136b7ea | 130 | |
claytonk | 3:6b14862f5f51 | 131 | /* I2C */ |
claytonk | 0:605fe136b7ea | 132 | I2C flood_I2C(flood_sda,flood_scl); |
claytonk | 0:605fe136b7ea | 133 | I2C dot_I2C(dot_sda,dot_scl); |
claytonk | 0:605fe136b7ea | 134 | I2CSlave ov_I2C(ov580_sda,ov580_scl); |
claytonk | 0:605fe136b7ea | 135 | |
claytonk | 3:6b14862f5f51 | 136 | /* VARIABLES */ |
claytonk | 3:6b14862f5f51 | 137 | bool stacked = false; |
claytonk | 3:6b14862f5f51 | 138 | bool emitter_status_dot = false; |
claytonk | 3:6b14862f5f51 | 139 | char rcv_buffer[3] = {0,0,0}; |
claytonk | 3:6b14862f5f51 | 140 | |
claytonk | 3:6b14862f5f51 | 141 | /* FUNCTIONS */ |
claytonk | 1:ffffa383ba7e | 142 | |
claytonk | 1:ffffa383ba7e | 143 | void stack_check() |
claytonk | 1:ffffa383ba7e | 144 | { |
claytonk | 4:fc0c93cb0197 | 145 | // see if stacked |
claytonk | 3:6b14862f5f51 | 146 | stacked = strobe1.read(); |
claytonk | 4:fc0c93cb0197 | 147 | // toggle dot / flood indicator on PWM 0 |
claytonk | 3:6b14862f5f51 | 148 | emitter_status_dot = !emitter_status_dot; |
claytonk | 1:ffffa383ba7e | 149 | } |
claytonk | 1:ffffa383ba7e | 150 | |
claytonk | 4:fc0c93cb0197 | 151 | void write_once() |
claytonk | 4:fc0c93cb0197 | 152 | { |
claytonk | 4:fc0c93cb0197 | 153 | if(stacked) { |
claytonk | 4:fc0c93cb0197 | 154 | if(emitter_status_dot) { |
claytonk | 4:fc0c93cb0197 | 155 | flood_I2C.write(LM36011_addr,lm_off,2,false); |
claytonk | 4:fc0c93cb0197 | 156 | dot_I2C.write(LM36011_addr,lm_on,2,false); |
claytonk | 4:fc0c93cb0197 | 157 | } else { |
claytonk | 4:fc0c93cb0197 | 158 | dot_I2C.write(LM36011_addr,lm_off,2,false); |
claytonk | 4:fc0c93cb0197 | 159 | flood_I2C.write(LM36011_addr,lm_on,2,false); |
claytonk | 4:fc0c93cb0197 | 160 | } |
claytonk | 4:fc0c93cb0197 | 161 | } else { |
claytonk | 4:fc0c93cb0197 | 162 | dot_I2C.write(LM36011_addr,lm_off,2,false); |
claytonk | 4:fc0c93cb0197 | 163 | flood_I2C.write(LM36011_addr,lm_off,2,false); |
claytonk | 4:fc0c93cb0197 | 164 | } |
claytonk | 4:fc0c93cb0197 | 165 | } |
claytonk | 4:fc0c93cb0197 | 166 | |
claytonk | 4:fc0c93cb0197 | 167 | void lightsOn() |
claytonk | 4:fc0c93cb0197 | 168 | { |
claytonk | 4:fc0c93cb0197 | 169 | // change dot/flood indicator |
claytonk | 4:fc0c93cb0197 | 170 | pwm_0_output = emitter_status_dot; |
claytonk | 4:fc0c93cb0197 | 171 | // indicate VCSEL fault if it exists |
claytonk | 4:fc0c93cb0197 | 172 | pwm_1_output = !vcselFault.read(); |
claytonk | 4:fc0c93cb0197 | 173 | queue.call(&write_once); |
claytonk | 4:fc0c93cb0197 | 174 | } |
claytonk | 4:fc0c93cb0197 | 175 | |
claytonk | 4:fc0c93cb0197 | 176 | |
claytonk | 4:fc0c93cb0197 | 177 | |
claytonk | 4:fc0c93cb0197 | 178 | |
claytonk | 0:605fe136b7ea | 179 | // main() runs in its own thread in the OS |
claytonk | 1:ffffa383ba7e | 180 | int main() |
claytonk | 1:ffffa383ba7e | 181 | { |
claytonk | 4:fc0c93cb0197 | 182 | Thread eventThread(osPriorityHigh);; |
claytonk | 4:fc0c93cb0197 | 183 | eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); |
claytonk | 4:fc0c93cb0197 | 184 | |
claytonk | 4:fc0c93cb0197 | 185 | // set interrupts |
claytonk | 4:fc0c93cb0197 | 186 | int_strobe_dot.rise(&stack_check); |
claytonk | 4:fc0c93cb0197 | 187 | int_strobe_dot.fall(&lightsOn); |
claytonk | 4:fc0c93cb0197 | 188 | |
claytonk | 4:fc0c93cb0197 | 189 | wait(3); |
claytonk | 1:ffffa383ba7e | 190 | |
claytonk | 0:605fe136b7ea | 191 | // set I2C Frequency to 400kHz |
claytonk | 0:605fe136b7ea | 192 | flood_I2C.frequency(400000); |
claytonk | 0:605fe136b7ea | 193 | dot_I2C.frequency(400000); |
claytonk | 3:6b14862f5f51 | 194 | ov_I2C.frequency(400000); |
claytonk | 3:6b14862f5f51 | 195 | |
claytonk | 4:fc0c93cb0197 | 196 | ov_I2C.address(0x20); |
claytonk | 1:ffffa383ba7e | 197 | |
claytonk | 0:605fe136b7ea | 198 | // write safety |
claytonk | 0:605fe136b7ea | 199 | flood_I2C.write(LM36011_addr,lmSafety,2,false); |
claytonk | 0:605fe136b7ea | 200 | dot_I2C.write(LM36011_addr,lmSafety,2,false); |
claytonk | 3:6b14862f5f51 | 201 | |
claytonk | 1:ffffa383ba7e | 202 | // write brightness |
claytonk | 1:ffffa383ba7e | 203 | flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false); |
claytonk | 3:6b14862f5f51 | 204 | dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false); |
claytonk | 1:ffffa383ba7e | 205 | |
claytonk | 4:fc0c93cb0197 | 206 | char read_buff[2] = {0,0}; |
claytonk | 1:ffffa383ba7e | 207 | |
claytonk | 0:605fe136b7ea | 208 | while (true) { |
claytonk | 4:fc0c93cb0197 | 209 | |
claytonk | 3:6b14862f5f51 | 210 | int i = ov_I2C.receive(); |
claytonk | 1:ffffa383ba7e | 211 | |
claytonk | 3:6b14862f5f51 | 212 | switch(i) { |
claytonk | 3:6b14862f5f51 | 213 | case I2CSlave::ReadAddressed: |
claytonk | 4:fc0c93cb0197 | 214 | ov_I2C.write(read_buff[1]); |
claytonk | 3:6b14862f5f51 | 215 | break; |
claytonk | 3:6b14862f5f51 | 216 | case I2CSlave::WriteGeneral: |
claytonk | 3:6b14862f5f51 | 217 | ov_I2C.read(rcv_buffer, 3); |
claytonk | 3:6b14862f5f51 | 218 | break; |
claytonk | 3:6b14862f5f51 | 219 | case I2CSlave::WriteAddressed: |
claytonk | 4:fc0c93cb0197 | 220 | ov_I2C.stop(); |
claytonk | 4:fc0c93cb0197 | 221 | |
claytonk | 3:6b14862f5f51 | 222 | ov_I2C.read(rcv_buffer, 3); |
claytonk | 3:6b14862f5f51 | 223 | /* |
claytonk | 3:6b14862f5f51 | 224 | if ((int)rcv_buffer[0] == 1 && (int)rcv_buffer[1] == 1) { |
claytonk | 3:6b14862f5f51 | 225 | green = 0; |
claytonk | 3:6b14862f5f51 | 226 | red = 1; |
claytonk | 3:6b14862f5f51 | 227 | } else { |
claytonk | 3:6b14862f5f51 | 228 | red = 0; |
claytonk | 3:6b14862f5f51 | 229 | green = 1; |
claytonk | 3:6b14862f5f51 | 230 | } |
claytonk | 3:6b14862f5f51 | 231 | */ |
claytonk | 3:6b14862f5f51 | 232 | green = 0; |
claytonk | 4:fc0c93cb0197 | 233 | //dot_I2C.write(LM36011_addr,lm_on,2,false); |
claytonk | 3:6b14862f5f51 | 234 | break; |
claytonk | 3:6b14862f5f51 | 235 | } |
claytonk | 3:6b14862f5f51 | 236 | |
claytonk | 3:6b14862f5f51 | 237 | // clear buffer |
claytonk | 4:fc0c93cb0197 | 238 | for (int k = 0; |
claytonk | 4:fc0c93cb0197 | 239 | k < 3; |
claytonk | 4:fc0c93cb0197 | 240 | k++) rcv_buffer[i]=0; |
claytonk | 3:6b14862f5f51 | 241 | |
claytonk | 3:6b14862f5f51 | 242 | //green = !emitter_status_dot; |
claytonk | 3:6b14862f5f51 | 243 | //red = emitter_status_dot; |
claytonk | 3:6b14862f5f51 | 244 | |
claytonk | 0:605fe136b7ea | 245 | } |
claytonk | 0:605fe136b7ea | 246 | } |
claytonk | 0:605fe136b7ea | 247 |