Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
OTP.cpp@4:1f708415c442, 2014-05-13 (annotated)
- Committer:
- piyamate
- Date:
- Tue May 13 13:54:32 2014 +0000
- Revision:
- 4:1f708415c442
- Parent:
- 3:1d0c09e43e22
working !
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |