Add I2CSlave to ov580 master.

Dependencies:   MorseGenerator2

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?

UserRevisionLine numberNew 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