Add I2CSlave to ov580 master.

Dependencies:   MorseGenerator2

Committer:
claytonk
Date:
Fri Oct 19 01:54:34 2018 +0000
Revision:
1:ffffa383ba7e
Parent:
0:605fe136b7ea
Child:
2:afc300c4f8e4
writing initial commands and getting to green flashy on plug, but once in app the flashy goes away and the illumination doesn't come on

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 1:ffffa383ba7e 6 - I2C write occurs on
claytonk 0:605fe136b7ea 7
claytonk 0:605fe136b7ea 8 -Reoccuring enable from app that will prevent the emitters from remaining
claytonk 0:605fe136b7ea 9 on if the app crashes and a turn off command isn't sent
claytonk 0:605fe136b7ea 10 - Can be a counter on the emitter enable > threshold
claytonk 0:605fe136b7ea 11
claytonk 0:605fe136b7ea 12 -Flood/Dot tagging indicated on GPIO3
claytonk 0:605fe136b7ea 13 - 0 Flood
claytonk 0:605fe136b7ea 14 - 1 DOT
claytonk 0:605fe136b7ea 15
claytonk 0:605fe136b7ea 16 -Fault indication on GPIO4 to indicate to app to reboot
claytonk 0:605fe136b7ea 17 - 0 OK
claytonk 0:605fe136b7ea 18 - 1 Fault/Reboot
claytonk 0:605fe136b7ea 19
claytonk 0:605fe136b7ea 20 I2C write commands
claytonk 0:605fe136b7ea 21 Reg: Information Condition
claytonk 0:605fe136b7ea 22 0x00 Emitter enable 0x00 Emitters off
claytonk 0:605fe136b7ea 23 0x01 Dot on
claytonk 0:605fe136b7ea 24 0x10 Flood on
claytonk 0:605fe136b7ea 25 0x11 Flood / Dot on
claytonk 0:605fe136b7ea 26
claytonk 1:ffffa383ba7e 27 0x01 Dot fault Read from LM36011
claytonk 0:605fe136b7ea 28
claytonk 0:605fe136b7ea 29 0x02 Flood Fault Read from LM36011
claytonk 0:605fe136b7ea 30
claytonk 0:605fe136b7ea 31 0x03 Kill VCSEL Fault Define this
claytonk 0:605fe136b7ea 32
claytonk 0:605fe136b7ea 33 */
claytonk 0:605fe136b7ea 34
claytonk 0:605fe136b7ea 35 // define pins for I2C
claytonk 0:605fe136b7ea 36 #define dot_sda p2
claytonk 0:605fe136b7ea 37 #define dot_scl p4
claytonk 0:605fe136b7ea 38 #define flood_sda p28
claytonk 0:605fe136b7ea 39 #define flood_scl p3
claytonk 0:605fe136b7ea 40 #define ov580_sda p30
claytonk 0:605fe136b7ea 41 #define ov580_scl p31
claytonk 0:605fe136b7ea 42 #define strobe_dot p23
claytonk 0:605fe136b7ea 43 #define strobe_flood p24
claytonk 0:605fe136b7ea 44 #define pwm_1_pin p29
claytonk 0:605fe136b7ea 45 #define pwm_0_pin p5
claytonk 0:605fe136b7ea 46
claytonk 0:605fe136b7ea 47 // define LED pins
claytonk 0:605fe136b7ea 48 #define ledRed p12
claytonk 0:605fe136b7ea 49 #define ledGreen p17
claytonk 0:605fe136b7ea 50 #define ledBlue p13
claytonk 0:605fe136b7ea 51
claytonk 0:605fe136b7ea 52 // initialize LEDs
claytonk 0:605fe136b7ea 53 DigitalOut red(ledRed,1);
claytonk 0:605fe136b7ea 54 DigitalOut green(ledGreen,1);
claytonk 0:605fe136b7ea 55 DigitalOut blue(ledBlue,1);
claytonk 0:605fe136b7ea 56
claytonk 0:605fe136b7ea 57 // Initialize outputs
claytonk 0:605fe136b7ea 58 DigitalIn pwm_1(pwm_1_pin,PullNone);
claytonk 0:605fe136b7ea 59
claytonk 0:605fe136b7ea 60 // Initialize inputs
claytonk 0:605fe136b7ea 61 DigitalIn strobe0(p23,PullNone);
claytonk 0:605fe136b7ea 62 DigitalIn strobe1(p24,PullNone);
claytonk 0:605fe136b7ea 63 DigitalIn pwm_0(pwm_0_pin,PullNone);
claytonk 0:605fe136b7ea 64 DigitalIn vcselFault(p25,PullNone);
claytonk 0:605fe136b7ea 65 DigitalIn killVcsel(p26,PullNone);
claytonk 0:605fe136b7ea 66
claytonk 0:605fe136b7ea 67 static uint8_t LM36011_addr = 0x64 << 1; //0xC8
claytonk 0:605fe136b7ea 68
claytonk 0:605fe136b7ea 69 // register names
claytonk 0:605fe136b7ea 70 static uint8_t enable_reg = 0x01;
claytonk 0:605fe136b7ea 71 static uint8_t configuration_reg = 0x02;
claytonk 0:605fe136b7ea 72 static uint8_t brightness_reg = 0x03;
claytonk 0:605fe136b7ea 73 static uint8_t torch_reg = 0x04;
claytonk 0:605fe136b7ea 74 static uint8_t flags_reg = 0x05;
claytonk 0:605fe136b7ea 75 static uint8_t device_id_reset_reg = 0x06;
claytonk 0:605fe136b7ea 76
claytonk 0:605fe136b7ea 77 // register settings
claytonk 0:605fe136b7ea 78 static uint8_t enable_ir = 0x05;
claytonk 0:605fe136b7ea 79 static uint8_t disable_ir = 0x20;
claytonk 0:605fe136b7ea 80 static uint8_t enable_flash_timeout = 0x01;
claytonk 0:605fe136b7ea 81
claytonk 0:605fe136b7ea 82 // level settings
claytonk 0:605fe136b7ea 83 static uint8_t level_flood_max = 0x66; // = 1.2 A
claytonk 0:605fe136b7ea 84 //static uint8_t level_dot_max = 0x5F; // = 1.03 A
claytonk 0:605fe136b7ea 85 //static uint8_t level_dot_max = 0x3F; // = 0.75 A
claytonk 0:605fe136b7ea 86 //static uint8_t level_dot_max = 0x3C; // = 0.70 A
claytonk 0:605fe136b7ea 87 //static uint8_t level_dot_max = 0x15 //0.257 A
claytonk 0:605fe136b7ea 88 static uint8_t level_dot_max = 0x1F; // = 352mA
claytonk 0:605fe136b7ea 89
claytonk 0:605fe136b7ea 90 //size_t write_size 2;
claytonk 0:605fe136b7ea 91 bool err;
claytonk 0:605fe136b7ea 92 bool on = false;
claytonk 0:605fe136b7ea 93 bool stacked_error = false;
claytonk 0:605fe136b7ea 94 bool in_app = false;
claytonk 0:605fe136b7ea 95 uint64_t stacked_counter = 0;
claytonk 0:605fe136b7ea 96 bool flip = false;
claytonk 0:605fe136b7ea 97 bool dot_on = false;
claytonk 0:605fe136b7ea 98 bool flood_on = false;
claytonk 0:605fe136b7ea 99 bool pulsed = false;
claytonk 0:605fe136b7ea 100
claytonk 0:605fe136b7ea 101 char lmInit[2] = {enable_reg,enable_ir};
claytonk 0:605fe136b7ea 102 char lmOff[2] = {enable_reg,disable_ir};
claytonk 0:605fe136b7ea 103 char lmSafety[2] = {configuration_reg,enable_flash_timeout};
claytonk 0:605fe136b7ea 104
claytonk 0:605fe136b7ea 105 char flashBrightness_dot[2] = {brightness_reg,level_dot_max};
claytonk 0:605fe136b7ea 106 char flashBrightness_flood[2] = {brightness_reg,level_flood_max};
claytonk 0:605fe136b7ea 107
claytonk 0:605fe136b7ea 108 //create interupts
claytonk 1:ffffa383ba7e 109 InterruptIn strobe_0(p23);
claytonk 1:ffffa383ba7e 110 InterruptIn strobe_1(p24);
claytonk 0:605fe136b7ea 111
claytonk 0:605fe136b7ea 112 // i2c declarations
claytonk 0:605fe136b7ea 113 I2C flood_I2C(flood_sda,flood_scl);
claytonk 0:605fe136b7ea 114 I2C dot_I2C(dot_sda,dot_scl);
claytonk 0:605fe136b7ea 115 I2CSlave ov_I2C(ov580_sda,ov580_scl);
claytonk 0:605fe136b7ea 116
claytonk 1:ffffa383ba7e 117 // functions
claytonk 1:ffffa383ba7e 118 void lightsOn()
claytonk 1:ffffa383ba7e 119 {
claytonk 1:ffffa383ba7e 120 // set on true if stacked error isn't present
claytonk 1:ffffa383ba7e 121 if(in_app) {
claytonk 1:ffffa383ba7e 122
claytonk 1:ffffa383ba7e 123 if(!pulsed && dot_on) {
claytonk 1:ffffa383ba7e 124 // set driver current
claytonk 1:ffffa383ba7e 125 dot_I2C.write(LM36011_addr, lmInit, 2, false);
claytonk 1:ffffa383ba7e 126 wait_us(2);
claytonk 1:ffffa383ba7e 127 } else if (pulsed && flip) {
claytonk 1:ffffa383ba7e 128 dot_I2C.write(LM36011_addr, lmInit, 2, false);
claytonk 1:ffffa383ba7e 129 wait_us(2);
claytonk 1:ffffa383ba7e 130 } else {
claytonk 1:ffffa383ba7e 131 dot_I2C.write(LM36011_addr, lmOff, 2, false);
claytonk 1:ffffa383ba7e 132 wait_us(2);
claytonk 1:ffffa383ba7e 133 }
claytonk 1:ffffa383ba7e 134
claytonk 1:ffffa383ba7e 135 if(!pulsed && flood_on) {
claytonk 1:ffffa383ba7e 136 flood_I2C.write(LM36011_addr, lmInit, 2, false);
claytonk 1:ffffa383ba7e 137 wait_us(2);
claytonk 1:ffffa383ba7e 138 } else if (pulsed && !flip) {
claytonk 1:ffffa383ba7e 139 flood_I2C.write(LM36011_addr, lmInit, 2, false);
claytonk 1:ffffa383ba7e 140 wait_us(2);
claytonk 1:ffffa383ba7e 141 } else {
claytonk 1:ffffa383ba7e 142 flood_I2C.write(LM36011_addr, lmOff, 2, false);
claytonk 1:ffffa383ba7e 143 wait_us(2);
claytonk 1:ffffa383ba7e 144 }
claytonk 1:ffffa383ba7e 145 }
claytonk 1:ffffa383ba7e 146 }
claytonk 1:ffffa383ba7e 147
claytonk 1:ffffa383ba7e 148 void stack_check()
claytonk 1:ffffa383ba7e 149 {
claytonk 1:ffffa383ba7e 150 // check strobe 1 for high, and if high set stacked_error
claytonk 1:ffffa383ba7e 151 stacked_error = strobe_1.read();
claytonk 1:ffffa383ba7e 152 if(stacked_error) {
claytonk 1:ffffa383ba7e 153 stacked_counter++;
claytonk 1:ffffa383ba7e 154 } else {
claytonk 1:ffffa383ba7e 155 in_app = false;
claytonk 1:ffffa383ba7e 156 stacked_counter = 0;
claytonk 1:ffffa383ba7e 157 }
claytonk 1:ffffa383ba7e 158 if(stacked_counter > 30) {
claytonk 1:ffffa383ba7e 159 in_app = true;
claytonk 1:ffffa383ba7e 160 }
claytonk 1:ffffa383ba7e 161 flood_on = pwm_0;
claytonk 1:ffffa383ba7e 162 dot_on = pwm_1;
claytonk 1:ffffa383ba7e 163 if(flood_on && dot_on) {
claytonk 1:ffffa383ba7e 164 pulsed = true;
claytonk 1:ffffa383ba7e 165
claytonk 1:ffffa383ba7e 166 } else {
claytonk 1:ffffa383ba7e 167 pulsed = false;
claytonk 1:ffffa383ba7e 168 }
claytonk 1:ffffa383ba7e 169
claytonk 1:ffffa383ba7e 170 flip = !flip;
claytonk 1:ffffa383ba7e 171 }
claytonk 1:ffffa383ba7e 172
claytonk 0:605fe136b7ea 173 // main() runs in its own thread in the OS
claytonk 1:ffffa383ba7e 174 int main()
claytonk 1:ffffa383ba7e 175 {
claytonk 1:ffffa383ba7e 176
claytonk 0:605fe136b7ea 177 // set I2C Frequency to 400kHz
claytonk 0:605fe136b7ea 178 flood_I2C.frequency(400000);
claytonk 0:605fe136b7ea 179 dot_I2C.frequency(400000);
claytonk 1:ffffa383ba7e 180
claytonk 0:605fe136b7ea 181 // write safety
claytonk 0:605fe136b7ea 182 flood_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 0:605fe136b7ea 183 dot_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 0:605fe136b7ea 184
claytonk 1:ffffa383ba7e 185 // write brightness
claytonk 1:ffffa383ba7e 186 flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false);
claytonk 1:ffffa383ba7e 187 dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false);
claytonk 1:ffffa383ba7e 188
claytonk 1:ffffa383ba7e 189 // set interrupts
claytonk 1:ffffa383ba7e 190 strobe_0.fall(lightsOn);
claytonk 1:ffffa383ba7e 191 strobe_0.rise(stack_check);
claytonk 1:ffffa383ba7e 192
claytonk 0:605fe136b7ea 193 while (true) {
claytonk 1:ffffa383ba7e 194
claytonk 0:605fe136b7ea 195 green = !green;
claytonk 0:605fe136b7ea 196 wait(0.5);
claytonk 0:605fe136b7ea 197 }
claytonk 0:605fe136b7ea 198 }
claytonk 0:605fe136b7ea 199