06/21/18

Fork of rtos_threading_with_callback by mbed_example

Committer:
CactusSemi
Date:
Thu Jun 21 22:11:25 2018 +0000
Revision:
3:3e8c16b6620c
Child:
4:61f1412310af
06/21/2018

Who changed what in which revision?

UserRevisionLine numberNew contents of line
CactusSemi 3:3e8c16b6620c 1 #include "mbed.h"
CactusSemi 3:3e8c16b6620c 2
CactusSemi 3:3e8c16b6620c 3 extern Serial pc;
CactusSemi 3:3e8c16b6620c 4 extern int frequ; //unit kHz
CactusSemi 3:3e8c16b6620c 5 extern char dev_addr; //fixed
CactusSemi 3:3e8c16b6620c 6
CactusSemi 3:3e8c16b6620c 7 char get_half_byte(int *); //defined in I2C_read.cpp
CactusSemi 3:3e8c16b6620c 8
CactusSemi 3:3e8c16b6620c 9
CactusSemi 3:3e8c16b6620c 10 char get_byte(int *flag) {
CactusSemi 3:3e8c16b6620c 11 char cur_char;
CactusSemi 3:3e8c16b6620c 12 char temp;
CactusSemi 3:3e8c16b6620c 13 int flag1 = 0;
CactusSemi 3:3e8c16b6620c 14 cur_char = get_half_byte(&flag1);
CactusSemi 3:3e8c16b6620c 15 if (flag1 == 1) {
CactusSemi 3:3e8c16b6620c 16 cur_char = cur_char << 4;
CactusSemi 3:3e8c16b6620c 17 temp = get_half_byte(&flag1);
CactusSemi 3:3e8c16b6620c 18 cur_char = (cur_char | temp);
CactusSemi 3:3e8c16b6620c 19 }
CactusSemi 3:3e8c16b6620c 20 *flag = flag1;
CactusSemi 3:3e8c16b6620c 21 return cur_char;
CactusSemi 3:3e8c16b6620c 22 }
CactusSemi 3:3e8c16b6620c 23
CactusSemi 3:3e8c16b6620c 24 void print_nvm_reg(uint8_t *max_Vout, uint8_t *max_Vout_trim, uint8_t *high_time, uint8_t *low_time, uint8_t *adc_samp_rate,
CactusSemi 3:3e8c16b6620c 25 uint8_t *adc_range, uint8_t *adc_time_out, uint8_t *comp_offset, uint8_t *range_trim, uint8_t *PMOS_off, uint8_t *Driver2, uint8_t *Driver3,
CactusSemi 3:3e8c16b6620c 26 uint8_t *DMOS, uint8_t *CCM_threshold, uint8_t *DMOS_ctrl_trim, uint8_t *adc_op_mode) {
CactusSemi 3:3e8c16b6620c 27
CactusSemi 3:3e8c16b6620c 28 pc.printf("\033[%dm ", 35);//change text color to red
CactusSemi 3:3e8c16b6620c 29 pc.printf("\n\n\n\r\t Register contents :\n\r\t ");
CactusSemi 3:3e8c16b6620c 30 for ( int i = 0; i<26; i++) pc.printf("\304");
CactusSemi 3:3e8c16b6620c 31 pc.printf("\n\n\r\t 1. max_Vout = 0x%2.2X",*max_Vout);
CactusSemi 3:3e8c16b6620c 32 pc.printf("\n\n\r\t 2. max_Vout_trim = 0x%2.2X",*max_Vout_trim);
CactusSemi 3:3e8c16b6620c 33 pc.printf("\n\n\r\t 3. high_time = 0x%2.2X",*high_time);
CactusSemi 3:3e8c16b6620c 34 pc.printf("\n\n\r\t 4. low_time = 0x%2.2X",*low_time);
CactusSemi 3:3e8c16b6620c 35 pc.printf("\n\n\r\t 5. adc_samp_rate = 0x%2.2X",*adc_samp_rate);
CactusSemi 3:3e8c16b6620c 36 pc.printf("\n\n\r\t 6. adc_range = 0x%2.2X",*adc_range);
CactusSemi 3:3e8c16b6620c 37 pc.printf("\n\n\r\t 7. adc_time_out = 0x%2.2X",*adc_time_out);
CactusSemi 3:3e8c16b6620c 38 pc.printf("\n\n\r\t 8. comp_offset = 0x%2.2X",*comp_offset);
CactusSemi 3:3e8c16b6620c 39 pc.printf("\n\n\r\t 9. range_trim = 0x%2.2X",*range_trim);
CactusSemi 3:3e8c16b6620c 40 pc.printf("\n\n\r\t 10. PMOS_off = 0x%2.2X",*PMOS_off);
CactusSemi 3:3e8c16b6620c 41 pc.printf("\n\n\r\t 11. Driver2 = 0x%2.2X",*Driver2);
CactusSemi 3:3e8c16b6620c 42 pc.printf("\n\n\r\t 12. Driver3 = 0x%2.2X",*Driver3);
CactusSemi 3:3e8c16b6620c 43 pc.printf("\n\n\r\t 13. DMOS = 0x%2.2X",*DMOS);
CactusSemi 3:3e8c16b6620c 44 pc.printf("\n\n\r\t 14. CCM_threshold = 0x%2.2X",*CCM_threshold);
CactusSemi 3:3e8c16b6620c 45 pc.printf("\n\n\r\t 15. DMOS_ctrl_trim = 0x%2.2X",*DMOS_ctrl_trim);
CactusSemi 3:3e8c16b6620c 46 pc.printf("\n\n\r\t 16. adc_op_mode = 0x%2.2X",*adc_op_mode);
CactusSemi 3:3e8c16b6620c 47 pc.printf("\n\n\r\t ");
CactusSemi 3:3e8c16b6620c 48 for ( int i = 0; i<26; i++) pc.printf("\315");
CactusSemi 3:3e8c16b6620c 49 pc.printf("\033[%dm", 32);//change text color to green
CactusSemi 3:3e8c16b6620c 50 pc.printf("\n\r");
CactusSemi 3:3e8c16b6620c 51 }
CactusSemi 3:3e8c16b6620c 52
CactusSemi 3:3e8c16b6620c 53 void edit_nvm_reg(uint8_t *max_Vout, uint8_t *max_Vout_trim, uint8_t *high_time, uint8_t *low_time, uint8_t *adc_samp_rate,
CactusSemi 3:3e8c16b6620c 54 uint8_t *adc_range, uint8_t *adc_time_out, uint8_t *comp_offset, uint8_t *range_trim, uint8_t *PMOS_off, uint8_t *Driver2, uint8_t *Driver3,
CactusSemi 3:3e8c16b6620c 55 uint8_t *DMOS, uint8_t *CCM_threshold, uint8_t *DMOS_ctrl_trim, uint8_t *adc_op_mode) {
CactusSemi 3:3e8c16b6620c 56
CactusSemi 3:3e8c16b6620c 57 char temp;
CactusSemi 3:3e8c16b6620c 58 int flag1;
CactusSemi 3:3e8c16b6620c 59 char count;
CactusSemi 3:3e8c16b6620c 60 char reg_data;
CactusSemi 3:3e8c16b6620c 61
CactusSemi 3:3e8c16b6620c 62 char reg_name[16][15] = {"max_Vout", "max_Vout_trim", "high_time", "low_time", "adc_samp_rate",
CactusSemi 3:3e8c16b6620c 63 "adc_range", "adc_time_out", "comp_offset", "range_trim", "PMOS_off", "Driver2", "Driver3",
CactusSemi 3:3e8c16b6620c 64 "DMOS", "CCM_threshold", "DMOS_ctrl_trim", "adc_op_mode" };
CactusSemi 3:3e8c16b6620c 65
CactusSemi 3:3e8c16b6620c 66 uint8_t *reg_addr[16] = { max_Vout, max_Vout_trim, high_time, low_time, adc_samp_rate,
CactusSemi 3:3e8c16b6620c 67 adc_range, adc_time_out, comp_offset, range_trim, PMOS_off, Driver2, Driver3,
CactusSemi 3:3e8c16b6620c 68 DMOS, CCM_threshold, DMOS_ctrl_trim, adc_op_mode};
CactusSemi 3:3e8c16b6620c 69
CactusSemi 3:3e8c16b6620c 70 pc.printf("\n\n\n \r\tDo you want to edit the registers? (y/n) : ");
CactusSemi 3:3e8c16b6620c 71 temp = 0;
CactusSemi 3:3e8c16b6620c 72 while ( temp!='y' && temp!='n') {
CactusSemi 3:3e8c16b6620c 73 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 74 }
CactusSemi 3:3e8c16b6620c 75 if (temp == 'n') {
CactusSemi 3:3e8c16b6620c 76 pc.printf("\n\n \r\tContinue with above contents");
CactusSemi 3:3e8c16b6620c 77 return;
CactusSemi 3:3e8c16b6620c 78 }
CactusSemi 3:3e8c16b6620c 79 temp = 'y';
CactusSemi 3:3e8c16b6620c 80 while (temp =='y') {
CactusSemi 3:3e8c16b6620c 81 //get selection
CactusSemi 3:3e8c16b6620c 82 flag1 = 0;
CactusSemi 3:3e8c16b6620c 83 while (!flag1) {
CactusSemi 3:3e8c16b6620c 84 pc.printf("\n\n\n\r\tEnter (1 - 16) to select the register to edit and hit 'enter' key: ");
CactusSemi 3:3e8c16b6620c 85 temp = '0';
CactusSemi 3:3e8c16b6620c 86 count = 0;
CactusSemi 3:3e8c16b6620c 87 while (temp != '\r') { //look for enter key
CactusSemi 3:3e8c16b6620c 88 count = (count * 10) + (temp - '0'); // converting to number
CactusSemi 3:3e8c16b6620c 89 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 90 if ((temp < '0' || temp > '9') && temp !='\r') {
CactusSemi 3:3e8c16b6620c 91 pc.printf(" \n\r\t\033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40);
CactusSemi 3:3e8c16b6620c 92 break;
CactusSemi 3:3e8c16b6620c 93 }
CactusSemi 3:3e8c16b6620c 94 }
CactusSemi 3:3e8c16b6620c 95 if (count >= 1 && count <= 16 && temp == '\r') flag1 = 1;
CactusSemi 3:3e8c16b6620c 96 else if (temp == '\r') pc.printf(" \n\r\t\033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40);
CactusSemi 3:3e8c16b6620c 97 }
CactusSemi 3:3e8c16b6620c 98 count = count - 1; //array starts from 0
CactusSemi 3:3e8c16b6620c 99 //Read New Register Data
CactusSemi 3:3e8c16b6620c 100 flag1 = 0;
CactusSemi 3:3e8c16b6620c 101 while (!flag1) {
CactusSemi 3:3e8c16b6620c 102 pc.printf("\n\n \r\tEnter new value in hex (00 to ff) for \033[%dm %s \033[%dm register : ",35,reg_name[count],32);
CactusSemi 3:3e8c16b6620c 103 reg_data = get_half_byte(&flag1);
CactusSemi 3:3e8c16b6620c 104 if (flag1 == 1) {
CactusSemi 3:3e8c16b6620c 105 reg_data = reg_data << 4;
CactusSemi 3:3e8c16b6620c 106 temp = get_half_byte(&flag1);
CactusSemi 3:3e8c16b6620c 107 reg_data = (reg_data | temp);
CactusSemi 3:3e8c16b6620c 108 }
CactusSemi 3:3e8c16b6620c 109 if (flag1==0) pc.printf(" \033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40);
CactusSemi 3:3e8c16b6620c 110 }
CactusSemi 3:3e8c16b6620c 111 *(reg_addr[count]) = reg_data;
CactusSemi 3:3e8c16b6620c 112
CactusSemi 3:3e8c16b6620c 113 print_nvm_reg( max_Vout, max_Vout_trim, high_time, low_time, adc_samp_rate,
CactusSemi 3:3e8c16b6620c 114 adc_range, adc_time_out, comp_offset, range_trim, PMOS_off, Driver2, Driver3,
CactusSemi 3:3e8c16b6620c 115 DMOS, CCM_threshold, DMOS_ctrl_trim, adc_op_mode);
CactusSemi 3:3e8c16b6620c 116
CactusSemi 3:3e8c16b6620c 117 pc.printf("\n\n \r\tDo you want to make more changes? (y/n) : ");
CactusSemi 3:3e8c16b6620c 118 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 119 } //end of edit while loop
CactusSemi 3:3e8c16b6620c 120 }
CactusSemi 3:3e8c16b6620c 121
CactusSemi 3:3e8c16b6620c 122 void i2c_write_fn(I2C *i2c_obj, char ptr, char write_data) {
CactusSemi 3:3e8c16b6620c 123 int flag1;
CactusSemi 3:3e8c16b6620c 124 wait_us(10);
CactusSemi 3:3e8c16b6620c 125 (*i2c_obj).start();
CactusSemi 3:3e8c16b6620c 126 flag1 = (*i2c_obj).write(dev_addr);
CactusSemi 3:3e8c16b6620c 127 if (flag1 != 1) pc.printf("\n\n\r\tNo Ack for dev addr :(");
CactusSemi 3:3e8c16b6620c 128 flag1 = (*i2c_obj).write(ptr);
CactusSemi 3:3e8c16b6620c 129 if (flag1 != 1) pc.printf("\n\n\r\tNo Ack reg pointer :(");
CactusSemi 3:3e8c16b6620c 130 flag1 = (*i2c_obj).write(write_data);
CactusSemi 3:3e8c16b6620c 131 if (flag1 != 1) pc.printf("\n\n\r\tNo Ack data :(");
CactusSemi 3:3e8c16b6620c 132 wait_us(5);
CactusSemi 3:3e8c16b6620c 133 (*i2c_obj).stop();
CactusSemi 3:3e8c16b6620c 134 }
CactusSemi 3:3e8c16b6620c 135
CactusSemi 3:3e8c16b6620c 136 char i2c_read_fn(I2C *i2c_obj, char ptr) {
CactusSemi 3:3e8c16b6620c 137 int flag1;
CactusSemi 3:3e8c16b6620c 138 char read_data;
CactusSemi 3:3e8c16b6620c 139 wait_us(10);
CactusSemi 3:3e8c16b6620c 140 (*i2c_obj).start();
CactusSemi 3:3e8c16b6620c 141 flag1 = (*i2c_obj).write(dev_addr);
CactusSemi 3:3e8c16b6620c 142 if (flag1 != 1) pc.printf("\n\n\n\r\tNo Ack for dev addr :(");
CactusSemi 3:3e8c16b6620c 143 flag1 = (*i2c_obj).write(ptr);
CactusSemi 3:3e8c16b6620c 144 if (flag1 != 1) pc.printf("\n\n\r\tNo Ack reg pointer :(");
CactusSemi 3:3e8c16b6620c 145 (*i2c_obj).stop();
CactusSemi 3:3e8c16b6620c 146 wait_us(10);
CactusSemi 3:3e8c16b6620c 147 (*i2c_obj).start();
CactusSemi 3:3e8c16b6620c 148 flag1 = (*i2c_obj).write(dev_addr | 0x01); //lsb 1 for read
CactusSemi 3:3e8c16b6620c 149 if (flag1 != 1) pc.printf("\n\n\r\tNo Ack for dev addr :(");
CactusSemi 3:3e8c16b6620c 150 read_data = (*i2c_obj).read(0); //0- donot send ack after read is done
CactusSemi 3:3e8c16b6620c 151 wait_us(5);
CactusSemi 3:3e8c16b6620c 152 (*i2c_obj).stop();
CactusSemi 3:3e8c16b6620c 153 wait_us(120);
CactusSemi 3:3e8c16b6620c 154 return read_data;
CactusSemi 3:3e8c16b6620c 155 }
CactusSemi 3:3e8c16b6620c 156
CactusSemi 3:3e8c16b6620c 157 uint64_t EasyFuse_read(I2C *i2c_obj) {
CactusSemi 3:3e8c16b6620c 158 char reg_ptr = 0x00;
CactusSemi 3:3e8c16b6620c 159 char reg_data[10];
CactusSemi 3:3e8c16b6620c 160 char data;
CactusSemi 3:3e8c16b6620c 161 uint8_t NVM_READ = 0x70 ;
CactusSemi 3:3e8c16b6620c 162 uint8_t NVM_CTLR_ADR = 0x0a ; //Register address for NVM CTRL
CactusSemi 3:3e8c16b6620c 163 uint64_t NVM_data = 0x0000000000000000;
CactusSemi 3:3e8c16b6620c 164
CactusSemi 3:3e8c16b6620c 165 //Variables to store read data
CactusSemi 3:3e8c16b6620c 166 uint8_t max_Vout;
CactusSemi 3:3e8c16b6620c 167 uint8_t max_Vout_trim;
CactusSemi 3:3e8c16b6620c 168 uint8_t high_time;
CactusSemi 3:3e8c16b6620c 169 uint8_t low_time;
CactusSemi 3:3e8c16b6620c 170 uint8_t adc_samp_rate;
CactusSemi 3:3e8c16b6620c 171 uint8_t adc_range;
CactusSemi 3:3e8c16b6620c 172 uint8_t adc_time_out;
CactusSemi 3:3e8c16b6620c 173 uint8_t comp_offset;
CactusSemi 3:3e8c16b6620c 174 uint8_t range_trim;
CactusSemi 3:3e8c16b6620c 175 uint8_t PMOS_off;
CactusSemi 3:3e8c16b6620c 176 uint8_t Driver2;
CactusSemi 3:3e8c16b6620c 177 uint8_t Driver3;
CactusSemi 3:3e8c16b6620c 178 uint8_t DMOS;
CactusSemi 3:3e8c16b6620c 179 uint8_t CCM_threshold;
CactusSemi 3:3e8c16b6620c 180 uint8_t DMOS_ctrl_trim;
CactusSemi 3:3e8c16b6620c 181 uint8_t adc_op_mode;
CactusSemi 3:3e8c16b6620c 182
CactusSemi 3:3e8c16b6620c 183 int i;
CactusSemi 3:3e8c16b6620c 184 char temp;
CactusSemi 3:3e8c16b6620c 185
CactusSemi 3:3e8c16b6620c 186 pc.printf("\n\n\n\r\t");
CactusSemi 3:3e8c16b6620c 187 for ( i = 0; i<60; i++) pc.printf("\304");
CactusSemi 3:3e8c16b6620c 188 pc.printf("\n\n\n\r\tPerforming an NVM read and loading the contents to the register");
CactusSemi 3:3e8c16b6620c 189 pc.printf("\n\n\r\tSwitching to faster clock before reading the NVM");
CactusSemi 3:3e8c16b6620c 190 i2c_write_fn(i2c_obj,0x02,0x01); //switching to faster clock for NVM read
CactusSemi 3:3e8c16b6620c 191 i2c_write_fn(i2c_obj,0x03,0x01); //switching to faster clock for NVM read
CactusSemi 3:3e8c16b6620c 192 wait_ms(1);
CactusSemi 3:3e8c16b6620c 193 i2c_write_fn(i2c_obj,NVM_CTLR_ADR,NVM_READ); //Perform a complete read; will be sucessful only if NVM is not empty
CactusSemi 3:3e8c16b6620c 194 wait_ms(100);
CactusSemi 3:3e8c16b6620c 195
CactusSemi 3:3e8c16b6620c 196 //check if tm_nvm_read bit has cleared itself
CactusSemi 3:3e8c16b6620c 197 temp = 0;
CactusSemi 3:3e8c16b6620c 198 while (temp == 0){
CactusSemi 3:3e8c16b6620c 199 data = i2c_read_fn(i2c_obj,NVM_CTLR_ADR);
CactusSemi 3:3e8c16b6620c 200 data = data & 0x40;
CactusSemi 3:3e8c16b6620c 201 if (data == 0x00) {
CactusSemi 3:3e8c16b6620c 202 pc.printf("\n\n\r\ttm_nvm_read has cleared; so loading Register with NVM complete");
CactusSemi 3:3e8c16b6620c 203 temp = 1;
CactusSemi 3:3e8c16b6620c 204 }
CactusSemi 3:3e8c16b6620c 205 else wait_ms(100);
CactusSemi 3:3e8c16b6620c 206 }
CactusSemi 3:3e8c16b6620c 207
CactusSemi 3:3e8c16b6620c 208 pc.printf("\n\n\n\r\tReading register 0x00 to 0x09");
CactusSemi 3:3e8c16b6620c 209 for( reg_ptr = 0x00; reg_ptr <= 0x09; reg_ptr = reg_ptr+1) {
CactusSemi 3:3e8c16b6620c 210 reg_data[reg_ptr] = i2c_read_fn(i2c_obj,reg_ptr);
CactusSemi 3:3e8c16b6620c 211 }
CactusSemi 3:3e8c16b6620c 212
CactusSemi 3:3e8c16b6620c 213 //Storing read data into variables
CactusSemi 3:3e8c16b6620c 214 max_Vout = reg_data[0] & 0x0f;
CactusSemi 3:3e8c16b6620c 215 max_Vout_trim = reg_data[1] & 0x1f;
CactusSemi 3:3e8c16b6620c 216 high_time = reg_data[2] & 0x7f;
CactusSemi 3:3e8c16b6620c 217 low_time = reg_data[3] & 0x7f;
CactusSemi 3:3e8c16b6620c 218 adc_samp_rate = reg_data[4]>>4;
CactusSemi 3:3e8c16b6620c 219 adc_range = (reg_data[4]>>2) & 0x03;
CactusSemi 3:3e8c16b6620c 220 adc_time_out = reg_data[4] & 0x03;
CactusSemi 3:3e8c16b6620c 221 comp_offset = reg_data[5] & 0x1f;
CactusSemi 3:3e8c16b6620c 222 range_trim = reg_data[6] & 0x1f;
CactusSemi 3:3e8c16b6620c 223 PMOS_off = reg_data[7] & 0x0f;
CactusSemi 3:3e8c16b6620c 224 Driver2 = reg_data[8] & 0x0f;
CactusSemi 3:3e8c16b6620c 225 Driver3 = (reg_data[8]>>4) & 0x0f;
CactusSemi 3:3e8c16b6620c 226 DMOS = (reg_data[9]>>7) & 0x01;
CactusSemi 3:3e8c16b6620c 227 CCM_threshold = (reg_data[7]>>4) & 0x0f;
CactusSemi 3:3e8c16b6620c 228 DMOS_ctrl_trim = reg_data[9] & 0x1f;
CactusSemi 3:3e8c16b6620c 229 adc_op_mode = (reg_data[5]>>7) & 0x01;
CactusSemi 3:3e8c16b6620c 230
CactusSemi 3:3e8c16b6620c 231 pc.printf("\n\n\r\tFollowing data was read from the Register");
CactusSemi 3:3e8c16b6620c 232
CactusSemi 3:3e8c16b6620c 233 print_nvm_reg(&max_Vout, &max_Vout_trim, &high_time, &low_time, &adc_samp_rate,
CactusSemi 3:3e8c16b6620c 234 &adc_range, &adc_time_out, &comp_offset, &range_trim, &PMOS_off, &Driver2, &Driver3,
CactusSemi 3:3e8c16b6620c 235 &DMOS, &CCM_threshold, &DMOS_ctrl_trim, &adc_op_mode);
CactusSemi 3:3e8c16b6620c 236
CactusSemi 3:3e8c16b6620c 237 //push data into NVM_data
CactusSemi 3:3e8c16b6620c 238 NVM_data = NVM_data | (max_Vout+1); //max_Vout(register) = max_Vout(NVM) - 1
CactusSemi 3:3e8c16b6620c 239 NVM_data = (NVM_data<<5) | max_Vout_trim;
CactusSemi 3:3e8c16b6620c 240 NVM_data = (NVM_data<<7) | high_time; // <<x : x corresponds to no. of bits
CactusSemi 3:3e8c16b6620c 241 NVM_data = (NVM_data<<7) | low_time;
CactusSemi 3:3e8c16b6620c 242 NVM_data = (NVM_data<<4) | adc_samp_rate;
CactusSemi 3:3e8c16b6620c 243 NVM_data = (NVM_data<<2) | adc_range;
CactusSemi 3:3e8c16b6620c 244 NVM_data = (NVM_data<<2) | adc_time_out;
CactusSemi 3:3e8c16b6620c 245 NVM_data = (NVM_data<<5) | comp_offset;
CactusSemi 3:3e8c16b6620c 246 NVM_data = (NVM_data<<5) | range_trim;
CactusSemi 3:3e8c16b6620c 247 NVM_data = (NVM_data<<4) | PMOS_off;
CactusSemi 3:3e8c16b6620c 248 NVM_data = (NVM_data<<4) | Driver2;
CactusSemi 3:3e8c16b6620c 249 NVM_data = (NVM_data<<4) | Driver3;
CactusSemi 3:3e8c16b6620c 250 NVM_data = (NVM_data<<1) | DMOS;
CactusSemi 3:3e8c16b6620c 251 NVM_data = (NVM_data<<4) | CCM_threshold;
CactusSemi 3:3e8c16b6620c 252 NVM_data = (NVM_data<<5) | DMOS_ctrl_trim;
CactusSemi 3:3e8c16b6620c 253 NVM_data = (NVM_data<<1) | adc_op_mode;
CactusSemi 3:3e8c16b6620c 254
CactusSemi 3:3e8c16b6620c 255 pc.printf("\n\n\n\r\tReconstructed data read from NVM = 0x%016llX",NVM_data);
CactusSemi 3:3e8c16b6620c 256 return NVM_data;
CactusSemi 3:3e8c16b6620c 257 }
CactusSemi 3:3e8c16b6620c 258
CactusSemi 3:3e8c16b6620c 259
CactusSemi 3:3e8c16b6620c 260 void EasyFuse_prog() {
CactusSemi 3:3e8c16b6620c 261 uint64_t NVM_data = 0x0000000000000000;
CactusSemi 3:3e8c16b6620c 262 uint64_t NVM_read_data;
CactusSemi 3:3e8c16b6620c 263
CactusSemi 3:3e8c16b6620c 264 // Register variables
CactusSemi 3:3e8c16b6620c 265 uint8_t max_Vout = 0x07;
CactusSemi 3:3e8c16b6620c 266 uint8_t max_Vout_trim = 0x00;
CactusSemi 3:3e8c16b6620c 267 uint8_t high_time = 0x12;
CactusSemi 3:3e8c16b6620c 268 uint8_t low_time = 0x29;
CactusSemi 3:3e8c16b6620c 269 uint8_t adc_samp_rate = 0x06;
CactusSemi 3:3e8c16b6620c 270 uint8_t adc_range = 0x01;
CactusSemi 3:3e8c16b6620c 271 uint8_t adc_time_out = 0x02;
CactusSemi 3:3e8c16b6620c 272 uint8_t comp_offset = 0x00;
CactusSemi 3:3e8c16b6620c 273 uint8_t range_trim = 0x0f;
CactusSemi 3:3e8c16b6620c 274 uint8_t PMOS_off = 0x08;
CactusSemi 3:3e8c16b6620c 275 uint8_t Driver2 = 0x08;
CactusSemi 3:3e8c16b6620c 276 uint8_t Driver3 = 0x08;
CactusSemi 3:3e8c16b6620c 277 uint8_t DMOS = 0x01;
CactusSemi 3:3e8c16b6620c 278 uint8_t CCM_threshold = 0x0f;
CactusSemi 3:3e8c16b6620c 279 uint8_t DMOS_ctrl_trim = 0x0c;
CactusSemi 3:3e8c16b6620c 280 uint8_t adc_op_mode = 0x01;
CactusSemi 3:3e8c16b6620c 281
CactusSemi 3:3e8c16b6620c 282 // NVM Register Control Bit locations; PWR_ON set in all the definitions
CactusSemi 3:3e8c16b6620c 283 uint8_t NVM_RESET = 0x31 ;
CactusSemi 3:3e8c16b6620c 284 uint8_t NVM_PWE1 = 0x02 ;
CactusSemi 3:3e8c16b6620c 285 uint8_t NVM_CLK1 = 0x34 ;
CactusSemi 3:3e8c16b6620c 286 uint8_t NVM_PWR_ON = 0x30 ;
CactusSemi 3:3e8c16b6620c 287 uint8_t NVM_READ = 0x70 ;
CactusSemi 3:3e8c16b6620c 288
CactusSemi 3:3e8c16b6620c 289 uint8_t NVM_CTLR_ADR = 0x0a ; //Register address for NVM CTRL
CactusSemi 3:3e8c16b6620c 290
CactusSemi 3:3e8c16b6620c 291 char reg_data = 0xaa;
CactusSemi 3:3e8c16b6620c 292 char temp;
CactusSemi 3:3e8c16b6620c 293 char high_time_prog = 0x04;
CactusSemi 3:3e8c16b6620c 294 char low_time_prog = 0x04;
CactusSemi 3:3e8c16b6620c 295 int flag1 = 0;
CactusSemi 3:3e8c16b6620c 296 int i = 0;
CactusSemi 3:3e8c16b6620c 297
CactusSemi 3:3e8c16b6620c 298 int delay1 = 20;
CactusSemi 3:3e8c16b6620c 299 int delay2 = 2 * delay1;
CactusSemi 3:3e8c16b6620c 300
CactusSemi 3:3e8c16b6620c 301 I2C i2c(p9,p10);
CactusSemi 3:3e8c16b6620c 302 i2c.frequency((frequ/2)*1000);
CactusSemi 3:3e8c16b6620c 303 LPC_PINCON->PINMODE_OD0 = (LPC_PINCON->PINMODE_OD0 | 0x0003); // To make p9 & P10 open_drain
CactusSemi 3:3e8c16b6620c 304 i2c.stop(); //add a stop after hot-read
CactusSemi 3:3e8c16b6620c 305
CactusSemi 3:3e8c16b6620c 306 pc.printf("\n\n\r\tFollowing are the default register data that will be programmed: \n\r ");
CactusSemi 3:3e8c16b6620c 307 print_nvm_reg(&max_Vout, &max_Vout_trim, &high_time, &low_time, &adc_samp_rate,
CactusSemi 3:3e8c16b6620c 308 &adc_range, &adc_time_out, &comp_offset, &range_trim, &PMOS_off, &Driver2, &Driver3,
CactusSemi 3:3e8c16b6620c 309 &DMOS, &CCM_threshold, &DMOS_ctrl_trim, &adc_op_mode);
CactusSemi 3:3e8c16b6620c 310
CactusSemi 3:3e8c16b6620c 311 edit_nvm_reg(&max_Vout, &max_Vout_trim, &high_time, &low_time, &adc_samp_rate,
CactusSemi 3:3e8c16b6620c 312 &adc_range, &adc_time_out, &comp_offset, &range_trim, &PMOS_off, &Driver2, &Driver3,
CactusSemi 3:3e8c16b6620c 313 &DMOS, &CCM_threshold, &DMOS_ctrl_trim, &adc_op_mode);
CactusSemi 3:3e8c16b6620c 314
CactusSemi 3:3e8c16b6620c 315 //push data into NVM_data
CactusSemi 3:3e8c16b6620c 316 NVM_data = NVM_data | (max_Vout+1); //max_Vout(register) = max_Vout(NVM) - 1
CactusSemi 3:3e8c16b6620c 317 NVM_data = (NVM_data<<5) | max_Vout_trim;
CactusSemi 3:3e8c16b6620c 318 NVM_data = (NVM_data<<7) | high_time; // <<x : x corresponds to no. of bits
CactusSemi 3:3e8c16b6620c 319 NVM_data = (NVM_data<<7) | low_time;
CactusSemi 3:3e8c16b6620c 320 NVM_data = (NVM_data<<4) | adc_samp_rate;
CactusSemi 3:3e8c16b6620c 321 NVM_data = (NVM_data<<2) | adc_range;
CactusSemi 3:3e8c16b6620c 322 NVM_data = (NVM_data<<2) | adc_time_out;
CactusSemi 3:3e8c16b6620c 323 NVM_data = (NVM_data<<5) | comp_offset;
CactusSemi 3:3e8c16b6620c 324 NVM_data = (NVM_data<<5) | range_trim;
CactusSemi 3:3e8c16b6620c 325 NVM_data = (NVM_data<<4) | PMOS_off;
CactusSemi 3:3e8c16b6620c 326 NVM_data = (NVM_data<<4) | Driver2;
CactusSemi 3:3e8c16b6620c 327 NVM_data = (NVM_data<<4) | Driver3;
CactusSemi 3:3e8c16b6620c 328 NVM_data = (NVM_data<<1) | DMOS;
CactusSemi 3:3e8c16b6620c 329 NVM_data = (NVM_data<<4) | CCM_threshold;
CactusSemi 3:3e8c16b6620c 330 NVM_data = (NVM_data<<5) | DMOS_ctrl_trim;
CactusSemi 3:3e8c16b6620c 331 NVM_data = (NVM_data<<1) | adc_op_mode;
CactusSemi 3:3e8c16b6620c 332 pc.printf("\n\n\n\r\tData to be written into NVM = 0x%016llX",NVM_data);
CactusSemi 3:3e8c16b6620c 333 pc.printf("\n\n\r\tPlease note that max_Vout has been incremented. max_Vout(NVM) = max_Vout(register) + 1");
CactusSemi 3:3e8c16b6620c 334 pc.printf("\n\n\r\t");
CactusSemi 3:3e8c16b6620c 335 for ( i = 0; i<80; i++) pc.printf("\304");
CactusSemi 3:3e8c16b6620c 336 pc.printf("\n\n\r\tContinue EasyFuse Programming? (y/n): ");
CactusSemi 3:3e8c16b6620c 337 temp = 0;
CactusSemi 3:3e8c16b6620c 338 while ( temp!='y' && temp!='n') {
CactusSemi 3:3e8c16b6620c 339 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 340 }
CactusSemi 3:3e8c16b6620c 341 if (temp == 'n') {
CactusSemi 3:3e8c16b6620c 342 pc.printf("\n\n\r\tAborting... :(");
CactusSemi 3:3e8c16b6620c 343 return;
CactusSemi 3:3e8c16b6620c 344 }
CactusSemi 3:3e8c16b6620c 345 //EasyFuse Empty check
CactusSemi 3:3e8c16b6620c 346 pc.printf("\n\n\r\tPerforming NVM Empty check by trying to load register with NVM contents");
CactusSemi 3:3e8c16b6620c 347 i2c_write_fn(&i2c,0x02,0x01); //switching to faster clock for NVM read
CactusSemi 3:3e8c16b6620c 348 i2c_write_fn(&i2c,0x03,0x01); //switching to faster clock for NVM read
CactusSemi 3:3e8c16b6620c 349 wait_ms(1);
CactusSemi 3:3e8c16b6620c 350 i2c_write_fn(&i2c,NVM_CTLR_ADR,NVM_READ); //Perform a complete read; will be sucessful only if NVM is not empty
CactusSemi 3:3e8c16b6620c 351 wait_ms(100);
CactusSemi 3:3e8c16b6620c 352
CactusSemi 3:3e8c16b6620c 353 //check if tm_nvm_read bit has cleared itself
CactusSemi 3:3e8c16b6620c 354 temp = 0;
CactusSemi 3:3e8c16b6620c 355 while (temp == 0){
CactusSemi 3:3e8c16b6620c 356 reg_data = i2c_read_fn(&i2c,NVM_CTLR_ADR);
CactusSemi 3:3e8c16b6620c 357 reg_data = reg_data & 0x40;
CactusSemi 3:3e8c16b6620c 358 if (reg_data == 0x00) {
CactusSemi 3:3e8c16b6620c 359 pc.printf("\n\n\r\ttm_nvm_read has cleared; so loading Register with NVM complete");
CactusSemi 3:3e8c16b6620c 360 temp = 1;
CactusSemi 3:3e8c16b6620c 361 }
CactusSemi 3:3e8c16b6620c 362 else wait_ms(100);
CactusSemi 3:3e8c16b6620c 363 }
CactusSemi 3:3e8c16b6620c 364
CactusSemi 3:3e8c16b6620c 365 reg_data = i2c_read_fn(&i2c,0x02);
CactusSemi 3:3e8c16b6620c 366 reg_data = reg_data<<4;
CactusSemi 3:3e8c16b6620c 367 reg_data = reg_data | i2c_read_fn(&i2c,0x03);
CactusSemi 3:3e8c16b6620c 368 if (reg_data == 0xff) pc.printf(" |\033[%dm Register read might not be sucessfull \033[%dm ",45,40);
CactusSemi 3:3e8c16b6620c 369 if (reg_data == 0x11) pc.printf("\n\n\r\t\033[%dm EasyFuse empty \033[%dm",44,40); //no change at address 0x02 & 0x03
CactusSemi 3:3e8c16b6620c 370 else {
CactusSemi 3:3e8c16b6620c 371 pc.printf("\n\n\r\t\033[%dm EasyFuse not empty \033[%dm",45,40);
CactusSemi 3:3e8c16b6620c 372 pc.printf("\n\n\r\t Better to abort the test.. :(");
CactusSemi 3:3e8c16b6620c 373 //return;
CactusSemi 3:3e8c16b6620c 374 }
CactusSemi 3:3e8c16b6620c 375
CactusSemi 3:3e8c16b6620c 376 //added for debug.. delete later
CactusSemi 3:3e8c16b6620c 377 pc.printf("\n\n\n\r\tWe will next configure the oscillator. Proceed? (y/n): ");
CactusSemi 3:3e8c16b6620c 378 temp = 0;
CactusSemi 3:3e8c16b6620c 379 while ( temp!='y' && temp!='n') {
CactusSemi 3:3e8c16b6620c 380 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 381 }
CactusSemi 3:3e8c16b6620c 382 if (temp == 'n') {
CactusSemi 3:3e8c16b6620c 383 pc.printf("\n\n\r\tAborting.. :(");
CactusSemi 3:3e8c16b6620c 384 return;
CactusSemi 3:3e8c16b6620c 385 }
CactusSemi 3:3e8c16b6620c 386 pc.printf("\n\n\r\tEnabled 'fc_enable' & driver1. Monitor the oscillator at the output of comparator");
CactusSemi 3:3e8c16b6620c 387 i2c_write_fn(&i2c,0x0c,0x22);
CactusSemi 3:3e8c16b6620c 388 osc_trim:
CactusSemi 3:3e8c16b6620c 389 i2c_write_fn(&i2c,0x02,high_time_prog); //Recommended clocks period
CactusSemi 3:3e8c16b6620c 390 i2c_write_fn(&i2c,0x03,low_time_prog); // for programming is 10us
CactusSemi 3:3e8c16b6620c 391 wait_ms(1);
CactusSemi 3:3e8c16b6620c 392
CactusSemi 3:3e8c16b6620c 393 pc.printf("\n\n\n\r\t\033[%dm", 44);//change backround to blue
CactusSemi 3:3e8c16b6620c 394 pc.printf("Please check if Oscillator period is approx 10us (9.4us to 10.4us) \033[%dm\n\n\r\tPress 'y' to continue; Press 'm' to modify clock trim settings : ",40);
CactusSemi 3:3e8c16b6620c 395
CactusSemi 3:3e8c16b6620c 396 temp = 0;
CactusSemi 3:3e8c16b6620c 397 while ( temp!='y' && temp!='m' && temp!='m' ) {
CactusSemi 3:3e8c16b6620c 398 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 399 }
CactusSemi 3:3e8c16b6620c 400 if (temp == 'n') {
CactusSemi 3:3e8c16b6620c 401 pc.printf("\n\n\r\tAborting.. :(");
CactusSemi 3:3e8c16b6620c 402 return;
CactusSemi 3:3e8c16b6620c 403 }
CactusSemi 3:3e8c16b6620c 404 if (temp == 'm') {
CactusSemi 3:3e8c16b6620c 405 pc.printf("\n\n\n\n\r\tCurrent high_time trim = 0x%2.2X & low_time trim = 0x%2.2X",high_time_prog,low_time_prog);
CactusSemi 3:3e8c16b6620c 406 flag1 = 0;
CactusSemi 3:3e8c16b6620c 407 while (!flag1) {
CactusSemi 3:3e8c16b6620c 408 pc.printf("\n\n\r\tEnter new high_time trim in hex (00 to ff): 0x");
CactusSemi 3:3e8c16b6620c 409 high_time_prog = get_byte(&flag1);
CactusSemi 3:3e8c16b6620c 410 if (flag1 == 0) pc.printf(" \033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40);
CactusSemi 3:3e8c16b6620c 411 }
CactusSemi 3:3e8c16b6620c 412 flag1 = 0;
CactusSemi 3:3e8c16b6620c 413 while (!flag1) {
CactusSemi 3:3e8c16b6620c 414 pc.printf("\n\n\r\tEnter new low_time trim in hex (00 to ff) : 0x");
CactusSemi 3:3e8c16b6620c 415 low_time_prog = get_byte(&flag1);
CactusSemi 3:3e8c16b6620c 416 if (flag1 == 0) pc.printf(" \033[%dm Invalid Chracter!! No worries, let us try again \033[%dm",41,40);
CactusSemi 3:3e8c16b6620c 417 }
CactusSemi 3:3e8c16b6620c 418 pc.printf("\n\n\r\tProgramming new high_time trim = 0x%2.2X & new low_time trim = 0x%2.2X",high_time_prog,low_time_prog);
CactusSemi 3:3e8c16b6620c 419 goto osc_trim;
CactusSemi 3:3e8c16b6620c 420 }
CactusSemi 3:3e8c16b6620c 421
CactusSemi 3:3e8c16b6620c 422 pc.printf("\n\n\r\tDisabled 'fc_enable' & driver1.");
CactusSemi 3:3e8c16b6620c 423 i2c_write_fn(&i2c,0x0c,0x00);
CactusSemi 3:3e8c16b6620c 424 wait_ms(delay2);
CactusSemi 3:3e8c16b6620c 425 pc.printf("\n\n\n\r\tAll set to program the EasyFuse, time to blow up some ploy fuses! ..**BOOOM**\n\n\r");
CactusSemi 3:3e8c16b6620c 426 i2c_write_fn(&i2c,NVM_CTLR_ADR,NVM_PWR_ON); //turn ON supply to EasyFuse
CactusSemi 3:3e8c16b6620c 427 wait_ms(100);
CactusSemi 3:3e8c16b6620c 428 i2c_write_fn(&i2c,NVM_CTLR_ADR,NVM_RESET); //turn ON supply to EasyFuse & RESETN = 1
CactusSemi 3:3e8c16b6620c 429 wait_ms(1);
CactusSemi 3:3e8c16b6620c 430 i2c_write_fn(&i2c,NVM_CTLR_ADR,NVM_PWR_ON); //RESETN = 0, Prog mode enabled: CKL1 = 0 during RESETN = 0,
CactusSemi 3:3e8c16b6620c 431 temp = 0;
CactusSemi 3:3e8c16b6620c 432 pc.printf("\n\n\n\r\tConnect PROG to 5V and press 'c' to continue");
CactusSemi 3:3e8c16b6620c 433 while ( temp!='c') {
CactusSemi 3:3e8c16b6620c 434 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 435 }
CactusSemi 3:3e8c16b6620c 436 wait_us(delay2);
CactusSemi 3:3e8c16b6620c 437 i2c_write_fn(&i2c,NVM_CTLR_ADR,NVM_RESET); //RESETN = 1,
CactusSemi 3:3e8c16b6620c 438 wait_us(delay2);
CactusSemi 3:3e8c16b6620c 439 for ( i = 0; i < 64; i = i+1) {
CactusSemi 3:3e8c16b6620c 440 temp = NVM_RESET + (((NVM_data>>i) & 0x01)?(NVM_PWE1):0); //NVM_PWE1 if NVM_data[i]=1 & CLK1 de-asserted
CactusSemi 3:3e8c16b6620c 441 i2c_write_fn(&i2c,NVM_CTLR_ADR,temp);
CactusSemi 3:3e8c16b6620c 442 wait_us(delay2);
CactusSemi 3:3e8c16b6620c 443 temp = NVM_RESET;
CactusSemi 3:3e8c16b6620c 444 i2c_write_fn(&i2c,NVM_CTLR_ADR,temp); //de-assert NVM_PWE1
CactusSemi 3:3e8c16b6620c 445 wait_us(delay2);
CactusSemi 3:3e8c16b6620c 446 temp = NVM_RESET + NVM_CLK1;
CactusSemi 3:3e8c16b6620c 447 i2c_write_fn(&i2c,NVM_CTLR_ADR,temp); //assert CLK1
CactusSemi 3:3e8c16b6620c 448 wait_us(delay2);
CactusSemi 3:3e8c16b6620c 449 }
CactusSemi 3:3e8c16b6620c 450 pc.printf("\n\n\n\r\t\a\033[%dm", 44);//change backround to blue
CactusSemi 3:3e8c16b6620c 451 pc.printf("Finished programming. Let us confirm if the NVM has been programmed correctly by reading the NVM. Proceed (y/n): ");
CactusSemi 3:3e8c16b6620c 452 pc.printf("\033[%dm", 40);//change backround to black
CactusSemi 3:3e8c16b6620c 453
CactusSemi 3:3e8c16b6620c 454 temp = 0;
CactusSemi 3:3e8c16b6620c 455 while ( temp!='y' ) {
CactusSemi 3:3e8c16b6620c 456 temp = pc.getc();
CactusSemi 3:3e8c16b6620c 457 }
CactusSemi 3:3e8c16b6620c 458 NVM_read_data = EasyFuse_read(&i2c);
CactusSemi 3:3e8c16b6620c 459 if ( NVM_data == NVM_read_data ) pc.printf("\n\n\r\tData written into NVM matches data read from NVM\n\n\n\r\t\033[%dm NVM PROGRAMMING SUCESSFULL. Hoorayyy!\a \033[%dm\n\r",44,40);
CactusSemi 3:3e8c16b6620c 460 else pc.printf("\n\n\r\tuh-oh.. Data written into NVM does not match data read from NVM\n\n\n\r\t\033[%dm NVM PROGRAMMING FAILED!\a \033[%dm\n\r",41,40);
CactusSemi 3:3e8c16b6620c 461 }