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@2:af09cade52df, 2014-05-13 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |