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.
main.cpp@1:1e577b8befeb, 2014-05-12 (annotated)
- Committer:
- piyamate
- Date:
- Mon May 12 12:10:44 2014 +0000
- Revision:
- 1:1e577b8befeb
- Parent:
- 0:d488d550469e
- Child:
- 2:af09cade52df
ID programming works; bit reading is reversed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
piyamate | 0:d488d550469e | 1 | #include "mbed.h" |
piyamate | 0:d488d550469e | 2 | |
piyamate | 0:d488d550469e | 3 | DigitalInOut PDIO(p30); |
piyamate | 1:1e577b8befeb | 4 | DigitalInOut CLK(p29); |
piyamate | 0:d488d550469e | 5 | DigitalOut CSn(p21); |
piyamate | 0:d488d550469e | 6 | Serial pc(USBTX, USBRX); |
piyamate | 0:d488d550469e | 7 | |
piyamate | 0:d488d550469e | 8 | int read_temperature(I2C i2c, int addr, float *temperature) |
piyamate | 0:d488d550469e | 9 | { |
piyamate | 0:d488d550469e | 10 | char data[5]; |
piyamate | 0:d488d550469e | 11 | int status = i2c.read(addr, data, 5); |
piyamate | 0:d488d550469e | 12 | *temperature = data[4]*0.667-75; |
piyamate | 0:d488d550469e | 13 | return status; |
piyamate | 0:d488d550469e | 14 | } |
piyamate | 0:d488d550469e | 15 | |
piyamate | 0:d488d550469e | 16 | void OTP_setup() |
piyamate | 0:d488d550469e | 17 | { |
piyamate | 1:1e577b8befeb | 18 | PDIO = 1; |
piyamate | 0:d488d550469e | 19 | PDIO.output(); |
piyamate | 0:d488d550469e | 20 | CLK = 0; |
piyamate | 1:1e577b8befeb | 21 | CLK.output(); |
piyamate | 0:d488d550469e | 22 | CSn = 0; |
piyamate | 0:d488d550469e | 23 | wait_ms(1); |
piyamate | 0:d488d550469e | 24 | CSn = 1; |
piyamate | 0:d488d550469e | 25 | wait_us(30); |
piyamate | 0:d488d550469e | 26 | CSn = 0; |
piyamate | 0:d488d550469e | 27 | wait_us(30); |
piyamate | 0:d488d550469e | 28 | CLK = 1; |
piyamate | 0:d488d550469e | 29 | wait_us(30); |
piyamate | 0:d488d550469e | 30 | CLK = 0; |
piyamate | 0:d488d550469e | 31 | wait_us(30); |
piyamate | 0:d488d550469e | 32 | } |
piyamate | 0:d488d550469e | 33 | |
piyamate | 1:1e577b8befeb | 34 | void OTP_read_bits(uint32_t *dest, int bit_length) |
piyamate | 1:1e577b8befeb | 35 | { |
piyamate | 1:1e577b8befeb | 36 | int idx = bit_length-1; |
piyamate | 1:1e577b8befeb | 37 | |
piyamate | 1:1e577b8befeb | 38 | do |
piyamate | 1:1e577b8befeb | 39 | { |
piyamate | 1:1e577b8befeb | 40 | CLK = 1; |
piyamate | 1:1e577b8befeb | 41 | wait_us(30); |
piyamate | 1:1e577b8befeb | 42 | *dest |= (PDIO<<idx); |
piyamate | 1:1e577b8befeb | 43 | CLK = 0; |
piyamate | 1:1e577b8befeb | 44 | wait_us(30); |
piyamate | 1:1e577b8befeb | 45 | idx--; |
piyamate | 1:1e577b8befeb | 46 | }while(idx>=0); |
piyamate | 1:1e577b8befeb | 47 | } |
piyamate | 1:1e577b8befeb | 48 | |
piyamate | 0:d488d550469e | 49 | void OTP_exit() |
piyamate | 0:d488d550469e | 50 | { |
piyamate | 0:d488d550469e | 51 | CLK = 0; |
piyamate | 0:d488d550469e | 52 | CSn = 0; |
piyamate | 0:d488d550469e | 53 | PDIO = 1; |
piyamate | 1:1e577b8befeb | 54 | PDIO.output(); |
piyamate | 0:d488d550469e | 55 | wait_us(30); |
piyamate | 0:d488d550469e | 56 | CLK = 1; |
piyamate | 0:d488d550469e | 57 | wait_us(30); |
piyamate | 0:d488d550469e | 58 | CLK = 0; |
piyamate | 0:d488d550469e | 59 | wait_us(30); |
piyamate | 0:d488d550469e | 60 | CLK = 1; |
piyamate | 0:d488d550469e | 61 | wait_us(30); |
piyamate | 0:d488d550469e | 62 | CSn = 1; |
piyamate | 0:d488d550469e | 63 | wait_us(30); |
piyamate | 1:1e577b8befeb | 64 | CLK.input(); |
piyamate | 0:d488d550469e | 65 | } |
piyamate | 0:d488d550469e | 66 | |
piyamate | 1:1e577b8befeb | 67 | void OTP_read(uint32_t *factory_section) |
piyamate | 0:d488d550469e | 68 | { |
piyamate | 1:1e577b8befeb | 69 | PDIO = 0; |
piyamate | 1:1e577b8befeb | 70 | wait_us(30); |
piyamate | 0:d488d550469e | 71 | CLK = 1; |
piyamate | 0:d488d550469e | 72 | wait_us(30); |
piyamate | 0:d488d550469e | 73 | CSn = 1; |
piyamate | 0:d488d550469e | 74 | wait_us(30); |
piyamate | 0:d488d550469e | 75 | CLK = 0; |
piyamate | 0:d488d550469e | 76 | wait_us(30); |
piyamate | 0:d488d550469e | 77 | |
piyamate | 0:d488d550469e | 78 | //generate two CLK pulses |
piyamate | 0:d488d550469e | 79 | for(int i=0; i<2; i++) |
piyamate | 0:d488d550469e | 80 | { |
piyamate | 0:d488d550469e | 81 | CLK = 1; |
piyamate | 0:d488d550469e | 82 | wait_us(30); |
piyamate | 0:d488d550469e | 83 | CLK = 0; |
piyamate | 0:d488d550469e | 84 | wait_us(15); |
piyamate | 0:d488d550469e | 85 | |
piyamate | 0:d488d550469e | 86 | //switch PDIO to input on first faling edge of CLK |
piyamate | 0:d488d550469e | 87 | if(i==0) |
piyamate | 0:d488d550469e | 88 | PDIO.input(); |
piyamate | 0:d488d550469e | 89 | wait_us(15); |
piyamate | 0:d488d550469e | 90 | } |
piyamate | 0:d488d550469e | 91 | |
piyamate | 1:1e577b8befeb | 92 | uint32_t I2C_A = 0; //I2C address <5:1> |
piyamate | 1:1e577b8befeb | 93 | uint32_t CCW = 0; //change increasing/decreasing code with encoder movement |
piyamate | 1:1e577b8befeb | 94 | uint32_t Z = 0; //zero position |
piyamate | 1:1e577b8befeb | 95 | uint32_t output_md1 = 0, output_md0 = 0; |
piyamate | 1:1e577b8befeb | 96 | uint32_t pwmDIS = 0; |
piyamate | 1:1e577b8befeb | 97 | uint32_t MagCompEN = 0; |
piyamate | 1:1e577b8befeb | 98 | uint32_t PWMhalfEN_IndexWidth = 0; |
piyamate | 0:d488d550469e | 99 | |
piyamate | 0:d488d550469e | 100 | //read all parameters |
piyamate | 1:1e577b8befeb | 101 | OTP_read_bits(&PWMhalfEN_IndexWidth, 1); |
piyamate | 1:1e577b8befeb | 102 | OTP_read_bits(&MagCompEN, 1); |
piyamate | 1:1e577b8befeb | 103 | OTP_read_bits(&pwmDIS, 1); |
piyamate | 1:1e577b8befeb | 104 | OTP_read_bits(&output_md0, 1); |
piyamate | 1:1e577b8befeb | 105 | OTP_read_bits(&output_md1, 1); |
piyamate | 1:1e577b8befeb | 106 | OTP_read_bits(&Z, 12); |
piyamate | 1:1e577b8befeb | 107 | OTP_read_bits(&CCW, 1); |
piyamate | 1:1e577b8befeb | 108 | OTP_read_bits(&I2C_A, 5); |
piyamate | 1:1e577b8befeb | 109 | OTP_read_bits(factory_section, 29); |
piyamate | 1:1e577b8befeb | 110 | |
piyamate | 1:1e577b8befeb | 111 | //mbit0,mbit1 |
piyamate | 1:1e577b8befeb | 112 | { |
piyamate | 1:1e577b8befeb | 113 | wait_ms(1); |
piyamate | 1:1e577b8befeb | 114 | for(int i=0; i<3; i++) |
piyamate | 1:1e577b8befeb | 115 | { |
piyamate | 1:1e577b8befeb | 116 | CLK = 1; |
piyamate | 1:1e577b8befeb | 117 | wait_us(30); |
piyamate | 1:1e577b8befeb | 118 | CLK = 0; |
piyamate | 1:1e577b8befeb | 119 | wait_us(30); |
piyamate | 1:1e577b8befeb | 120 | } |
piyamate | 1:1e577b8befeb | 121 | } |
piyamate | 1:1e577b8befeb | 122 | |
piyamate | 1:1e577b8befeb | 123 | pc.printf("PWMhalfEN_IndexWidth: %X\n", PWMhalfEN_IndexWidth); |
piyamate | 1:1e577b8befeb | 124 | pc.printf("MagCompEN: %X\n", MagCompEN); |
piyamate | 1:1e577b8befeb | 125 | pc.printf("pwmDIS: %X\n", pwmDIS); |
piyamate | 1:1e577b8befeb | 126 | pc.printf("output_md0: %X\n", output_md0); |
piyamate | 1:1e577b8befeb | 127 | pc.printf("output_md1: %X\n", output_md1); |
piyamate | 1:1e577b8befeb | 128 | pc.printf("Z: 0x%03X\n", Z); |
piyamate | 1:1e577b8befeb | 129 | pc.printf("CCW: %X\n", CCW); |
piyamate | 1:1e577b8befeb | 130 | pc.printf("I2C_A: 0x%02X (0x%02X)\n", I2C_A, (I2C_A<<2)+0x80); |
piyamate | 1:1e577b8befeb | 131 | pc.printf("factory_section: 0x%08X\n", factory_section); |
piyamate | 1:1e577b8befeb | 132 | } |
piyamate | 1:1e577b8befeb | 133 | |
piyamate | 1:1e577b8befeb | 134 | uint8_t ID_to_I2C_A(uint8_t id) |
piyamate | 1:1e577b8befeb | 135 | { |
piyamate | 1:1e577b8befeb | 136 | return (id&0x7C) >> 2; |
piyamate | 1:1e577b8befeb | 137 | } |
piyamate | 1:1e577b8befeb | 138 | |
piyamate | 1:1e577b8befeb | 139 | void OTP_write(uint8_t id, uint32_t factory_section) |
piyamate | 1:1e577b8befeb | 140 | { |
piyamate | 1:1e577b8befeb | 141 | PDIO = 1; |
piyamate | 1:1e577b8befeb | 142 | CLK = 0; |
piyamate | 1:1e577b8befeb | 143 | wait_us(30); |
piyamate | 1:1e577b8befeb | 144 | CSn = 1; |
piyamate | 1:1e577b8befeb | 145 | wait_us(30); |
piyamate | 1:1e577b8befeb | 146 | |
piyamate | 1:1e577b8befeb | 147 | //generate four CLK pulses |
piyamate | 1:1e577b8befeb | 148 | for(int i=0; i<4; i++) |
piyamate | 1:1e577b8befeb | 149 | { |
piyamate | 1:1e577b8befeb | 150 | CLK = 1; |
piyamate | 1:1e577b8befeb | 151 | wait_us(30); |
piyamate | 1:1e577b8befeb | 152 | CLK = 0; |
piyamate | 1:1e577b8befeb | 153 | wait_us(30); |
piyamate | 1:1e577b8befeb | 154 | } |
piyamate | 1:1e577b8befeb | 155 | |
piyamate | 1:1e577b8befeb | 156 | //start writing data (from bit 51) |
piyamate | 1:1e577b8befeb | 157 | PDIO = 0; |
piyamate | 1:1e577b8befeb | 158 | wait_us(30); |
piyamate | 1:1e577b8befeb | 159 | for(int i=0; i<18; i++) |
piyamate | 1:1e577b8befeb | 160 | { |
piyamate | 1:1e577b8befeb | 161 | CLK = 1; |
piyamate | 1:1e577b8befeb | 162 | wait_us(30); |
piyamate | 1:1e577b8befeb | 163 | CLK = 0; |
piyamate | 1:1e577b8befeb | 164 | wait_us(30); |
piyamate | 1:1e577b8befeb | 165 | } |
piyamate | 1:1e577b8befeb | 166 | //I2C_A |
piyamate | 1:1e577b8befeb | 167 | uint8_t id_register = ID_to_I2C_A(id); |
piyamate | 1:1e577b8befeb | 168 | wait_us(15); |
piyamate | 1:1e577b8befeb | 169 | for(int i=0; i<5; i++) |
piyamate | 1:1e577b8befeb | 170 | { |
piyamate | 1:1e577b8befeb | 171 | PDIO = ( id_register>>i )&1; |
piyamate | 1:1e577b8befeb | 172 | wait_us(15); |
piyamate | 1:1e577b8befeb | 173 | CLK = 1; |
piyamate | 1:1e577b8befeb | 174 | wait_us(30); |
piyamate | 1:1e577b8befeb | 175 | CLK = 0; |
piyamate | 1:1e577b8befeb | 176 | wait_us(15); |
piyamate | 1:1e577b8befeb | 177 | } |
piyamate | 1:1e577b8befeb | 178 | |
piyamate | 1:1e577b8befeb | 179 | //factory_section |
piyamate | 1:1e577b8befeb | 180 | { |
piyamate | 1:1e577b8befeb | 181 | PDIO = 0; |
piyamate | 1:1e577b8befeb | 182 | wait_us(30); |
piyamate | 1:1e577b8befeb | 183 | for(int i=0; i<29; i++) |
piyamate | 1:1e577b8befeb | 184 | { |
piyamate | 1:1e577b8befeb | 185 | PDIO = ( factory_section>>(29-i-1) )&1; |
piyamate | 1:1e577b8befeb | 186 | CLK = 1; |
piyamate | 1:1e577b8befeb | 187 | wait_us(30); |
piyamate | 1:1e577b8befeb | 188 | CLK = 0; |
piyamate | 1:1e577b8befeb | 189 | wait_us(30); |
piyamate | 1:1e577b8befeb | 190 | } |
piyamate | 1:1e577b8befeb | 191 | } |
piyamate | 1:1e577b8befeb | 192 | |
piyamate | 1:1e577b8befeb | 193 | //mbit0,latch |
piyamate | 1:1e577b8befeb | 194 | { |
piyamate | 1:1e577b8befeb | 195 | for(int i=0; i<2; i++) |
piyamate | 1:1e577b8befeb | 196 | { |
piyamate | 1:1e577b8befeb | 197 | CLK = 1; |
piyamate | 1:1e577b8befeb | 198 | wait_us(30); |
piyamate | 1:1e577b8befeb | 199 | CLK = 0; |
piyamate | 1:1e577b8befeb | 200 | wait_us(30); |
piyamate | 1:1e577b8befeb | 201 | } |
piyamate | 1:1e577b8befeb | 202 | } |
piyamate | 0:d488d550469e | 203 | } |
piyamate | 0:d488d550469e | 204 | |
piyamate | 0:d488d550469e | 205 | int scan_NSE5310() |
piyamate | 0:d488d550469e | 206 | { |
piyamate | 0:d488d550469e | 207 | CSn = 0; |
piyamate | 0:d488d550469e | 208 | I2C i2c(p28, p27); |
piyamate | 0:d488d550469e | 209 | int device_count = 0; |
piyamate | 0:d488d550469e | 210 | for(int addr=0x80; addr<0xFE; addr+=2) |
piyamate | 0:d488d550469e | 211 | { |
piyamate | 0:d488d550469e | 212 | float temperature; |
piyamate | 0:d488d550469e | 213 | //pc.printf("addr:0x%02X\n", addr); |
piyamate | 0:d488d550469e | 214 | if(read_temperature(i2c, addr, &temperature)==0) |
piyamate | 0:d488d550469e | 215 | { |
piyamate | 0:d488d550469e | 216 | pc.printf("Found device: 0x%02X, Temperature: %2.1fC\n", addr, temperature); |
piyamate | 0:d488d550469e | 217 | device_count++; |
piyamate | 0:d488d550469e | 218 | } |
piyamate | 0:d488d550469e | 219 | } |
piyamate | 0:d488d550469e | 220 | return device_count; |
piyamate | 0:d488d550469e | 221 | } |
piyamate | 0:d488d550469e | 222 | |
piyamate | 0:d488d550469e | 223 | int main() { |
piyamate | 1:1e577b8befeb | 224 | CLK.input(); |
piyamate | 1:1e577b8befeb | 225 | PDIO.input(); |
piyamate | 0:d488d550469e | 226 | pc.baud(115200); |
piyamate | 0:d488d550469e | 227 | pc.printf("Scanning for NSE5310 devices...\n"); |
piyamate | 0:d488d550469e | 228 | int device_count = scan_NSE5310(); |
piyamate | 0:d488d550469e | 229 | //pc.printf("device_count=%d\n", device_count); |
piyamate | 0:d488d550469e | 230 | if(device_count==0) |
piyamate | 0:d488d550469e | 231 | pc.printf("No device found. Completed.\n"); |
piyamate | 0:d488d550469e | 232 | else if(device_count>1) |
piyamate | 0:d488d550469e | 233 | pc.printf("Found more than one device. Completed.\n"); |
piyamate | 0:d488d550469e | 234 | else if(device_count==1) |
piyamate | 0:d488d550469e | 235 | { |
piyamate | 1:1e577b8befeb | 236 | //device parameters |
piyamate | 1:1e577b8befeb | 237 | uint8_t id = 0; |
piyamate | 1:1e577b8befeb | 238 | uint32_t factory_section = 0; |
piyamate | 1:1e577b8befeb | 239 | |
piyamate | 0:d488d550469e | 240 | pc.printf("Entering programming mode...\n"); |
piyamate | 1:1e577b8befeb | 241 | |
piyamate | 0:d488d550469e | 242 | OTP_setup(); |
piyamate | 1:1e577b8befeb | 243 | pc.printf("OTP_read()\n"); |
piyamate | 1:1e577b8befeb | 244 | OTP_read(&factory_section); |
piyamate | 1:1e577b8befeb | 245 | OTP_exit(); |
piyamate | 1:1e577b8befeb | 246 | pc.printf("\n"); |
piyamate | 1:1e577b8befeb | 247 | |
piyamate | 1:1e577b8befeb | 248 | int valid = 0; |
piyamate | 1:1e577b8befeb | 249 | do |
piyamate | 1:1e577b8befeb | 250 | { |
piyamate | 1:1e577b8befeb | 251 | pc.printf("\nInput new device ID in hex (0x80 to 0xFE): 0x"); |
piyamate | 1:1e577b8befeb | 252 | //pc.scanf("%x", &id); |
piyamate | 1:1e577b8befeb | 253 | id = 0xC0; |
piyamate | 1:1e577b8befeb | 254 | id &= 0xFC; |
piyamate | 1:1e577b8befeb | 255 | if(id>=0x80 && id<=0xFE) |
piyamate | 1:1e577b8befeb | 256 | valid = 1; |
piyamate | 1:1e577b8befeb | 257 | }while(valid==0); |
piyamate | 1:1e577b8befeb | 258 | pc.printf("\n"); |
piyamate | 1:1e577b8befeb | 259 | |
piyamate | 1:1e577b8befeb | 260 | OTP_setup(); |
piyamate | 1:1e577b8befeb | 261 | pc.printf("OTP_write(0x%02X)\n", id); |
piyamate | 1:1e577b8befeb | 262 | OTP_write(id, factory_section); |
piyamate | 1:1e577b8befeb | 263 | OTP_exit(); |
piyamate | 1:1e577b8befeb | 264 | pc.printf("\n"); |
piyamate | 1:1e577b8befeb | 265 | |
piyamate | 1:1e577b8befeb | 266 | OTP_setup(); |
piyamate | 1:1e577b8befeb | 267 | pc.printf("OTP_read()\n"); |
piyamate | 1:1e577b8befeb | 268 | OTP_read(&factory_section); |
piyamate | 1:1e577b8befeb | 269 | OTP_exit(); |
piyamate | 1:1e577b8befeb | 270 | pc.printf("\n"); |
piyamate | 0:d488d550469e | 271 | } |
piyamate | 0:d488d550469e | 272 | } |