Add I2CSlave to ov580 master.

Dependencies:   MorseGenerator2

Committer:
claytonk
Date:
Thu Oct 25 23:06:06 2018 +0000
Revision:
6:85d9ad912c14
Parent:
5:60c20a7f7735
Child:
7:9c77eaad5102
mostly working with a safety fault because of errant strobe

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 6:85d9ad912c14 51 /* TEST THIS AT SOME POINT */
claytonk 6:85d9ad912c14 52
claytonk 6:85d9ad912c14 53 /*
claytonk 6:85d9ad912c14 54 if ( bEnable )
claytonk 6:85d9ad912c14 55 { NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
claytonk 6:85d9ad912c14 56 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos;
claytonk 6:85d9ad912c14 57 }
claytonk 6:85d9ad912c14 58 else
claytonk 6:85d9ad912c14 59 { NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
claytonk 6:85d9ad912c14 60 NRF_TWI0->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; }
claytonk 6:85d9ad912c14 61 */
claytonk 6:85d9ad912c14 62
claytonk 6:85d9ad912c14 63 // Probably something like this for TWIS
claytonk 6:85d9ad912c14 64 // NRF_TWIS0->ENABLE = TWIS_ENABLE_ENABLE_Enabled << TWIS_ENABLE_ENABLE_Pos;
claytonk 6:85d9ad912c14 65
claytonk 3:6b14862f5f51 66 /* DEFINES */
claytonk 3:6b14862f5f51 67
claytonk 3:6b14862f5f51 68 #define version_number 0x70
claytonk 3:6b14862f5f51 69
claytonk 0:605fe136b7ea 70 // define pins for I2C
claytonk 0:605fe136b7ea 71 #define dot_sda p2
claytonk 0:605fe136b7ea 72 #define dot_scl p4
claytonk 0:605fe136b7ea 73 #define flood_sda p28
claytonk 0:605fe136b7ea 74 #define flood_scl p3
claytonk 0:605fe136b7ea 75 #define ov580_sda p30
claytonk 0:605fe136b7ea 76 #define ov580_scl p31
claytonk 3:6b14862f5f51 77
claytonk 3:6b14862f5f51 78 // define strobe pins
claytonk 6:85d9ad912c14 79 #define strobe_flood p23 // strobe0
claytonk 6:85d9ad912c14 80 #define strobe_dot p24 // strobe1
claytonk 3:6b14862f5f51 81
claytonk 3:6b14862f5f51 82 // define pmw pins
claytonk 0:605fe136b7ea 83 #define pwm_1_pin p29
claytonk 0:605fe136b7ea 84 #define pwm_0_pin p5
claytonk 0:605fe136b7ea 85
claytonk 0:605fe136b7ea 86 // define LED pins
claytonk 0:605fe136b7ea 87 #define ledRed p12
claytonk 0:605fe136b7ea 88 #define ledGreen p17
claytonk 0:605fe136b7ea 89 #define ledBlue p13
claytonk 0:605fe136b7ea 90
claytonk 6:85d9ad912c14 91
claytonk 4:fc0c93cb0197 92 /* THREAD */
claytonk 4:fc0c93cb0197 93 EventQueue queue;
claytonk 4:fc0c93cb0197 94
claytonk 6:85d9ad912c14 95 /* TIMOUT */
claytonk 6:85d9ad912c14 96 //Timeout timeout;
claytonk 6:85d9ad912c14 97
claytonk 4:fc0c93cb0197 98 /* INTERRUPTS */
claytonk 4:fc0c93cb0197 99 //create interupts
claytonk 4:fc0c93cb0197 100 InterruptIn int_strobe_dot(strobe_dot);
claytonk 6:85d9ad912c14 101 InterruptIn int_strobe_flood(strobe_flood); // only need one interrupt in
claytonk 3:6b14862f5f51 102
claytonk 3:6b14862f5f51 103 /* I/O */
claytonk 0:605fe136b7ea 104 // initialize LEDs
claytonk 0:605fe136b7ea 105 DigitalOut red(ledRed,1);
claytonk 0:605fe136b7ea 106 DigitalOut green(ledGreen,1);
claytonk 0:605fe136b7ea 107 DigitalOut blue(ledBlue,1);
claytonk 0:605fe136b7ea 108
claytonk 0:605fe136b7ea 109 // Initialize outputs
claytonk 3:6b14862f5f51 110 DigitalOut pwm_0_output(pwm_0_pin,0); // GPIO 3
claytonk 3:6b14862f5f51 111 DigitalOut pwm_1_output(pwm_1_pin,0); // GPIO 4
claytonk 0:605fe136b7ea 112
claytonk 0:605fe136b7ea 113 // Initialize inputs
claytonk 0:605fe136b7ea 114 DigitalIn strobe0(p23,PullNone);
claytonk 0:605fe136b7ea 115 DigitalIn strobe1(p24,PullNone);
claytonk 0:605fe136b7ea 116 DigitalIn vcselFault(p25,PullNone);
claytonk 5:60c20a7f7735 117 DigitalIn killVcsel(p26,PullNone); // vcselFault is 1V8 instead of 3V3
claytonk 0:605fe136b7ea 118
claytonk 3:6b14862f5f51 119 /* REGISTERS */
claytonk 0:605fe136b7ea 120 static uint8_t LM36011_addr = 0x64 << 1; //0xC8
claytonk 0:605fe136b7ea 121
claytonk 0:605fe136b7ea 122 // register names
claytonk 0:605fe136b7ea 123 static uint8_t enable_reg = 0x01;
claytonk 0:605fe136b7ea 124 static uint8_t configuration_reg = 0x02;
claytonk 0:605fe136b7ea 125 static uint8_t brightness_reg = 0x03;
claytonk 3:6b14862f5f51 126 //static uint8_t torch_reg = 0x04;
claytonk 3:6b14862f5f51 127 //static uint8_t flags_reg = 0x05;
claytonk 3:6b14862f5f51 128 //static uint8_t device_id_reset_reg = 0x06;
claytonk 0:605fe136b7ea 129
claytonk 0:605fe136b7ea 130 // register settings
claytonk 0:605fe136b7ea 131 static uint8_t enable_ir = 0x05;
claytonk 0:605fe136b7ea 132 static uint8_t disable_ir = 0x20;
claytonk 0:605fe136b7ea 133 static uint8_t enable_flash_timeout = 0x01;
claytonk 0:605fe136b7ea 134
claytonk 0:605fe136b7ea 135 // level settings
claytonk 0:605fe136b7ea 136 static uint8_t level_flood_max = 0x66; // = 1.2 A
claytonk 3:6b14862f5f51 137 static uint8_t level_dot_max = 0x5F; // = 1.03 A
claytonk 0:605fe136b7ea 138 //static uint8_t level_dot_max = 0x3F; // = 0.75 A
claytonk 0:605fe136b7ea 139 //static uint8_t level_dot_max = 0x3C; // = 0.70 A
claytonk 0:605fe136b7ea 140 //static uint8_t level_dot_max = 0x15 //0.257 A
claytonk 3:6b14862f5f51 141 //static uint8_t level_dot_max = 0x1F; // = 352mA
claytonk 0:605fe136b7ea 142
claytonk 3:6b14862f5f51 143 char lm_on[2] = {enable_reg,enable_ir};
claytonk 3:6b14862f5f51 144 char lm_off[2] = {enable_reg,disable_ir};
claytonk 0:605fe136b7ea 145 char lmSafety[2] = {configuration_reg,enable_flash_timeout};
claytonk 0:605fe136b7ea 146
claytonk 0:605fe136b7ea 147 char flashBrightness_dot[2] = {brightness_reg,level_dot_max};
claytonk 0:605fe136b7ea 148 char flashBrightness_flood[2] = {brightness_reg,level_flood_max};
claytonk 0:605fe136b7ea 149
claytonk 3:6b14862f5f51 150 /* I2C */
claytonk 6:85d9ad912c14 151 //I2CSlave ov_I2C(ov580_sda,ov580_scl);
claytonk 0:605fe136b7ea 152 I2C flood_I2C(flood_sda,flood_scl);
claytonk 0:605fe136b7ea 153 I2C dot_I2C(dot_sda,dot_scl);
claytonk 6:85d9ad912c14 154
claytonk 0:605fe136b7ea 155
claytonk 3:6b14862f5f51 156 /* VARIABLES */
claytonk 3:6b14862f5f51 157 bool stacked = false;
claytonk 3:6b14862f5f51 158 bool emitter_status_dot = false;
claytonk 6:85d9ad912c14 159 //char rcv_buffer[3] = {0,0,0};
claytonk 6:85d9ad912c14 160 bool dot_on = false;
claytonk 6:85d9ad912c14 161 bool flood_on = false;
claytonk 6:85d9ad912c14 162 bool once = false;
claytonk 6:85d9ad912c14 163 //bool in_app = true;
claytonk 6:85d9ad912c14 164 //int stack_counter = 0;
claytonk 3:6b14862f5f51 165
claytonk 3:6b14862f5f51 166 /* FUNCTIONS */
claytonk 1:ffffa383ba7e 167
claytonk 6:85d9ad912c14 168 // WAI
claytonk 6:85d9ad912c14 169 void write_off()
claytonk 6:85d9ad912c14 170 {
claytonk 6:85d9ad912c14 171 dot_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 172 flood_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 173 }
claytonk 6:85d9ad912c14 174
claytonk 6:85d9ad912c14 175 void write_dot()
claytonk 1:ffffa383ba7e 176 {
claytonk 6:85d9ad912c14 177 flood_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 178 dot_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 6:85d9ad912c14 179 }
claytonk 6:85d9ad912c14 180
claytonk 6:85d9ad912c14 181 void write_flood()
claytonk 6:85d9ad912c14 182 {
claytonk 6:85d9ad912c14 183 dot_I2C.write(LM36011_addr,lm_off,2,false);
claytonk 6:85d9ad912c14 184 flood_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 6:85d9ad912c14 185 }
claytonk 6:85d9ad912c14 186
claytonk 6:85d9ad912c14 187 void write_pulsed()
claytonk 6:85d9ad912c14 188 {
claytonk 6:85d9ad912c14 189 if(emitter_status_dot) {
claytonk 6:85d9ad912c14 190 write_dot();
claytonk 6:85d9ad912c14 191 } else {
claytonk 6:85d9ad912c14 192 write_flood();
claytonk 6:85d9ad912c14 193 }
claytonk 1:ffffa383ba7e 194 }
claytonk 1:ffffa383ba7e 195
claytonk 4:fc0c93cb0197 196 void write_once()
claytonk 4:fc0c93cb0197 197 {
claytonk 6:85d9ad912c14 198 // write dot
claytonk 6:85d9ad912c14 199 /*
claytonk 4:fc0c93cb0197 200 if(stacked) {
claytonk 6:85d9ad912c14 201 write_pulsed();
claytonk 6:85d9ad912c14 202 } else {
claytonk 6:85d9ad912c14 203 if(dot_on) {
claytonk 6:85d9ad912c14 204 write_dot();
claytonk 6:85d9ad912c14 205 } else if(flood_on) {
claytonk 6:85d9ad912c14 206 write_flood();
claytonk 4:fc0c93cb0197 207 } else {
claytonk 6:85d9ad912c14 208 write_off();
claytonk 4:fc0c93cb0197 209 }
claytonk 6:85d9ad912c14 210 }
claytonk 6:85d9ad912c14 211 */
claytonk 6:85d9ad912c14 212 write_pulsed();
claytonk 6:85d9ad912c14 213 dot_on = false;
claytonk 6:85d9ad912c14 214 flood_on = false;
claytonk 6:85d9ad912c14 215 }
claytonk 6:85d9ad912c14 216
claytonk 6:85d9ad912c14 217 // WAI
claytonk 6:85d9ad912c14 218 void stack_check()
claytonk 6:85d9ad912c14 219 {
claytonk 6:85d9ad912c14 220 stacked = dot_on && flood_on;
claytonk 6:85d9ad912c14 221
claytonk 6:85d9ad912c14 222 if(stacked) {
claytonk 6:85d9ad912c14 223 // toggle dot / flood indicator on PWM 0
claytonk 6:85d9ad912c14 224 emitter_status_dot = !emitter_status_dot;
claytonk 4:fc0c93cb0197 225 } else {
claytonk 6:85d9ad912c14 226 emitter_status_dot = dot_on;
claytonk 4:fc0c93cb0197 227 }
claytonk 4:fc0c93cb0197 228 }
claytonk 4:fc0c93cb0197 229
claytonk 4:fc0c93cb0197 230 void lightsOn()
claytonk 4:fc0c93cb0197 231 {
claytonk 6:85d9ad912c14 232 // toggle once
claytonk 6:85d9ad912c14 233 once = !once;
claytonk 6:85d9ad912c14 234 if(once) {
claytonk 6:85d9ad912c14 235 // check the status of what strobes are firing
claytonk 6:85d9ad912c14 236 stack_check();
claytonk 6:85d9ad912c14 237 // change dot/flood indicator
claytonk 6:85d9ad912c14 238 pwm_0_output = emitter_status_dot;
claytonk 6:85d9ad912c14 239 // indicate VCSEL fault if it exists
claytonk 6:85d9ad912c14 240 pwm_1_output = !vcselFault.read();
claytonk 6:85d9ad912c14 241 // timeout for app exit
claytonk 6:85d9ad912c14 242 //timeout.attach(&write_off,.5);
claytonk 6:85d9ad912c14 243 // write once
claytonk 6:85d9ad912c14 244 queue.call(&write_once);
claytonk 6:85d9ad912c14 245 }
claytonk 4:fc0c93cb0197 246 }
claytonk 4:fc0c93cb0197 247
claytonk 4:fc0c93cb0197 248
claytonk 4:fc0c93cb0197 249
claytonk 4:fc0c93cb0197 250
claytonk 6:85d9ad912c14 251 void dot_check()
claytonk 6:85d9ad912c14 252 {
claytonk 6:85d9ad912c14 253 dot_on = true;
claytonk 6:85d9ad912c14 254
claytonk 6:85d9ad912c14 255 once = false;
claytonk 6:85d9ad912c14 256 //timeout.detach();
claytonk 6:85d9ad912c14 257 }
claytonk 6:85d9ad912c14 258
claytonk 6:85d9ad912c14 259
claytonk 6:85d9ad912c14 260 void flood_check()
claytonk 6:85d9ad912c14 261 {
claytonk 6:85d9ad912c14 262 flood_on = true;
claytonk 6:85d9ad912c14 263
claytonk 6:85d9ad912c14 264 once = false;
claytonk 6:85d9ad912c14 265 //timeout.detach();
claytonk 6:85d9ad912c14 266 }
claytonk 6:85d9ad912c14 267
claytonk 6:85d9ad912c14 268 // TODOS //
claytonk 6:85d9ad912c14 269 // P0 Get illumination working
claytonk 6:85d9ad912c14 270 // P0 Get in app working
claytonk 6:85d9ad912c14 271 // P0 Get watchdog time working
claytonk 6:85d9ad912c14 272 // P1 Bluetooth OTA updates
claytonk 6:85d9ad912c14 273 // P2 Get writing working
claytonk 6:85d9ad912c14 274 // P2 Get reading working
claytonk 6:85d9ad912c14 275 //
claytonk 6:85d9ad912c14 276
claytonk 0:605fe136b7ea 277 // main() runs in its own thread in the OS
claytonk 1:ffffa383ba7e 278 int main()
claytonk 1:ffffa383ba7e 279 {
claytonk 6:85d9ad912c14 280 wait(5);
claytonk 6:85d9ad912c14 281
claytonk 4:fc0c93cb0197 282 Thread eventThread(osPriorityHigh);;
claytonk 4:fc0c93cb0197 283 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
claytonk 4:fc0c93cb0197 284
claytonk 4:fc0c93cb0197 285 // set interrupts
claytonk 6:85d9ad912c14 286 int_strobe_dot.rise(&dot_check);
claytonk 6:85d9ad912c14 287 int_strobe_flood.rise(&flood_check);
claytonk 4:fc0c93cb0197 288 int_strobe_dot.fall(&lightsOn);
claytonk 6:85d9ad912c14 289 int_strobe_flood.fall(&lightsOn);
claytonk 1:ffffa383ba7e 290
claytonk 0:605fe136b7ea 291 // set I2C Frequency to 400kHz
claytonk 0:605fe136b7ea 292 flood_I2C.frequency(400000);
claytonk 0:605fe136b7ea 293 dot_I2C.frequency(400000);
claytonk 6:85d9ad912c14 294 //ov_I2C.frequency(400000);
claytonk 3:6b14862f5f51 295
claytonk 6:85d9ad912c14 296 //TODO get i2c writes working
claytonk 6:85d9ad912c14 297 //ov_I2C.address(0x10);
claytonk 1:ffffa383ba7e 298
claytonk 0:605fe136b7ea 299 // write safety
claytonk 0:605fe136b7ea 300 flood_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 0:605fe136b7ea 301 dot_I2C.write(LM36011_addr,lmSafety,2,false);
claytonk 3:6b14862f5f51 302
claytonk 1:ffffa383ba7e 303 // write brightness
claytonk 1:ffffa383ba7e 304 flood_I2C.write(LM36011_addr,flashBrightness_flood,2,false);
claytonk 3:6b14862f5f51 305 dot_I2C.write(LM36011_addr,flashBrightness_dot,2,false);
claytonk 1:ffffa383ba7e 306
claytonk 6:85d9ad912c14 307 //char read_buff[2] = {0,0};
claytonk 1:ffffa383ba7e 308
claytonk 0:605fe136b7ea 309 while (true) {
claytonk 4:fc0c93cb0197 310
claytonk 6:85d9ad912c14 311 /*
claytonk 6:85d9ad912c14 312 int i = ov_I2C.receive();
claytonk 1:ffffa383ba7e 313
claytonk 6:85d9ad912c14 314 switch(i) {
claytonk 6:85d9ad912c14 315 case I2CSlave::ReadAddressed:
claytonk 6:85d9ad912c14 316 ov_I2C.write(read_buff[1]);
claytonk 6:85d9ad912c14 317 break;
claytonk 6:85d9ad912c14 318 case I2CSlave::WriteGeneral:
claytonk 6:85d9ad912c14 319 ov_I2C.read(rcv_buffer, 3);
claytonk 6:85d9ad912c14 320 break;
claytonk 6:85d9ad912c14 321 case I2CSlave::WriteAddressed:
claytonk 6:85d9ad912c14 322 ov_I2C.read(rcv_buffer, 3);
claytonk 3:6b14862f5f51 323 green = 0;
claytonk 6:85d9ad912c14 324 //dot_I2C.write(LM36011_addr,lm_on,2,false);
claytonk 6:85d9ad912c14 325 break;
claytonk 6:85d9ad912c14 326 }
claytonk 3:6b14862f5f51 327
claytonk 6:85d9ad912c14 328 // clear buffer
claytonk 6:85d9ad912c14 329 for (int k = 0;
claytonk 6:85d9ad912c14 330 k < 3;
claytonk 6:85d9ad912c14 331 k++) rcv_buffer[i]=0;
claytonk 6:85d9ad912c14 332 */
claytonk 6:85d9ad912c14 333 green = !stacked;
claytonk 6:85d9ad912c14 334 red = stacked;
claytonk 3:6b14862f5f51 335
claytonk 0:605fe136b7ea 336 }
claytonk 0:605fe136b7ea 337 }
claytonk 0:605fe136b7ea 338