Liangzhen Lai / Mbed 2 deprecated DDRO_software_slave

Dependencies:   mbed

Committer:
liangzhen
Date:
Wed Oct 03 21:03:54 2012 +0000
Revision:
3:7f4b42e1b3e2
Parent:
2:152e0a3ec192
modified leakage integration time limit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
liangzhen 0:2a52ec2fb0e0 1 //slave
liangzhen 0:2a52ec2fb0e0 2 //note: main() function is at the bottom
liangzhen 0:2a52ec2fb0e0 3 #include <mbed.h>
liangzhen 0:2a52ec2fb0e0 4 #include <sstream>
liangzhen 0:2a52ec2fb0e0 5 using namespace std;
liangzhen 0:2a52ec2fb0e0 6
liangzhen 0:2a52ec2fb0e0 7 I2CSlave slave(p9, p10);
liangzhen 0:2a52ec2fb0e0 8 DigitalOut led1(LED1);
liangzhen 0:2a52ec2fb0e0 9 DigitalOut led2(LED2);
liangzhen 0:2a52ec2fb0e0 10 DigitalOut led3(LED3);
liangzhen 0:2a52ec2fb0e0 11 DigitalOut led4(LED4);
liangzhen 0:2a52ec2fb0e0 12 Serial pc(USBTX, USBRX);
liangzhen 0:2a52ec2fb0e0 13
liangzhen 0:2a52ec2fb0e0 14 Ticker CLK;
liangzhen 0:2a52ec2fb0e0 15
liangzhen 0:2a52ec2fb0e0 16 DigitalOut leakage_enable(p15);
liangzhen 0:2a52ec2fb0e0 17 AnalogIn leakage1(p17);
liangzhen 0:2a52ec2fb0e0 18 AnalogIn leakage2(p18);
liangzhen 0:2a52ec2fb0e0 19
liangzhen 0:2a52ec2fb0e0 20 DigitalOut ref_clk(p5);
liangzhen 0:2a52ec2fb0e0 21 DigitalOut count(p6);
liangzhen 0:2a52ec2fb0e0 22 DigitalOut read(p7);
liangzhen 0:2a52ec2fb0e0 23 DigitalOut enable(p8);
liangzhen 0:2a52ec2fb0e0 24 DigitalOut S0(p11);
liangzhen 0:2a52ec2fb0e0 25 DigitalOut S1(p12);
liangzhen 0:2a52ec2fb0e0 26 DigitalOut S2(p13);
liangzhen 0:2a52ec2fb0e0 27 DigitalOut S3(p14);
liangzhen 0:2a52ec2fb0e0 28 DigitalOut S4(p22);
liangzhen 0:2a52ec2fb0e0 29 DigitalOut S5(p21);
liangzhen 0:2a52ec2fb0e0 30 DigitalOut OS(p16);
liangzhen 0:2a52ec2fb0e0 31 DigitalIn O0(p23);
liangzhen 0:2a52ec2fb0e0 32 DigitalIn O1(p24);
liangzhen 0:2a52ec2fb0e0 33 DigitalIn O2(p25);
liangzhen 0:2a52ec2fb0e0 34 DigitalIn O3(p29);
liangzhen 0:2a52ec2fb0e0 35 DigitalIn O4(p28);
liangzhen 0:2a52ec2fb0e0 36 DigitalIn O5(p27);
liangzhen 0:2a52ec2fb0e0 37 DigitalIn O6(p26);
liangzhen 0:2a52ec2fb0e0 38 DigitalIn O7(p30);
liangzhen 0:2a52ec2fb0e0 39 AnalogIn core(p19);
liangzhen 0:2a52ec2fb0e0 40 AnalogIn sram(p20);
liangzhen 0:2a52ec2fb0e0 41
liangzhen 0:2a52ec2fb0e0 42 char buf[50] = {};
liangzhen 0:2a52ec2fb0e0 43 char msg[] = "Slave!";
liangzhen 0:2a52ec2fb0e0 44 const int SLAVEADDR = 0x88; // define the I2C Slave Address (mbed 2)
liangzhen 0:2a52ec2fb0e0 45
liangzhen 0:2a52ec2fb0e0 46 void clk_gen()
liangzhen 0:2a52ec2fb0e0 47 {
liangzhen 0:2a52ec2fb0e0 48 ref_clk = !ref_clk;
liangzhen 0:2a52ec2fb0e0 49 }
liangzhen 0:2a52ec2fb0e0 50
liangzhen 0:2a52ec2fb0e0 51 void assign_s(int selection)
liangzhen 0:2a52ec2fb0e0 52 {
liangzhen 0:2a52ec2fb0e0 53 int remainder = selection;
liangzhen 0:2a52ec2fb0e0 54 S0 = selection % 2;
liangzhen 0:2a52ec2fb0e0 55 selection = selection / 2;
liangzhen 0:2a52ec2fb0e0 56 S1 = selection % 2;
liangzhen 0:2a52ec2fb0e0 57 selection = selection / 2;
liangzhen 0:2a52ec2fb0e0 58 S2 = selection % 2;
liangzhen 0:2a52ec2fb0e0 59 selection = selection / 2;
liangzhen 0:2a52ec2fb0e0 60 S3 = selection % 2;
liangzhen 0:2a52ec2fb0e0 61 selection = selection / 2;
liangzhen 0:2a52ec2fb0e0 62 S4 = selection % 2;
liangzhen 0:2a52ec2fb0e0 63 selection = selection / 2;
liangzhen 0:2a52ec2fb0e0 64 S5 = selection % 2;
liangzhen 0:2a52ec2fb0e0 65 }
liangzhen 0:2a52ec2fb0e0 66
liangzhen 0:2a52ec2fb0e0 67 unsigned int read_out()
liangzhen 0:2a52ec2fb0e0 68 {
liangzhen 0:2a52ec2fb0e0 69 unsigned int out;
liangzhen 0:2a52ec2fb0e0 70 out = 0;
liangzhen 0:2a52ec2fb0e0 71 OS = 1;
liangzhen 0:2a52ec2fb0e0 72 wait(0.001);
liangzhen 0:2a52ec2fb0e0 73 out += O7.read();
liangzhen 0:2a52ec2fb0e0 74 out *= 2;
liangzhen 0:2a52ec2fb0e0 75 out += O6.read();
liangzhen 0:2a52ec2fb0e0 76 out *= 2;
liangzhen 0:2a52ec2fb0e0 77 out += O5.read();
liangzhen 0:2a52ec2fb0e0 78 out *= 2;
liangzhen 0:2a52ec2fb0e0 79 out += O4.read();
liangzhen 0:2a52ec2fb0e0 80 out *= 2;
liangzhen 0:2a52ec2fb0e0 81 out += O3.read();
liangzhen 0:2a52ec2fb0e0 82 out *= 2;
liangzhen 0:2a52ec2fb0e0 83 out += O2.read();
liangzhen 0:2a52ec2fb0e0 84 out *= 2;
liangzhen 0:2a52ec2fb0e0 85 out += O1.read();
liangzhen 0:2a52ec2fb0e0 86 out *= 2;
liangzhen 0:2a52ec2fb0e0 87 out += O0.read();
liangzhen 0:2a52ec2fb0e0 88 out *= 2;
liangzhen 0:2a52ec2fb0e0 89 OS = 0;
liangzhen 0:2a52ec2fb0e0 90 wait(0.001);
liangzhen 0:2a52ec2fb0e0 91 out += O7.read();
liangzhen 0:2a52ec2fb0e0 92 out *= 2;
liangzhen 0:2a52ec2fb0e0 93 out += O6.read();
liangzhen 0:2a52ec2fb0e0 94 out *= 2;
liangzhen 0:2a52ec2fb0e0 95 out += O5.read();
liangzhen 0:2a52ec2fb0e0 96 out *= 2;
liangzhen 0:2a52ec2fb0e0 97 out += O4.read();
liangzhen 0:2a52ec2fb0e0 98 out *= 2;
liangzhen 0:2a52ec2fb0e0 99 out += O3.read();
liangzhen 0:2a52ec2fb0e0 100 out *= 2;
liangzhen 0:2a52ec2fb0e0 101 out += O2.read();
liangzhen 0:2a52ec2fb0e0 102 out *= 2;
liangzhen 0:2a52ec2fb0e0 103 out += O1.read();
liangzhen 0:2a52ec2fb0e0 104 out *= 2;
liangzhen 0:2a52ec2fb0e0 105 out += O0.read();
liangzhen 0:2a52ec2fb0e0 106 return out;
liangzhen 0:2a52ec2fb0e0 107 }
liangzhen 0:2a52ec2fb0e0 108
liangzhen 0:2a52ec2fb0e0 109 void scan_slave(char* ro_data)
liangzhen 0:2a52ec2fb0e0 110 {
liangzhen 0:2a52ec2fb0e0 111 pc.printf("Testing Starts here\n");
liangzhen 0:2a52ec2fb0e0 112 O0.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 113 O1.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 114 O2.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 115 O3.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 116 O4.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 117 O5.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 118 O6.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 119 O7.mode(PullUp);
liangzhen 0:2a52ec2fb0e0 120
liangzhen 0:2a52ec2fb0e0 121 count = 0;
liangzhen 0:2a52ec2fb0e0 122 read = 0;
liangzhen 0:2a52ec2fb0e0 123 enable = 0;
liangzhen 0:2a52ec2fb0e0 124 int i;
liangzhen 0:2a52ec2fb0e0 125
liangzhen 0:2a52ec2fb0e0 126 for (i=0; i<64; i++) {
liangzhen 0:2a52ec2fb0e0 127 //measure using 0.01
liangzhen 0:2a52ec2fb0e0 128 CLK.detach();
liangzhen 0:2a52ec2fb0e0 129 CLK.attach(&clk_gen, 0.01);
liangzhen 0:2a52ec2fb0e0 130 int select = i;
liangzhen 0:2a52ec2fb0e0 131 enable = 0;
liangzhen 0:2a52ec2fb0e0 132 count = 0;
liangzhen 0:2a52ec2fb0e0 133 read = 0;
liangzhen 0:2a52ec2fb0e0 134 assign_s(select);
liangzhen 0:2a52ec2fb0e0 135 wait_us(100);
liangzhen 0:2a52ec2fb0e0 136 enable = 1;
liangzhen 0:2a52ec2fb0e0 137 wait_us(100);
liangzhen 0:2a52ec2fb0e0 138 count = 1;
liangzhen 0:2a52ec2fb0e0 139 wait_us(100);
liangzhen 0:2a52ec2fb0e0 140 count = 0;
liangzhen 0:2a52ec2fb0e0 141 wait(0.2);
liangzhen 0:2a52ec2fb0e0 142 read = 0;
liangzhen 0:2a52ec2fb0e0 143 wait_us(100);
liangzhen 0:2a52ec2fb0e0 144 read = 1;
liangzhen 0:2a52ec2fb0e0 145 wait_us(100);
liangzhen 0:2a52ec2fb0e0 146 read = 0;
liangzhen 0:2a52ec2fb0e0 147 enable = 0;
liangzhen 0:2a52ec2fb0e0 148 unsigned int out;
liangzhen 0:2a52ec2fb0e0 149 out = read_out();
liangzhen 0:2a52ec2fb0e0 150 ro_data[5*i] = (char)(out%10+48);
liangzhen 0:2a52ec2fb0e0 151 out = out / 10;
liangzhen 0:2a52ec2fb0e0 152 ro_data[5*i+1] = (char)(out%10+48);
liangzhen 0:2a52ec2fb0e0 153 out = out / 10;
liangzhen 0:2a52ec2fb0e0 154 ro_data[5*i+2] = (char)(out%10+48);
liangzhen 0:2a52ec2fb0e0 155 out = out / 10;
liangzhen 0:2a52ec2fb0e0 156 ro_data[5*i+3] = (char)(out%10+48);
liangzhen 0:2a52ec2fb0e0 157 out = out / 10;
liangzhen 0:2a52ec2fb0e0 158 ro_data[5*i+4] = (char)(out%10+48);
liangzhen 0:2a52ec2fb0e0 159 CLK.detach();
liangzhen 0:2a52ec2fb0e0 160 }
liangzhen 0:2a52ec2fb0e0 161 }
liangzhen 0:2a52ec2fb0e0 162
liangzhen 0:2a52ec2fb0e0 163 void read_power(char* ro_data)
liangzhen 0:2a52ec2fb0e0 164 {
liangzhen 0:2a52ec2fb0e0 165 unsigned short core_reading = core.read_u16();
liangzhen 0:2a52ec2fb0e0 166 unsigned short sram_reading = sram.read_u16();
liangzhen 0:2a52ec2fb0e0 167 ro_data[64*5] = (core_reading%0x100);
liangzhen 0:2a52ec2fb0e0 168 ro_data[64*5+1] = (core_reading/0x100);
liangzhen 0:2a52ec2fb0e0 169 ro_data[64*5+2] = (sram_reading%0x100);
liangzhen 0:2a52ec2fb0e0 170 ro_data[64*5+3] = (sram_reading/0x100);
liangzhen 0:2a52ec2fb0e0 171 }
liangzhen 0:2a52ec2fb0e0 172
liangzhen 0:2a52ec2fb0e0 173 void read_leakage(char* ro_data)
liangzhen 0:2a52ec2fb0e0 174 {
liangzhen 2:152e0a3ec192 175 double reading1;
liangzhen 0:2a52ec2fb0e0 176 CLK.detach();
liangzhen 0:2a52ec2fb0e0 177 leakage_enable = 1;
liangzhen 1:90a2068dd130 178
liangzhen 0:2a52ec2fb0e0 179 S4 = 0;
liangzhen 0:2a52ec2fb0e0 180 S5 = 0;
liangzhen 0:2a52ec2fb0e0 181 ref_clk=0;
liangzhen 2:152e0a3ec192 182 wait(0.01);
liangzhen 1:90a2068dd130 183
liangzhen 2:152e0a3ec192 184 int i0;
liangzhen 2:152e0a3ec192 185 i0=0;
liangzhen 2:152e0a3ec192 186 ref_clk = 1;
liangzhen 0:2a52ec2fb0e0 187 S5 = 1;
liangzhen 2:152e0a3ec192 188 do {
liangzhen 2:152e0a3ec192 189 i0++;
liangzhen 3:7f4b42e1b3e2 190 if(i0>10000) {
liangzhen 2:152e0a3ec192 191 break;
liangzhen 2:152e0a3ec192 192 }
liangzhen 2:152e0a3ec192 193 wait(0.001);
liangzhen 2:152e0a3ec192 194 reading1 = leakage1.read();
liangzhen 2:152e0a3ec192 195 reading1 *= 3.3;
liangzhen 2:152e0a3ec192 196 } while (reading1 >0.01);
liangzhen 2:152e0a3ec192 197 ref_clk = 0;
liangzhen 2:152e0a3ec192 198 S5 = 0;
liangzhen 2:152e0a3ec192 199 wait(0.01);
liangzhen 1:90a2068dd130 200
liangzhen 2:152e0a3ec192 201 ro_data[64*5+4] = (i0%0x100);
liangzhen 2:152e0a3ec192 202 ro_data[64*5+5] = (i0/0x100);
liangzhen 1:90a2068dd130 203
liangzhen 0:2a52ec2fb0e0 204 S4 = 1;
liangzhen 2:152e0a3ec192 205 wait(0.01);
liangzhen 2:152e0a3ec192 206 i0=0;
liangzhen 2:152e0a3ec192 207 ref_clk = 1;
liangzhen 2:152e0a3ec192 208 S5 = 1;
liangzhen 2:152e0a3ec192 209 do {
liangzhen 2:152e0a3ec192 210 i0++;
liangzhen 3:7f4b42e1b3e2 211 if(i0>10000) {
liangzhen 2:152e0a3ec192 212 break;
liangzhen 2:152e0a3ec192 213 }
liangzhen 2:152e0a3ec192 214 wait(0.001);
liangzhen 2:152e0a3ec192 215 reading1 = leakage2.read();
liangzhen 2:152e0a3ec192 216 reading1 *= 3.3;
liangzhen 2:152e0a3ec192 217 } while (reading1 <3.29);
liangzhen 2:152e0a3ec192 218 ref_clk = 0;
liangzhen 0:2a52ec2fb0e0 219 S5 = 0;
liangzhen 1:90a2068dd130 220 wait(0.1);
liangzhen 2:152e0a3ec192 221 ro_data[64*5+6] = (i0%0x100);
liangzhen 2:152e0a3ec192 222 ro_data[64*5+7] = (i0/0x100);
liangzhen 2:152e0a3ec192 223
liangzhen 0:2a52ec2fb0e0 224 leakage_enable = 0;
liangzhen 0:2a52ec2fb0e0 225 }
liangzhen 0:2a52ec2fb0e0 226
liangzhen 0:2a52ec2fb0e0 227 void scan_test()
liangzhen 0:2a52ec2fb0e0 228 {
liangzhen 0:2a52ec2fb0e0 229 slave.address(SLAVEADDR);
liangzhen 0:2a52ec2fb0e0 230 char* ro_data;
liangzhen 2:152e0a3ec192 231 ro_data = new char[64*5+8];
liangzhen 0:2a52ec2fb0e0 232 bool if_ready = false;
liangzhen 0:2a52ec2fb0e0 233 while (1) {
liangzhen 0:2a52ec2fb0e0 234 int i = slave.receive();
liangzhen 0:2a52ec2fb0e0 235 //pc.printf("receive = %i\r\n", i);
liangzhen 0:2a52ec2fb0e0 236 switch (i) {
liangzhen 0:2a52ec2fb0e0 237 case I2CSlave::ReadAddressed:
liangzhen 0:2a52ec2fb0e0 238 if (!if_ready) {
liangzhen 0:2a52ec2fb0e0 239 pc.printf("Slave is not ready...\n");
liangzhen 0:2a52ec2fb0e0 240 break;
liangzhen 0:2a52ec2fb0e0 241 }
liangzhen 2:152e0a3ec192 242 slave.write(ro_data, 64*5+8);
liangzhen 0:2a52ec2fb0e0 243 pc.printf("Slave is writing..\n");
liangzhen 0:2a52ec2fb0e0 244 break;
liangzhen 0:2a52ec2fb0e0 245 case I2CSlave::WriteGeneral:
liangzhen 0:2a52ec2fb0e0 246 led2 = !led2;
liangzhen 0:2a52ec2fb0e0 247 break;
liangzhen 0:2a52ec2fb0e0 248 case I2CSlave::WriteAddressed:
liangzhen 0:2a52ec2fb0e0 249 slave.read(buf, 4);
liangzhen 0:2a52ec2fb0e0 250 pc.printf("Slave gets: %s\n", buf);
liangzhen 0:2a52ec2fb0e0 251 led3 = !led3;
liangzhen 0:2a52ec2fb0e0 252 char cmd1[] = "scan";
liangzhen 0:2a52ec2fb0e0 253 char cmd2[] = "getp";
liangzhen 0:2a52ec2fb0e0 254 char cmd3[] = "getl";
liangzhen 0:2a52ec2fb0e0 255 if (!strcmp(cmd1, buf)) {
liangzhen 0:2a52ec2fb0e0 256 pc.printf("Scanning....\n");
liangzhen 0:2a52ec2fb0e0 257 scan_slave(ro_data);
liangzhen 0:2a52ec2fb0e0 258 read_power(ro_data);
liangzhen 0:2a52ec2fb0e0 259 read_leakage(ro_data);
liangzhen 0:2a52ec2fb0e0 260 if_ready = true;
liangzhen 0:2a52ec2fb0e0 261 } else if (!strcmp(cmd2, buf)) {
liangzhen 0:2a52ec2fb0e0 262 pc.printf("Measuring power....\n");
liangzhen 0:2a52ec2fb0e0 263 read_power(ro_data);
liangzhen 0:2a52ec2fb0e0 264 } else if (!strcmp(cmd3, buf)) {
liangzhen 0:2a52ec2fb0e0 265 pc.printf("Measuring leakage.....\n");
liangzhen 0:2a52ec2fb0e0 266 read_leakage(ro_data);
liangzhen 0:2a52ec2fb0e0 267 }
liangzhen 0:2a52ec2fb0e0 268 break;
liangzhen 0:2a52ec2fb0e0 269 }
liangzhen 0:2a52ec2fb0e0 270 for (int i = 0; i < 50; i++) buf[i] = 0; // Clear buffer
liangzhen 0:2a52ec2fb0e0 271 wait(0.002);
liangzhen 0:2a52ec2fb0e0 272 }
liangzhen 0:2a52ec2fb0e0 273 }
liangzhen 0:2a52ec2fb0e0 274
liangzhen 0:2a52ec2fb0e0 275
liangzhen 0:2a52ec2fb0e0 276 //// MAIN FUNCTION
liangzhen 0:2a52ec2fb0e0 277 int main ()
liangzhen 0:2a52ec2fb0e0 278 {
liangzhen 0:2a52ec2fb0e0 279 //scan_slave(); //main() function from the original DDRO_scan code
liangzhen 0:2a52ec2fb0e0 280 pc.printf("SlaveMBED starts...\n");
liangzhen 0:2a52ec2fb0e0 281 scan_test();
liangzhen 0:2a52ec2fb0e0 282
liangzhen 0:2a52ec2fb0e0 283 return 0;
liangzhen 0:2a52ec2fb0e0 284 }