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@3:1d0c09e43e22, 2014-05-13 (annotated)
- 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?
| 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 | 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 | } |