Piyamate Wisanuvej / Mbed 2 deprecated NSE5310_programmer

Dependencies:   mbed

Committer:
piyamate
Date:
Sun May 11 07:39:13 2014 +0000
Revision:
0:d488d550469e
Child:
1:1e577b8befeb
untested first version

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 0:d488d550469e 4 DigitalOut CSn(p21);
piyamate 0:d488d550469e 5 Serial pc(USBTX, USBRX);
piyamate 0:d488d550469e 6
piyamate 0:d488d550469e 7 int read_temperature(I2C i2c, int addr, float *temperature)
piyamate 0:d488d550469e 8 {
piyamate 0:d488d550469e 9 char data[5];
piyamate 0:d488d550469e 10 int status = i2c.read(addr, data, 5);
piyamate 0:d488d550469e 11 *temperature = data[4]*0.667-75;
piyamate 0:d488d550469e 12 return status;
piyamate 0:d488d550469e 13 }
piyamate 0:d488d550469e 14
piyamate 0:d488d550469e 15 void OTP_setup()
piyamate 0:d488d550469e 16 {
piyamate 0:d488d550469e 17 DigitalOut CLK(p27);
piyamate 0:d488d550469e 18 PDIO.output();
piyamate 0:d488d550469e 19 PDIO = 1;
piyamate 0:d488d550469e 20 CLK = 0;
piyamate 0:d488d550469e 21 CSn = 0;
piyamate 0:d488d550469e 22 wait_ms(1);
piyamate 0:d488d550469e 23 CSn = 1;
piyamate 0:d488d550469e 24 wait_us(30);
piyamate 0:d488d550469e 25 CSn = 0;
piyamate 0:d488d550469e 26 wait_us(30);
piyamate 0:d488d550469e 27 CLK = 1;
piyamate 0:d488d550469e 28 wait_us(30);
piyamate 0:d488d550469e 29 CLK = 0;
piyamate 0:d488d550469e 30 wait_us(30);
piyamate 0:d488d550469e 31 }
piyamate 0:d488d550469e 32
piyamate 0:d488d550469e 33 void OTP_exit()
piyamate 0:d488d550469e 34 {
piyamate 0:d488d550469e 35 DigitalOut CLK(p27);
piyamate 0:d488d550469e 36 CLK = 0;
piyamate 0:d488d550469e 37 CSn = 0;
piyamate 0:d488d550469e 38 PDIO = 1;
piyamate 0:d488d550469e 39 wait_us(30);
piyamate 0:d488d550469e 40 CLK = 1;
piyamate 0:d488d550469e 41 wait_us(30);
piyamate 0:d488d550469e 42 CLK = 0;
piyamate 0:d488d550469e 43 wait_us(30);
piyamate 0:d488d550469e 44 CLK = 1;
piyamate 0:d488d550469e 45 wait_us(30);
piyamate 0:d488d550469e 46 CSn = 1;
piyamate 0:d488d550469e 47 wait_us(30);
piyamate 0:d488d550469e 48
piyamate 0:d488d550469e 49 }
piyamate 0:d488d550469e 50
piyamate 0:d488d550469e 51 void OTP_read(char *data, int length)
piyamate 0:d488d550469e 52 {
piyamate 0:d488d550469e 53 DigitalOut CLK(p27);
piyamate 0:d488d550469e 54 CLK = 1;
piyamate 0:d488d550469e 55 PDIO = 0;
piyamate 0:d488d550469e 56 wait_us(30);
piyamate 0:d488d550469e 57 CSn = 1;
piyamate 0:d488d550469e 58 wait_us(30);
piyamate 0:d488d550469e 59 CLK = 0;
piyamate 0:d488d550469e 60 wait_us(30);
piyamate 0:d488d550469e 61
piyamate 0:d488d550469e 62 //generate two CLK pulses
piyamate 0:d488d550469e 63 for(int i=0; i<2; i++)
piyamate 0:d488d550469e 64 {
piyamate 0:d488d550469e 65 CLK = 1;
piyamate 0:d488d550469e 66 wait_us(30);
piyamate 0:d488d550469e 67 CLK = 0;
piyamate 0:d488d550469e 68 wait_us(15);
piyamate 0:d488d550469e 69
piyamate 0:d488d550469e 70 //switch PDIO to input on first faling edge of CLK
piyamate 0:d488d550469e 71 if(i==0)
piyamate 0:d488d550469e 72 PDIO.input();
piyamate 0:d488d550469e 73 wait_us(15);
piyamate 0:d488d550469e 74 }
piyamate 0:d488d550469e 75
piyamate 0:d488d550469e 76 uint32_t factory_section = 0;
piyamate 0:d488d550469e 77 uint8_t I2C_A = 0; //I2C address <5:1>
piyamate 0:d488d550469e 78 uint8_t CCW = 0; //change increasing/decreasing code with encoder movement
piyamate 0:d488d550469e 79 uint16_t Z = 0; //zero position
piyamate 0:d488d550469e 80
piyamate 0:d488d550469e 81 //read all parameters
piyamate 0:d488d550469e 82 read_bits(&factory_section, 29);
piyamate 0:d488d550469e 83 read_bits(&I2C_A, 5);
piyamate 0:d488d550469e 84 read_bits(&CCW, 1);
piyamate 0:d488d550469e 85 read_bits(&Z, 12);
piyamate 0:d488d550469e 86 }
piyamate 0:d488d550469e 87
piyamate 0:d488d550469e 88 int scan_NSE5310()
piyamate 0:d488d550469e 89 {
piyamate 0:d488d550469e 90 CSn = 0;
piyamate 0:d488d550469e 91 I2C i2c(p28, p27);
piyamate 0:d488d550469e 92 int device_count = 0;
piyamate 0:d488d550469e 93 for(int addr=0x80; addr<0xFE; addr+=2)
piyamate 0:d488d550469e 94 {
piyamate 0:d488d550469e 95 float temperature;
piyamate 0:d488d550469e 96 //pc.printf("addr:0x%02X\n", addr);
piyamate 0:d488d550469e 97 if(read_temperature(i2c, addr, &temperature)==0)
piyamate 0:d488d550469e 98 {
piyamate 0:d488d550469e 99 pc.printf("Found device: 0x%02X, Temperature: %2.1fC\n", addr, temperature);
piyamate 0:d488d550469e 100 device_count++;
piyamate 0:d488d550469e 101 }
piyamate 0:d488d550469e 102 }
piyamate 0:d488d550469e 103 return device_count;
piyamate 0:d488d550469e 104 }
piyamate 0:d488d550469e 105
piyamate 0:d488d550469e 106 int main() {
piyamate 0:d488d550469e 107 pc.baud(115200);
piyamate 0:d488d550469e 108 pc.printf("Scanning for NSE5310 devices...\n");
piyamate 0:d488d550469e 109 int device_count = scan_NSE5310();
piyamate 0:d488d550469e 110 //pc.printf("device_count=%d\n", device_count);
piyamate 0:d488d550469e 111 if(device_count==0)
piyamate 0:d488d550469e 112 pc.printf("No device found. Completed.\n");
piyamate 0:d488d550469e 113 else if(device_count>1)
piyamate 0:d488d550469e 114 pc.printf("Found more than one device. Completed.\n");
piyamate 0:d488d550469e 115 else if(device_count==1)
piyamate 0:d488d550469e 116 {
piyamate 0:d488d550469e 117 pc.printf("Entering programming mode...\n");
piyamate 0:d488d550469e 118 OTP_setup();
piyamate 0:d488d550469e 119 }
piyamate 0:d488d550469e 120 while(1);
piyamate 0:d488d550469e 121 }