Piyamate Wisanuvej / Mbed 2 deprecated NSE5310_programmer

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }