Add I2CSlave to ov580 master.

Dependencies:   MorseGenerator2

Committer:
claytonk
Date:
Sun Oct 21 22:24:52 2018 +0000
Revision:
3:6b14862f5f51
Parent:
2:afc300c4f8e4
Child:
4:fc0c93cb0197
adding reading

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 0:605fe136b7ea 26 0x00 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 1:ffffa383ba7e 31 0x01 Dot fault Read from LM36011
claytonk 0:605fe136b7ea 32
claytonk 3:6b14862f5f51 33 0x02 Dot Current 0x00 - level_dot_max
claytonk 3:6b14862f5f51 34
claytonk 3:6b14862f5f51 35 0x03 Flood Fault Read from LM36011
claytonk 3:6b14862f5f51 36
claytonk 3:6b14862f5f51 37 0x04 Flood Current 0x00 - level_flood_max
claytonk 0:605fe136b7ea 38
claytonk 3:6b14862f5f51 39 0x05 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 3:6b14862f5f51 47 0x06 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 3:6b14862f5f51 76
claytonk 3:6b14862f5f51 77 /* I/O */
claytonk 0:605fe136b7ea 78 // initialize LEDs
claytonk 0:605fe136b7ea 79 DigitalOut red(ledRed,1);
claytonk 0:605fe136b7ea 80 DigitalOut green(ledGreen,1);
claytonk 0:605fe136b7ea 81 DigitalOut blue(ledBlue,1);
claytonk 0:605fe136b7ea 82
claytonk 0:605fe136b7ea 83 // Initialize outputs
claytonk 3:6b14862f5f51 84 DigitalOut pwm_0_output(pwm_0_pin,0); // GPIO 3
claytonk 3:6b14862f5f51 85 DigitalOut pwm_1_output(pwm_1_pin,0); // GPIO 4
claytonk 0:605fe136b7ea 86
claytonk 0:605fe136b7ea 87 // Initialize inputs
claytonk 0:605fe136b7ea 88 DigitalIn strobe0(p23,PullNone);
claytonk 0:605fe136b7ea 89 DigitalIn strobe1(p24,PullNone);
claytonk 0:605fe136b7ea 90 DigitalIn vcselFault(p25,PullNone);
claytonk 3:6b14862f5f51 91 //DigitalIn killVcsel(p26,PullNone); // vcselFault is 1V8 instead of 3V3
claytonk 0:605fe136b7ea 92
claytonk 3:6b14862f5f51 93 /* REGISTERS */
claytonk 0:605fe136b7ea 94 static uint8_t LM36011_addr = 0x64 << 1; //0xC8
claytonk 0:605fe136b7ea 95
claytonk 0:605fe136b7ea 96 // register names
claytonk 0:605fe136b7ea 97 static uint8_t enable_reg = 0x01;
claytonk 0:605fe136b7ea 98 static uint8_t configuration_reg = 0x02;
claytonk 0:605fe136b7ea 99 static uint8_t brightness_reg = 0x03;
claytonk 3:6b14862f5f51 100 //static uint8_t torch_reg = 0x04;
claytonk 3:6b14862f5f51 101 //static uint8_t flags_reg = 0x05;
claytonk 3:6b14862f5f51 102 //static uint8_t device_id_reset_reg = 0x06;
claytonk 0:605fe136b7ea 103
claytonk 0:605fe136b7ea 104 // register settings
claytonk 0:605fe136b7ea 105 static uint8_t enable_ir = 0x05;
claytonk 0:605fe136b7ea 106 static uint8_t disable_ir = 0x20;
claytonk 0:605fe136b7ea 107 static uint8_t enable_flash_timeout = 0x01;
claytonk 0:605fe136b7ea 108
claytonk 0:605fe136b7ea 109 // level settings
claytonk 0:605fe136b7ea 110 static uint8_t level_flood_max = 0x66; // = 1.2 A
claytonk 3:6b14862f5f51 111 static uint8_t level_dot_max = 0x5F; // = 1.03 A
claytonk 0:605fe136b7ea 112 //static uint8_t level_dot_max = 0x3F; // = 0.75 A
claytonk 0:605fe136b7ea 113 //static uint8_t level_dot_max = 0x3C; // = 0.70 A
claytonk 0:605fe136b7ea 114 //static uint8_t level_dot_max = 0x15 //0.257 A
claytonk 3:6b14862f5f51 115 //static uint8_t level_dot_max = 0x1F; // = 352mA
claytonk 0:605fe136b7ea 116
claytonk 3:6b14862f5f51 117 char lm_on[2] = {enable_reg,enable_ir};
claytonk 3:6b14862f5f51 118 char lm_off[2] = {enable_reg,disable_ir};
claytonk 0:605fe136b7ea 119 char lmSafety[2] = {configuration_reg,enable_flash_timeout};
claytonk 0:605fe136b7ea 120
claytonk 0:605fe136b7ea 121 char flashBrightness_dot[2] = {brightness_reg,level_dot_max};
claytonk 0:605fe136b7ea 122 char flashBrightness_flood[2] = {brightness_reg,level_flood_max};
claytonk 0:605fe136b7ea 123
claytonk 3:6b14862f5f51 124 /* INTERRUPTS */
claytonk 0:605fe136b7ea 125 //create interupts
claytonk 3:6b14862f5f51 126 InterruptIn int_strobe_dot(strobe_dot);
claytonk 3:6b14862f5f51 127 //InterruptIn int_strobe_flood(strobe_flood); // only need one interrupt in
claytonk 0:605fe136b7ea 128
claytonk 3:6b14862f5f51 129 /* I2C */
claytonk 0:605fe136b7ea 130 // i2c declarations
claytonk 0:605fe136b7ea 131 I2C flood_I2C(flood_sda,flood_scl);
claytonk 0:605fe136b7ea 132 I2C dot_I2C(dot_sda,dot_scl);
claytonk 0:605fe136b7ea 133 I2CSlave ov_I2C(ov580_sda,ov580_scl);
claytonk 0:605fe136b7ea 134
claytonk 3:6b14862f5f51 135 /* VARIABLES */
claytonk 3:6b14862f5f51 136 bool stacked = false;
claytonk 3:6b14862f5f51 137 bool emitter_status_dot = false;
claytonk 3:6b14862f5f51 138 int timeout = 20;
claytonk 3:6b14862f5f51 139 char rcv_buffer[3] = {0,0,0};
claytonk 3:6b14862f5f51 140
claytonk 3:6b14862f5f51 141 /* FUNCTIONS */
claytonk 1:ffffa383ba7e 142 void lightsOn()
claytonk 1:ffffa383ba7e 143 {
claytonk 3:6b14862f5f51 144 pwm_0_output = emitter_status_dot;
claytonk 1:ffffa383ba7e 145 }
claytonk 1:ffffa383ba7e 146
claytonk 1:ffffa383ba7e 147 void stack_check()
claytonk 1:ffffa383ba7e 148 {
claytonk 3:6b14862f5f51 149 stacked = strobe1.read();
claytonk 3:6b14862f5f51 150 emitter_status_dot = !emitter_status_dot;
claytonk 1:ffffa383ba7e 151 }
claytonk 1:ffffa383ba7e 152
claytonk 0:605fe136b7ea 153 // main() runs in its own thread in the OS
claytonk 1:ffffa383ba7e 154 int main()
claytonk 1:ffffa383ba7e 155 {
claytonk 3:6b14862f5f51 156 wait(10);
claytonk 1:ffffa383ba7e 157
claytonk 0:605fe136b7ea 158 // set I2C Frequency to 400kHz
claytonk 0:605fe136b7ea 159 flood_I2C.frequency(400000);
claytonk 0:605fe136b7ea 160 dot_I2C.frequency(400000);
claytonk 3:6b14862f5f51 161 ov_I2C.frequency(400000);
claytonk 3:6b14862f5f51 162
claytonk 3:6b14862f5f51 163 ov_I2C.address(0x10);
claytonk 1:ffffa383ba7e 164
claytonk 0:605fe136b7ea 165 // write safety
claytonk 0:605fe136b7ea 166 flood_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 0:605fe136b7ea 167 dot_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 3:6b14862f5f51 168
claytonk 1:ffffa383ba7e 169 // write brightness
claytonk 1:ffffa383ba7e 170 flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false);
claytonk 3:6b14862f5f51 171 dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false);
claytonk 3:6b14862f5f51 172 //dot_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 1:ffffa383ba7e 173
claytonk 1:ffffa383ba7e 174 // set interrupts
claytonk 3:6b14862f5f51 175 int_strobe_dot.rise(stack_check);
claytonk 3:6b14862f5f51 176 int_strobe_dot.fall(lightsOn);
claytonk 3:6b14862f5f51 177
claytonk 3:6b14862f5f51 178 char msg[2] = {1,1};
claytonk 2:afc300c4f8e4 179
claytonk 1:ffffa383ba7e 180
claytonk 0:605fe136b7ea 181 while (true) {
claytonk 3:6b14862f5f51 182 int i = ov_I2C.receive();
claytonk 1:ffffa383ba7e 183
claytonk 3:6b14862f5f51 184 switch(i) {
claytonk 3:6b14862f5f51 185 case I2CSlave::ReadAddressed:
claytonk 3:6b14862f5f51 186 ov_I2C.write(msg, 2);
claytonk 3:6b14862f5f51 187 break;
claytonk 3:6b14862f5f51 188 case I2CSlave::WriteGeneral:
claytonk 3:6b14862f5f51 189 ov_I2C.read(rcv_buffer, 3);
claytonk 3:6b14862f5f51 190 break;
claytonk 3:6b14862f5f51 191 case I2CSlave::WriteAddressed:
claytonk 3:6b14862f5f51 192 ov_I2C.read(rcv_buffer, 3);
claytonk 3:6b14862f5f51 193 /*
claytonk 3:6b14862f5f51 194 if ((int)rcv_buffer[0] == 1 && (int)rcv_buffer[1] == 1) {
claytonk 3:6b14862f5f51 195 green = 0;
claytonk 3:6b14862f5f51 196 red = 1;
claytonk 3:6b14862f5f51 197 } else {
claytonk 3:6b14862f5f51 198 red = 0;
claytonk 3:6b14862f5f51 199 green = 1;
claytonk 3:6b14862f5f51 200 }
claytonk 3:6b14862f5f51 201 */
claytonk 3:6b14862f5f51 202 green = 0;
claytonk 3:6b14862f5f51 203 dot_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 3:6b14862f5f51 204 break;
claytonk 3:6b14862f5f51 205 }
claytonk 3:6b14862f5f51 206
claytonk 3:6b14862f5f51 207 // clear buffer
claytonk 3:6b14862f5f51 208 for (int k = 0; k < 3; k++) rcv_buffer[i]=0;
claytonk 3:6b14862f5f51 209
claytonk 3:6b14862f5f51 210 //green = !emitter_status_dot;
claytonk 3:6b14862f5f51 211 //red = emitter_status_dot;
claytonk 3:6b14862f5f51 212
claytonk 0:605fe136b7ea 213 }
claytonk 0:605fe136b7ea 214 }
claytonk 0:605fe136b7ea 215