Piyamate Wisanuvej / Mbed 2 deprecated NSE5310_programmer

Dependencies:   mbed

Committer:
piyamate
Date:
Tue May 13 13:54:32 2014 +0000
Revision:
4:1f708415c442
Parent:
3:1d0c09e43e22
working !

Who changed what in which revision?

UserRevisionLine numberNew contents of line
piyamate 2:af09cade52df 1 #include "OTP.h"
piyamate 3:1d0c09e43e22 2 #include <ctype.h>
piyamate 2:af09cade52df 3
piyamate 2:af09cade52df 4 OTP::OTP(PinName PDIO_pin, PinName CLK_pin, PinName CSn_pin, Serial &pc):
piyamate 2:af09cade52df 5 PDIO( DigitalInOut(PDIO_pin, PIN_INPUT, PullNone, 0) ),
piyamate 2:af09cade52df 6 CLK( DigitalInOut(CLK_pin, PIN_INPUT, PullNone, 0) ),
piyamate 2:af09cade52df 7 CSn( DigitalOut(CSn_pin, 0) ),
piyamate 2:af09cade52df 8 pc( pc )
piyamate 2:af09cade52df 9 {
piyamate 4:1f708415c442 10 clear_registers();
piyamate 2:af09cade52df 11 }
piyamate 2:af09cade52df 12
piyamate 2:af09cade52df 13 void OTP::setup()
piyamate 2:af09cade52df 14 {
piyamate 2:af09cade52df 15 PDIO = 1;
piyamate 2:af09cade52df 16 PDIO.output();
piyamate 2:af09cade52df 17 CLK = 0;
piyamate 2:af09cade52df 18 CLK.output();
piyamate 2:af09cade52df 19 CSn = 0;
piyamate 2:af09cade52df 20 wait_ms(1);
piyamate 2:af09cade52df 21 CSn = 1;
piyamate 2:af09cade52df 22 wait_us(30);
piyamate 2:af09cade52df 23 CSn = 0;
piyamate 2:af09cade52df 24 wait_us(30);
piyamate 2:af09cade52df 25 CLK = 1;
piyamate 2:af09cade52df 26 wait_us(30);
piyamate 2:af09cade52df 27 CLK = 0;
piyamate 2:af09cade52df 28 wait_us(30);
piyamate 2:af09cade52df 29 }
piyamate 2:af09cade52df 30
piyamate 2:af09cade52df 31 void OTP::read_bits(uint32_t *dest, int bit_length)
piyamate 2:af09cade52df 32 {
piyamate 2:af09cade52df 33 int idx = 0;
piyamate 2:af09cade52df 34
piyamate 2:af09cade52df 35 do
piyamate 2:af09cade52df 36 {
piyamate 2:af09cade52df 37 CLK = 1;
piyamate 2:af09cade52df 38 wait_us(30);
piyamate 2:af09cade52df 39 *dest |= PDIO<<idx;
piyamate 2:af09cade52df 40 CLK = 0;
piyamate 2:af09cade52df 41 wait_us(30);
piyamate 2:af09cade52df 42 idx++;
piyamate 2:af09cade52df 43 }while(idx < bit_length);
piyamate 2:af09cade52df 44 }
piyamate 2:af09cade52df 45
piyamate 2:af09cade52df 46 void OTP::exit()
piyamate 2:af09cade52df 47 {
piyamate 2:af09cade52df 48 CLK = 0;
piyamate 2:af09cade52df 49 CSn = 0;
piyamate 2:af09cade52df 50 PDIO = 1;
piyamate 2:af09cade52df 51 PDIO.output();
piyamate 2:af09cade52df 52 wait_us(30);
piyamate 2:af09cade52df 53 CLK = 1;
piyamate 2:af09cade52df 54 wait_us(30);
piyamate 2:af09cade52df 55 CLK = 0;
piyamate 2:af09cade52df 56 wait_us(30);
piyamate 2:af09cade52df 57 CLK = 1;
piyamate 2:af09cade52df 58 wait_us(30);
piyamate 2:af09cade52df 59 CSn = 1;
piyamate 2:af09cade52df 60 wait_us(30);
piyamate 2:af09cade52df 61 CLK.input();
piyamate 2:af09cade52df 62 }
piyamate 2:af09cade52df 63
piyamate 2:af09cade52df 64 void OTP::read()
piyamate 2:af09cade52df 65 {
piyamate 2:af09cade52df 66 PDIO = 0;
piyamate 2:af09cade52df 67 wait_us(30);
piyamate 2:af09cade52df 68 CLK = 1;
piyamate 2:af09cade52df 69 wait_us(30);
piyamate 2:af09cade52df 70 CSn = 1;
piyamate 2:af09cade52df 71 wait_us(30);
piyamate 2:af09cade52df 72 CLK = 0;
piyamate 2:af09cade52df 73 wait_us(30);
piyamate 2:af09cade52df 74
piyamate 2:af09cade52df 75 //generate two CLK pulses
piyamate 2:af09cade52df 76 for(int i=0; i<2; i++)
piyamate 2:af09cade52df 77 {
piyamate 2:af09cade52df 78 CLK = 1;
piyamate 2:af09cade52df 79 wait_us(30);
piyamate 2:af09cade52df 80 CLK = 0;
piyamate 2:af09cade52df 81 wait_us(15);
piyamate 2:af09cade52df 82
piyamate 2:af09cade52df 83 //switch PDIO to input on first faling edge of CLK
piyamate 2:af09cade52df 84 if(i==0)
piyamate 2:af09cade52df 85 PDIO.input();
piyamate 2:af09cade52df 86 wait_us(15);
piyamate 2:af09cade52df 87 }
piyamate 2:af09cade52df 88
piyamate 2:af09cade52df 89 //read all parameters
piyamate 2:af09cade52df 90 read_bits(&PWMhalfEN_IndexWidth, 1);
piyamate 2:af09cade52df 91 read_bits(&MagCompEN, 1);
piyamate 2:af09cade52df 92 read_bits(&pwmDIS, 1);
piyamate 2:af09cade52df 93 read_bits(&output_md0, 1);
piyamate 2:af09cade52df 94 read_bits(&output_md1, 1);
piyamate 2:af09cade52df 95 read_bits(&Z, 12);
piyamate 2:af09cade52df 96 read_bits(&CCW, 1);
piyamate 2:af09cade52df 97 read_bits(&I2C_A, 5);
piyamate 2:af09cade52df 98 read_bits(&factory_section, 29);
piyamate 2:af09cade52df 99
piyamate 2:af09cade52df 100 //mbit0,mbit1
piyamate 2:af09cade52df 101 {
piyamate 2:af09cade52df 102 wait_ms(1);
piyamate 2:af09cade52df 103 for(int i=0; i<3; i++)
piyamate 2:af09cade52df 104 {
piyamate 2:af09cade52df 105 CLK = 1;
piyamate 2:af09cade52df 106 wait_us(30);
piyamate 2:af09cade52df 107 CLK = 0;
piyamate 2:af09cade52df 108 wait_us(30);
piyamate 2:af09cade52df 109 }
piyamate 2:af09cade52df 110 }
piyamate 2:af09cade52df 111
piyamate 2:af09cade52df 112 CSn = 0;
piyamate 2:af09cade52df 113 wait_us(30);
piyamate 2:af09cade52df 114
piyamate 2:af09cade52df 115 pc.printf("PWMhalfEN_IndexWidth: %X\n", PWMhalfEN_IndexWidth);
piyamate 2:af09cade52df 116 pc.printf("MagCompEN: %X\n", MagCompEN);
piyamate 2:af09cade52df 117 pc.printf("pwmDIS: %X\n", pwmDIS);
piyamate 2:af09cade52df 118 pc.printf("output_md0: %X\n", output_md0);
piyamate 2:af09cade52df 119 pc.printf("output_md1: %X\n", output_md1);
piyamate 2:af09cade52df 120 pc.printf("Z: 0x%03X\n", Z);
piyamate 2:af09cade52df 121 pc.printf("CCW: %X\n", CCW);
piyamate 2:af09cade52df 122 pc.printf("I2C_A: 0x%02X (0x%02X)\n", I2C_A, (I2C_A<<2)+0x80);
piyamate 2:af09cade52df 123 pc.printf("factory_section: 0x%08X\n", factory_section);
piyamate 2:af09cade52df 124 }
piyamate 2:af09cade52df 125
piyamate 2:af09cade52df 126 uint8_t OTP::ID_to_I2C_A(uint8_t id)
piyamate 2:af09cade52df 127 {
piyamate 2:af09cade52df 128 return (id&0x7C) >> 2;
piyamate 2:af09cade52df 129 }
piyamate 2:af09cade52df 130
piyamate 2:af09cade52df 131 void OTP::write()
piyamate 2:af09cade52df 132 {
piyamate 2:af09cade52df 133 PDIO = 1;
piyamate 2:af09cade52df 134 CLK = 0;
piyamate 2:af09cade52df 135 wait_us(30);
piyamate 2:af09cade52df 136 CSn = 1;
piyamate 2:af09cade52df 137 wait_us(30);
piyamate 2:af09cade52df 138
piyamate 2:af09cade52df 139 //generate four CLK pulses
piyamate 2:af09cade52df 140 for(int i=0; i<4; i++)
piyamate 2:af09cade52df 141 {
piyamate 2:af09cade52df 142 CLK = 1;
piyamate 2:af09cade52df 143 wait_us(30);
piyamate 2:af09cade52df 144 CLK = 0;
piyamate 2:af09cade52df 145 wait_us(30);
piyamate 2:af09cade52df 146 }
piyamate 2:af09cade52df 147
piyamate 2:af09cade52df 148 //start writing data (from bit 51)
piyamate 2:af09cade52df 149 PDIO = 0;
piyamate 2:af09cade52df 150 wait_us(30);
piyamate 2:af09cade52df 151 for(int i=0; i<18; i++)
piyamate 2:af09cade52df 152 {
piyamate 2:af09cade52df 153 CLK = 1;
piyamate 2:af09cade52df 154 wait_us(30);
piyamate 2:af09cade52df 155 CLK = 0;
piyamate 2:af09cade52df 156 wait_us(30);
piyamate 2:af09cade52df 157 }
piyamate 2:af09cade52df 158 //I2C_A
piyamate 2:af09cade52df 159 wait_us(15);
piyamate 2:af09cade52df 160 for(int i=0; i<5; i++)
piyamate 2:af09cade52df 161 {
piyamate 2:af09cade52df 162 PDIO = ( I2C_A>>i )&1;
piyamate 2:af09cade52df 163 wait_us(15);
piyamate 2:af09cade52df 164 CLK = 1;
piyamate 2:af09cade52df 165 wait_us(30);
piyamate 2:af09cade52df 166 CLK = 0;
piyamate 2:af09cade52df 167 wait_us(15);
piyamate 2:af09cade52df 168 }
piyamate 2:af09cade52df 169
piyamate 2:af09cade52df 170 //factory_section
piyamate 2:af09cade52df 171 {
piyamate 4:1f708415c442 172 factory_section = 0;
piyamate 2:af09cade52df 173 for(int i=0; i<29; i++)
piyamate 2:af09cade52df 174 {
piyamate 3:1d0c09e43e22 175 PDIO = ( factory_section>>(29-i-1) )&1;
piyamate 4:1f708415c442 176 wait_us(15);
piyamate 2:af09cade52df 177 CLK = 1;
piyamate 2:af09cade52df 178 wait_us(30);
piyamate 2:af09cade52df 179 CLK = 0;
piyamate 4:1f708415c442 180 wait_us(15);
piyamate 2:af09cade52df 181 }
piyamate 2:af09cade52df 182 }
piyamate 2:af09cade52df 183
piyamate 2:af09cade52df 184 //mbit0,latch
piyamate 2:af09cade52df 185 {
piyamate 2:af09cade52df 186 for(int i=0; i<2; i++)
piyamate 2:af09cade52df 187 {
piyamate 2:af09cade52df 188 CLK = 1;
piyamate 2:af09cade52df 189 wait_us(30);
piyamate 2:af09cade52df 190 CLK = 0;
piyamate 2:af09cade52df 191 wait_us(30);
piyamate 2:af09cade52df 192 }
piyamate 2:af09cade52df 193 }
piyamate 2:af09cade52df 194
piyamate 2:af09cade52df 195 CSn = 0;
piyamate 2:af09cade52df 196 wait_us(30);
piyamate 2:af09cade52df 197 }
piyamate 2:af09cade52df 198
piyamate 2:af09cade52df 199 void OTP::prog()
piyamate 2:af09cade52df 200 {
piyamate 3:1d0c09e43e22 201 char input;
piyamate 3:1d0c09e43e22 202 pc.printf("Install capacitor on PDIO (y/n): ");
piyamate 3:1d0c09e43e22 203 pc.scanf("%c", &input);
piyamate 2:af09cade52df 204
piyamate 3:1d0c09e43e22 205 if(tolower(input) == 'y')
piyamate 2:af09cade52df 206 {
piyamate 3:1d0c09e43e22 207 pc.printf("\nFusing...\n");
piyamate 3:1d0c09e43e22 208 PDIO = 1;
piyamate 2:af09cade52df 209 CLK = 1;
piyamate 2:af09cade52df 210 wait_us(30);
piyamate 3:1d0c09e43e22 211 CSn = 1;
piyamate 3:1d0c09e43e22 212 wait_us(30);
piyamate 2:af09cade52df 213 CLK = 0;
piyamate 2:af09cade52df 214 wait_us(30);
piyamate 3:1d0c09e43e22 215
piyamate 3:1d0c09e43e22 216 //generate three CLK pulses
piyamate 3:1d0c09e43e22 217 for(int i=0; i<3; i++)
piyamate 3:1d0c09e43e22 218 {
piyamate 3:1d0c09e43e22 219 CLK = 1;
piyamate 3:1d0c09e43e22 220 wait_us(30);
piyamate 3:1d0c09e43e22 221 CLK = 0;
piyamate 3:1d0c09e43e22 222 wait_us(30);
piyamate 3:1d0c09e43e22 223 }
piyamate 3:1d0c09e43e22 224
piyamate 3:1d0c09e43e22 225 //mbit0
piyamate 2:af09cade52df 226 CLK = 1;
piyamate 4:1f708415c442 227 wait_us(T_PROG_BURN);
piyamate 2:af09cade52df 228 CLK = 0;
piyamate 4:1f708415c442 229 wait_us(T_PROG_REFRESH);
piyamate 3:1d0c09e43e22 230
piyamate 3:1d0c09e43e22 231 //factory_section
piyamate 3:1d0c09e43e22 232 for(int i=0; i<29; i++)
piyamate 3:1d0c09e43e22 233 {
piyamate 3:1d0c09e43e22 234 CLK = 1;
piyamate 4:1f708415c442 235 wait_us(T_PROG_BURN);
piyamate 3:1d0c09e43e22 236 CLK = 0;
piyamate 4:1f708415c442 237 wait_us(T_PROG_REFRESH);
piyamate 3:1d0c09e43e22 238 }
piyamate 3:1d0c09e43e22 239
piyamate 3:1d0c09e43e22 240 //I2C_A
piyamate 3:1d0c09e43e22 241 for(int i=0; i<5; i++)
piyamate 3:1d0c09e43e22 242 {
piyamate 3:1d0c09e43e22 243 CLK = 1;
piyamate 4:1f708415c442 244 wait_us(T_PROG_BURN);
piyamate 3:1d0c09e43e22 245 CLK = 0;
piyamate 4:1f708415c442 246 wait_us(T_PROG_REFRESH);
piyamate 4:1f708415c442 247 }
piyamate 4:1f708415c442 248
piyamate 4:1f708415c442 249 //burn other bits
piyamate 4:1f708415c442 250 for(int i=0; i<19; i++)
piyamate 4:1f708415c442 251 {
piyamate 4:1f708415c442 252 CLK = 1;
piyamate 4:1f708415c442 253 wait_us(T_PROG_BURN);
piyamate 4:1f708415c442 254 CLK = 0;
piyamate 4:1f708415c442 255 wait_us(T_PROG_REFRESH);
piyamate 3:1d0c09e43e22 256 }
piyamate 2:af09cade52df 257 }
piyamate 3:1d0c09e43e22 258 else
piyamate 2:af09cade52df 259 {
piyamate 3:1d0c09e43e22 260 pc.printf("\nCancelled.\n");
piyamate 2:af09cade52df 261 }
piyamate 3:1d0c09e43e22 262
piyamate 3:1d0c09e43e22 263 wait_us(30);
piyamate 2:af09cade52df 264 CSn = 0;
piyamate 2:af09cade52df 265 wait_us(30);
piyamate 2:af09cade52df 266 }
piyamate 2:af09cade52df 267
piyamate 2:af09cade52df 268 void OTP::set_id(uint8_t id)
piyamate 2:af09cade52df 269 {
piyamate 2:af09cade52df 270 I2C_A = ID_to_I2C_A(id);
piyamate 4:1f708415c442 271 }
piyamate 4:1f708415c442 272
piyamate 4:1f708415c442 273 void OTP::clear_registers()
piyamate 4:1f708415c442 274 {
piyamate 4:1f708415c442 275 factory_section = 0;
piyamate 4:1f708415c442 276 I2C_A = 0;
piyamate 4:1f708415c442 277 CCW = 0;
piyamate 4:1f708415c442 278 Z = 0;
piyamate 4:1f708415c442 279 output_md1 = 0;
piyamate 4:1f708415c442 280 output_md0 = 0;
piyamate 4:1f708415c442 281 pwmDIS = 0;
piyamate 4:1f708415c442 282 MagCompEN = 0;
piyamate 4:1f708415c442 283 PWMhalfEN_IndexWidth = 0;
piyamate 2:af09cade52df 284 }