Piyamate Wisanuvej / Mbed 2 deprecated NSE5310_programmer

Dependencies:   mbed

Committer:
piyamate
Date:
Tue May 13 10:38:10 2014 +0000
Revision:
2:af09cade52df
Child:
3:1d0c09e43e22
OTP class

Who changed what in which revision?

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