Piyamate Wisanuvej / Mbed 2 deprecated NSE5310_programmer

Dependencies:   mbed

Committer:
piyamate
Date:
Tue May 13 11:04:01 2014 +0000
Revision:
3:1d0c09e43e22
Parent:
2:af09cade52df
Child:
4:1f708415c442
minor fixes

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