A B
/
6243_ASIC
6243_ASIC PCB code as of 02092016
main.cpp@0:dfbf890fb03a, 2016-09-02 (annotated)
- Committer:
- adambalkan
- Date:
- Fri Sep 02 06:56:13 2016 +0000
- Revision:
- 0:dfbf890fb03a
6243 ASIC PCB code, as of 02092016
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
adambalkan | 0:dfbf890fb03a | 1 | #include "mbed.h" |
adambalkan | 0:dfbf890fb03a | 2 | #include "USBSerial.h" |
adambalkan | 0:dfbf890fb03a | 3 | |
adambalkan | 0:dfbf890fb03a | 4 | USBSerial pc; |
adambalkan | 0:dfbf890fb03a | 5 | |
adambalkan | 0:dfbf890fb03a | 6 | DigitalOut ASIC_CS(P0_2); |
adambalkan | 0:dfbf890fb03a | 7 | DigitalOut DAC_CS(P1_26); |
adambalkan | 0:dfbf890fb03a | 8 | DigitalOut DAC_LDAC(P1_14); |
adambalkan | 0:dfbf890fb03a | 9 | DigitalOut DAC_SHDN(P1_15); |
adambalkan | 0:dfbf890fb03a | 10 | DigitalInOut PD_CHA(P0_21); |
adambalkan | 0:dfbf890fb03a | 11 | |
adambalkan | 0:dfbf890fb03a | 12 | |
adambalkan | 0:dfbf890fb03a | 13 | AnalogIn DAC_OUT_A(P0_11); |
adambalkan | 0:dfbf890fb03a | 14 | AnalogIn DAC_OUT_B(P0_12); |
adambalkan | 0:dfbf890fb03a | 15 | AnalogIn OUT_N(P0_13); |
adambalkan | 0:dfbf890fb03a | 16 | AnalogIn OUT_P(P0_14); |
adambalkan | 0:dfbf890fb03a | 17 | AnalogIn BG_BUF(P0_15); |
adambalkan | 0:dfbf890fb03a | 18 | AnalogIn PHOTO_DIODE(P0_22); |
adambalkan | 0:dfbf890fb03a | 19 | |
adambalkan | 0:dfbf890fb03a | 20 | PwmOut SWITCH(P1_24); // shorts the op-amp feedback network when high 24 |
adambalkan | 0:dfbf890fb03a | 21 | //PwmOut EXTCLK(P1_25); // can be used to apply an external clock to the ASIC if needed (need to solder to P0_20 (if actually required) due to mistake) |
adambalkan | 0:dfbf890fb03a | 22 | |
adambalkan | 0:dfbf890fb03a | 23 | SPI ASIC(P0_9, P0_8, P1_29);//MOSI, MISO, SCLK |
adambalkan | 0:dfbf890fb03a | 24 | SPI DAC(P1_22, P1_21, P1_20);// MOSI, MISO, SCLK |
adambalkan | 0:dfbf890fb03a | 25 | |
adambalkan | 0:dfbf890fb03a | 26 | int ASIC_SPI_REGISTER; |
adambalkan | 0:dfbf890fb03a | 27 | char command, p1, p2, p3, p4; |
adambalkan | 0:dfbf890fb03a | 28 | void variable_defaults() |
adambalkan | 0:dfbf890fb03a | 29 | { |
adambalkan | 0:dfbf890fb03a | 30 | ASIC_SPI_REGISTER = (0x0000); |
adambalkan | 0:dfbf890fb03a | 31 | ASIC_CS=1; |
adambalkan | 0:dfbf890fb03a | 32 | DAC_CS=1; |
adambalkan | 0:dfbf890fb03a | 33 | DAC_LDAC=0; |
adambalkan | 0:dfbf890fb03a | 34 | DAC_SHDN=0; //Disable DAC |
adambalkan | 0:dfbf890fb03a | 35 | PD_CHA.input(); |
adambalkan | 0:dfbf890fb03a | 36 | PD_CHA.mode(PullNone); |
adambalkan | 0:dfbf890fb03a | 37 | } |
adambalkan | 0:dfbf890fb03a | 38 | |
adambalkan | 0:dfbf890fb03a | 39 | void connect_PD_CHA(int value)//connect power down and drive to value |
adambalkan | 0:dfbf890fb03a | 40 | { |
adambalkan | 0:dfbf890fb03a | 41 | PD_CHA.output(); |
adambalkan | 0:dfbf890fb03a | 42 | PD_CHA = value; |
adambalkan | 0:dfbf890fb03a | 43 | } |
adambalkan | 0:dfbf890fb03a | 44 | |
adambalkan | 0:dfbf890fb03a | 45 | void disable_DAC() |
adambalkan | 0:dfbf890fb03a | 46 | { |
adambalkan | 0:dfbf890fb03a | 47 | DAC_SHDN=0; |
adambalkan | 0:dfbf890fb03a | 48 | } |
adambalkan | 0:dfbf890fb03a | 49 | |
adambalkan | 0:dfbf890fb03a | 50 | void disconnect_PD_CHA() |
adambalkan | 0:dfbf890fb03a | 51 | { |
adambalkan | 0:dfbf890fb03a | 52 | PD_CHA.input(); |
adambalkan | 0:dfbf890fb03a | 53 | PD_CHA.mode(PullNone); |
adambalkan | 0:dfbf890fb03a | 54 | } |
adambalkan | 0:dfbf890fb03a | 55 | |
adambalkan | 0:dfbf890fb03a | 56 | int Set_DAC_A(int desired_value_A) // sets the value of MCP4922 DAC channel A |
adambalkan | 0:dfbf890fb03a | 57 | { |
adambalkan | 0:dfbf890fb03a | 58 | // int desired_value_A = (voutA/3.3)*4096; |
adambalkan | 0:dfbf890fb03a | 59 | DAC_SHDN=1; //Enable DAC |
adambalkan | 0:dfbf890fb03a | 60 | char command_register_msb = (0x70);// 01110000 for DAC A, BUF, Gain =1 and no shutdown |
adambalkan | 0:dfbf890fb03a | 61 | command_register_msb = ((command_register_msb)|desired_value_A>>8); // assign first 4 bits to first byte to send |
adambalkan | 0:dfbf890fb03a | 62 | char command_register_lsb = desired_value_A; // assign last 8 bits to second byte to send |
adambalkan | 0:dfbf890fb03a | 63 | DAC_CS =0; // bring CS low |
adambalkan | 0:dfbf890fb03a | 64 | int junk= DAC.write(command_register_msb); // write first byte |
adambalkan | 0:dfbf890fb03a | 65 | junk= DAC.write(command_register_lsb); // write second byte |
adambalkan | 0:dfbf890fb03a | 66 | DAC_CS=1; // De-select device |
adambalkan | 0:dfbf890fb03a | 67 | return 1; |
adambalkan | 0:dfbf890fb03a | 68 | } |
adambalkan | 0:dfbf890fb03a | 69 | |
adambalkan | 0:dfbf890fb03a | 70 | int Set_DAC_B(int desired_value_B) // sets the value of MCP4922 DAC channel B |
adambalkan | 0:dfbf890fb03a | 71 | { |
adambalkan | 0:dfbf890fb03a | 72 | // int desired_value_B = (voutB/3.3)*4096; |
adambalkan | 0:dfbf890fb03a | 73 | DAC_SHDN=1; //Enable DAC |
adambalkan | 0:dfbf890fb03a | 74 | char command_register_msb = (0xF0);// 11110000 for DAC B, BUF, Gain =1 and no shutdown |
adambalkan | 0:dfbf890fb03a | 75 | command_register_msb = ((command_register_msb)|desired_value_B>>8); // assign first 4 bits to first byte to send |
adambalkan | 0:dfbf890fb03a | 76 | char command_register_lsb = desired_value_B; // assign last 8 bits to second byte to send |
adambalkan | 0:dfbf890fb03a | 77 | DAC_CS =0; // bring CS low |
adambalkan | 0:dfbf890fb03a | 78 | int junk= DAC.write(command_register_msb); // write first byte |
adambalkan | 0:dfbf890fb03a | 79 | junk= DAC.write(command_register_lsb); // write second byte |
adambalkan | 0:dfbf890fb03a | 80 | DAC_CS=1; // De-select device |
adambalkan | 0:dfbf890fb03a | 81 | return 1; |
adambalkan | 0:dfbf890fb03a | 82 | } |
adambalkan | 0:dfbf890fb03a | 83 | |
adambalkan | 0:dfbf890fb03a | 84 | void Send_ASIC_SPI(char to_send) |
adambalkan | 0:dfbf890fb03a | 85 | { |
adambalkan | 0:dfbf890fb03a | 86 | ASIC_CS=0; |
adambalkan | 0:dfbf890fb03a | 87 | int junk = ASIC.write(to_send); |
adambalkan | 0:dfbf890fb03a | 88 | ASIC_CS=1; |
adambalkan | 0:dfbf890fb03a | 89 | } |
adambalkan | 0:dfbf890fb03a | 90 | |
adambalkan | 0:dfbf890fb03a | 91 | void ExternalClock(float duty_cycle, int period_us) |
adambalkan | 0:dfbf890fb03a | 92 | { |
adambalkan | 0:dfbf890fb03a | 93 | //EXTCLK.write(duty_cycle); |
adambalkan | 0:dfbf890fb03a | 94 | // EXTCLK.period_us(period_us); |
adambalkan | 0:dfbf890fb03a | 95 | } |
adambalkan | 0:dfbf890fb03a | 96 | |
adambalkan | 0:dfbf890fb03a | 97 | void SWITCH_SET(float duty_cycle, int period_us) |
adambalkan | 0:dfbf890fb03a | 98 | { |
adambalkan | 0:dfbf890fb03a | 99 | SWITCH.write(duty_cycle); |
adambalkan | 0:dfbf890fb03a | 100 | SWITCH.period_us(period_us); |
adambalkan | 0:dfbf890fb03a | 101 | } |
adambalkan | 0:dfbf890fb03a | 102 | |
adambalkan | 0:dfbf890fb03a | 103 | int main() { |
adambalkan | 0:dfbf890fb03a | 104 | variable_defaults(); |
adambalkan | 0:dfbf890fb03a | 105 | Set_DAC_A(0); |
adambalkan | 0:dfbf890fb03a | 106 | Set_DAC_B(0); |
adambalkan | 0:dfbf890fb03a | 107 | ExternalClock(0.0, 1000); |
adambalkan | 0:dfbf890fb03a | 108 | SWITCH_SET(10,255); |
adambalkan | 0:dfbf890fb03a | 109 | ASIC.format(8, 1);// the ASIC should operate in SPI mode 1 |
adambalkan | 0:dfbf890fb03a | 110 | // PHOTODIODE.mode(PullNone); |
adambalkan | 0:dfbf890fb03a | 111 | while(1) { |
adambalkan | 0:dfbf890fb03a | 112 | if (pc.readable()){ |
adambalkan | 0:dfbf890fb03a | 113 | command = pc.getc(); // Data from PC (command) |
adambalkan | 0:dfbf890fb03a | 114 | p1 = pc.getc(); // Data from PC (param p1) |
adambalkan | 0:dfbf890fb03a | 115 | p2 = pc.getc(); // Data from PC (param p2) |
adambalkan | 0:dfbf890fb03a | 116 | p3 = pc.getc(); // Data from PC (param p2) |
adambalkan | 0:dfbf890fb03a | 117 | p4 = pc.getc(); // Data from PC (param p2) |
adambalkan | 0:dfbf890fb03a | 118 | int scrap = pc.getc(); // Carriage Return |
adambalkan | 0:dfbf890fb03a | 119 | |
adambalkan | 0:dfbf890fb03a | 120 | if (command=='A') // update ASIC SPI REGISTER |
adambalkan | 0:dfbf890fb03a | 121 | { |
adambalkan | 0:dfbf890fb03a | 122 | ASIC_SPI_REGISTER=0x0000; //clear register |
adambalkan | 0:dfbf890fb03a | 123 | ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p2<<16; |
adambalkan | 0:dfbf890fb03a | 124 | ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p3<<8; |
adambalkan | 0:dfbf890fb03a | 125 | ASIC_SPI_REGISTER = ASIC_SPI_REGISTER|p4; |
adambalkan | 0:dfbf890fb03a | 126 | Send_ASIC_SPI((p2)); |
adambalkan | 0:dfbf890fb03a | 127 | Send_ASIC_SPI((p3)); |
adambalkan | 0:dfbf890fb03a | 128 | Send_ASIC_SPI((p4)); |
adambalkan | 0:dfbf890fb03a | 129 | // pc.printf("%d\n",ASIC_SPI_REGISTER); |
adambalkan | 0:dfbf890fb03a | 130 | // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER>>16)); |
adambalkan | 0:dfbf890fb03a | 131 | // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER>>8)); |
adambalkan | 0:dfbf890fb03a | 132 | // pc.printf("%d\n",0xff&(ASIC_SPI_REGISTER)); |
adambalkan | 0:dfbf890fb03a | 133 | } |
adambalkan | 0:dfbf890fb03a | 134 | else if (command=='a') // set vouta of DAC |
adambalkan | 0:dfbf890fb03a | 135 | { |
adambalkan | 0:dfbf890fb03a | 136 | int desired_value = ((0x0f)&p3)<<8; |
adambalkan | 0:dfbf890fb03a | 137 | desired_value = desired_value|p4; |
adambalkan | 0:dfbf890fb03a | 138 | Set_DAC_A(desired_value); |
adambalkan | 0:dfbf890fb03a | 139 | // pc.printf("%d\n",desired_value); |
adambalkan | 0:dfbf890fb03a | 140 | } |
adambalkan | 0:dfbf890fb03a | 141 | else if (command=='b') // set voutb of DAC |
adambalkan | 0:dfbf890fb03a | 142 | { |
adambalkan | 0:dfbf890fb03a | 143 | int desired_value = ((0x0f)&p3)<<8; |
adambalkan | 0:dfbf890fb03a | 144 | desired_value = desired_value|p4; |
adambalkan | 0:dfbf890fb03a | 145 | Set_DAC_B(desired_value); |
adambalkan | 0:dfbf890fb03a | 146 | } |
adambalkan | 0:dfbf890fb03a | 147 | else if(command=='C')// read all analog inputs |
adambalkan | 0:dfbf890fb03a | 148 | { |
adambalkan | 0:dfbf890fb03a | 149 | pc.printf("%f,%f,%f,%f,%f,%f\n", DAC_OUT_A.read(), DAC_OUT_B.read(), OUT_N.read(), OUT_P.read(), BG_BUF.read(), PHOTO_DIODE.read()); |
adambalkan | 0:dfbf890fb03a | 150 | } |
adambalkan | 0:dfbf890fb03a | 151 | else if(command=='K')// set external clock |
adambalkan | 0:dfbf890fb03a | 152 | { |
adambalkan | 0:dfbf890fb03a | 153 | // float duty_cycle = (float)p3/ (float)256; // duty cycle |
adambalkan | 0:dfbf890fb03a | 154 | // int period_us = p4; //period in microseconds |
adambalkan | 0:dfbf890fb03a | 155 | // ExternalClock(duty_cycle, period_us); |
adambalkan | 0:dfbf890fb03a | 156 | // pc.printf("%f, %d, %d, %d, %d, %d\n", duty_cycle, period_us, p1, p2, p3, p4); |
adambalkan | 0:dfbf890fb03a | 157 | } |
adambalkan | 0:dfbf890fb03a | 158 | else if(command=='S')// set switching settings |
adambalkan | 0:dfbf890fb03a | 159 | { |
adambalkan | 0:dfbf890fb03a | 160 | float duty_cycle = (float)p3/ (float)256; // duty cycle |
adambalkan | 0:dfbf890fb03a | 161 | int period_us = p4; //period in microseconds |
adambalkan | 0:dfbf890fb03a | 162 | SWITCH_SET(duty_cycle, period_us); |
adambalkan | 0:dfbf890fb03a | 163 | // pc.printf("%f, %d\n", duty_cycle, period_us); |
adambalkan | 0:dfbf890fb03a | 164 | // pc.printf("%f, %d, %d, %d, %d, %d\n", duty_cycle, period_us, p1, p2, p3, p4); |
adambalkan | 0:dfbf890fb03a | 165 | } |
adambalkan | 0:dfbf890fb03a | 166 | else if(command=='P') |
adambalkan | 0:dfbf890fb03a | 167 | { |
adambalkan | 0:dfbf890fb03a | 168 | connect_PD_CHA(1); |
adambalkan | 0:dfbf890fb03a | 169 | } |
adambalkan | 0:dfbf890fb03a | 170 | else if(command=='p') |
adambalkan | 0:dfbf890fb03a | 171 | { |
adambalkan | 0:dfbf890fb03a | 172 | connect_PD_CHA(0); |
adambalkan | 0:dfbf890fb03a | 173 | } |
adambalkan | 0:dfbf890fb03a | 174 | else if(command=='O') |
adambalkan | 0:dfbf890fb03a | 175 | { |
adambalkan | 0:dfbf890fb03a | 176 | disconnect_PD_CHA(); |
adambalkan | 0:dfbf890fb03a | 177 | } |
adambalkan | 0:dfbf890fb03a | 178 | else if(command=='d') |
adambalkan | 0:dfbf890fb03a | 179 | { |
adambalkan | 0:dfbf890fb03a | 180 | disable_DAC(); |
adambalkan | 0:dfbf890fb03a | 181 | } |
adambalkan | 0:dfbf890fb03a | 182 | } |
adambalkan | 0:dfbf890fb03a | 183 | } |
adambalkan | 0:dfbf890fb03a | 184 | } |