NM500 Lib

Committer:
Nasungil
Date:
Thu May 18 02:13:53 2017 +0000
Revision:
1:5cdfdb2e5691
Parent:
0:fadd3703a42c
Child:
2:52da04ab1c78
0.01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nasungil 0:fadd3703a42c 1 #include "NM500.h"
Nasungil 0:fadd3703a42c 2 #include "mbed.h"
Nasungil 1:5cdfdb2e5691 3 #include "SDFileSystem.h"
Nasungil 0:fadd3703a42c 4
Nasungil 1:5cdfdb2e5691 5 SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CS, "sd"); // the pinout on the mbed Cool Components workshop board
Nasungil 0:fadd3703a42c 6
Nasungil 0:fadd3703a42c 7 SPI NM500(SPI_MOSI, SPI_MISO, SPI_SCK);
Nasungil 0:fadd3703a42c 8
Nasungil 1:5cdfdb2e5691 9 FILE *fp=NULL;
Nasungil 0:fadd3703a42c 10
Nasungil 0:fadd3703a42c 11
Nasungil 0:fadd3703a42c 12 DigitalOut BC_CS(D10);
Nasungil 0:fadd3703a42c 13 DigitalOut Flash(D8);
Nasungil 1:5cdfdb2e5691 14 DigitalOut SDCard_CS(D6);
Nasungil 0:fadd3703a42c 15
Nasungil 0:fadd3703a42c 16
Nasungil 0:fadd3703a42c 17 Serial test(SERIAL_TX, SERIAL_RX);
Nasungil 0:fadd3703a42c 18
Nasungil 0:fadd3703a42c 19
Nasungil 0:fadd3703a42c 20 // NM500 init
Nasungil 0:fadd3703a42c 21 int begin()
Nasungil 0:fadd3703a42c 22 {
Nasungil 1:5cdfdb2e5691 23 BC_CS = HIGH;
Nasungil 1:5cdfdb2e5691 24 Flash = HIGH;
Nasungil 1:5cdfdb2e5691 25
Nasungil 0:fadd3703a42c 26 NM500.format(8,0);
Nasungil 0:fadd3703a42c 27 NM500.frequency(1000000);
Nasungil 0:fadd3703a42c 28
Nasungil 1:5cdfdb2e5691 29
Nasungil 0:fadd3703a42c 30 wait(0.2);
Nasungil 0:fadd3703a42c 31
Nasungil 0:fadd3703a42c 32 BC_CS = LOW;
Nasungil 0:fadd3703a42c 33 Flash = LOW;
Nasungil 0:fadd3703a42c 34 wait(0.2);
Nasungil 0:fadd3703a42c 35
Nasungil 0:fadd3703a42c 36 BC_CS = HIGH;
Nasungil 0:fadd3703a42c 37 Flash = HIGH;
Nasungil 0:fadd3703a42c 38
Nasungil 0:fadd3703a42c 39 wait(0.2);
Nasungil 1:5cdfdb2e5691 40 mkdir("/sd", 0777);
Nasungil 1:5cdfdb2e5691 41 fp = fopen("/sd/data.txt", "w");
Nasungil 1:5cdfdb2e5691 42
Nasungil 1:5cdfdb2e5691 43 if(fp == NULL)
Nasungil 1:5cdfdb2e5691 44 {
Nasungil 1:5cdfdb2e5691 45 error("Could not open file for write\n");
Nasungil 1:5cdfdb2e5691 46 }
Nasungil 1:5cdfdb2e5691 47 fclose(fp);
Nasungil 0:fadd3703a42c 48
Nasungil 1:5cdfdb2e5691 49 return clearNeurons(); //neruon init()
Nasungil 0:fadd3703a42c 50 }
Nasungil 0:fadd3703a42c 51
Nasungil 0:fadd3703a42c 52 //neruon data
Nasungil 0:fadd3703a42c 53 void getNeuronsInfo(int* neuronSize, int* neuronsAvailable, int* neuronsCommitted)
Nasungil 0:fadd3703a42c 54 {
Nasungil 0:fadd3703a42c 55 *neuronSize=NEURONSIZE;
Nasungil 0:fadd3703a42c 56 *neuronsAvailable=MAXNEURONS;
Nasungil 0:fadd3703a42c 57 *neuronsCommitted= read(NM_NCOUNT);
Nasungil 0:fadd3703a42c 58 }
Nasungil 0:fadd3703a42c 59 //forget
Nasungil 0:fadd3703a42c 60 void forget()
Nasungil 0:fadd3703a42c 61 {
Nasungil 0:fadd3703a42c 62 write(NM_FORGET, 0);
Nasungil 0:fadd3703a42c 63 }
Nasungil 0:fadd3703a42c 64 int clearNeurons()
Nasungil 0:fadd3703a42c 65 {
Nasungil 0:fadd3703a42c 66 int TempNSR=read(NM_NSR);
Nasungil 0:fadd3703a42c 67 write(NM_FORGET,0);
Nasungil 0:fadd3703a42c 68 write(NM_NSR, 16);
Nasungil 0:fadd3703a42c 69 for (int i=0; i< NEURONSIZE; i++) write(NM_TESTCOMP,0);
Nasungil 0:fadd3703a42c 70 write(NM_NSR, TempNSR);
Nasungil 0:fadd3703a42c 71 if((read(NM_MINIF)==2))
Nasungil 0:fadd3703a42c 72 return(0); //clear ok
Nasungil 0:fadd3703a42c 73 else
Nasungil 0:fadd3703a42c 74 return(1); //clear error
Nasungil 0:fadd3703a42c 75 }
Nasungil 0:fadd3703a42c 76 int learn(unsigned char vector[], int length, int category)
Nasungil 0:fadd3703a42c 77 {
Nasungil 0:fadd3703a42c 78 broadcast(vector, length);
Nasungil 0:fadd3703a42c 79 write(NM_CAT,category);
Nasungil 0:fadd3703a42c 80 return(read(NM_NCOUNT));
Nasungil 0:fadd3703a42c 81 }
Nasungil 0:fadd3703a42c 82 /*
Nasungil 0:fadd3703a42c 83 int classify(unsigned char vector[], int length, int K, int distance[], int category[], int nid[])
Nasungil 0:fadd3703a42c 84 {
Nasungil 0:fadd3703a42c 85 int recoNbr=0;
Nasungil 0:fadd3703a42c 86 broadcast(vector, length);
Nasungil 0:fadd3703a42c 87 for (int i=0; i<K; i++) {
Nasungil 0:fadd3703a42c 88 distance[i] = read(NM_DIST);
Nasungil 0:fadd3703a42c 89 if (distance[i]==0xFFFF) {
Nasungil 0:fadd3703a42c 90 category[i]=0xFFFF;
Nasungil 0:fadd3703a42c 91 nid[i]=0xFFFF;
Nasungil 0:fadd3703a42c 92 } else {
Nasungil 0:fadd3703a42c 93 recoNbr++;
Nasungil 0:fadd3703a42c 94 category[i]= read(NM_CAT) & 0x7FFF; //Degenerated bit15 is masked
Nasungil 0:fadd3703a42c 95 nid[i] = read(NM_NID);
Nasungil 0:fadd3703a42c 96 }
Nasungil 0:fadd3703a42c 97 }
Nasungil 0:fadd3703a42c 98 return(recoNbr);
Nasungil 0:fadd3703a42c 99 }
Nasungil 0:fadd3703a42c 100 */
Nasungil 0:fadd3703a42c 101 int classify(unsigned char vector[], int length, int* distance, int* category, int* nid)
Nasungil 0:fadd3703a42c 102 {
Nasungil 0:fadd3703a42c 103 broadcast(vector, length);
Nasungil 0:fadd3703a42c 104 *distance = read(NM_DIST);
Nasungil 0:fadd3703a42c 105 *category = read(NM_CAT) & 0x7FFF; //Degenerated bit15 is masked
Nasungil 0:fadd3703a42c 106 *nid = read(NM_NID);
Nasungil 0:fadd3703a42c 107 return(read(NM_NSR));
Nasungil 0:fadd3703a42c 108 }
Nasungil 0:fadd3703a42c 109 void setContext(int context, int minif, int maxif)
Nasungil 0:fadd3703a42c 110 {
Nasungil 0:fadd3703a42c 111 // context[15-8]= unused
Nasungil 0:fadd3703a42c 112 // context[7]= Norm (0 for L1; 1 for LSup)
Nasungil 0:fadd3703a42c 113 // context[6-0]= Active context value
Nasungil 0:fadd3703a42c 114 write(NM_GCR, context);
Nasungil 0:fadd3703a42c 115 write(NM_MINIF, minif);
Nasungil 0:fadd3703a42c 116 write(NM_MAXIF, maxif);
Nasungil 0:fadd3703a42c 117 }
Nasungil 0:fadd3703a42c 118 void getContext(int* context, int* minif, int* maxif)
Nasungil 0:fadd3703a42c 119 {
Nasungil 0:fadd3703a42c 120 // context[15-8]= unused
Nasungil 0:fadd3703a42c 121 // context[7]= Norm (0 for L1; 1 for LSup)
Nasungil 0:fadd3703a42c 122 // context[6-0]= Active context value
Nasungil 0:fadd3703a42c 123 *context = read(NM_GCR);
Nasungil 0:fadd3703a42c 124 *minif = read(NM_MINIF);
Nasungil 0:fadd3703a42c 125 *maxif = read(NM_MAXIF);
Nasungil 0:fadd3703a42c 126 }
Nasungil 0:fadd3703a42c 127 void setRBF()
Nasungil 0:fadd3703a42c 128 {
Nasungil 0:fadd3703a42c 129 int tempNSR=read(NM_NSR);
Nasungil 0:fadd3703a42c 130 write(NM_NSR, tempNSR & 0xDF);
Nasungil 0:fadd3703a42c 131 }
Nasungil 0:fadd3703a42c 132 void setKNN()
Nasungil 0:fadd3703a42c 133 {
Nasungil 0:fadd3703a42c 134 int tempNSR = read(NM_NSR);
Nasungil 0:fadd3703a42c 135 write(NM_NSR, tempNSR | 0x20);
Nasungil 0:fadd3703a42c 136 }
Nasungil 0:fadd3703a42c 137
Nasungil 0:fadd3703a42c 138 //Read the selected neuron data.
Nasungil 0:fadd3703a42c 139 int NCOUNT()
Nasungil 0:fadd3703a42c 140 {
Nasungil 0:fadd3703a42c 141 return(read(NM_NCOUNT));
Nasungil 0:fadd3703a42c 142 }
Nasungil 0:fadd3703a42c 143
Nasungil 0:fadd3703a42c 144
Nasungil 0:fadd3703a42c 145 //write data
Nasungil 0:fadd3703a42c 146 void write(char reg, int data)
Nasungil 0:fadd3703a42c 147 {
Nasungil 0:fadd3703a42c 148 NM500.format(8,0);
Nasungil 0:fadd3703a42c 149 BC_CS = LOW;
Nasungil 0:fadd3703a42c 150 NM500.write(1); //dummy
Nasungil 0:fadd3703a42c 151
Nasungil 0:fadd3703a42c 152 NM500.write(CM1K+0x80);
Nasungil 0:fadd3703a42c 153
Nasungil 0:fadd3703a42c 154 NM500.write(0);
Nasungil 0:fadd3703a42c 155
Nasungil 0:fadd3703a42c 156 NM500.write(0);
Nasungil 0:fadd3703a42c 157
Nasungil 0:fadd3703a42c 158 NM500.write(reg);
Nasungil 0:fadd3703a42c 159
Nasungil 0:fadd3703a42c 160 NM500.write(0);
Nasungil 0:fadd3703a42c 161
Nasungil 0:fadd3703a42c 162 NM500.write(0);
Nasungil 0:fadd3703a42c 163
Nasungil 0:fadd3703a42c 164 NM500.write(1);
Nasungil 0:fadd3703a42c 165
Nasungil 0:fadd3703a42c 166 NM500.write((unsigned char)(data >> 8)); // upper data
Nasungil 0:fadd3703a42c 167
Nasungil 0:fadd3703a42c 168 NM500.write((unsigned char)(data & 0x00FF)); // lower data
Nasungil 0:fadd3703a42c 169
Nasungil 0:fadd3703a42c 170 //for(int i=0;i<10;i++);
Nasungil 0:fadd3703a42c 171 BC_CS = HIGH;
Nasungil 0:fadd3703a42c 172
Nasungil 0:fadd3703a42c 173
Nasungil 0:fadd3703a42c 174 }
Nasungil 0:fadd3703a42c 175
Nasungil 0:fadd3703a42c 176 //read data
Nasungil 0:fadd3703a42c 177 int read(char reg)
Nasungil 0:fadd3703a42c 178 {
Nasungil 0:fadd3703a42c 179 NM500.format(8,0);
Nasungil 0:fadd3703a42c 180 BC_CS = LOW; //BC enable
Nasungil 0:fadd3703a42c 181
Nasungil 0:fadd3703a42c 182 NM500.write(1); //dummy
Nasungil 0:fadd3703a42c 183 NM500.write(CM1K);
Nasungil 0:fadd3703a42c 184 NM500.write(0);
Nasungil 0:fadd3703a42c 185 NM500.write(0);
Nasungil 0:fadd3703a42c 186 NM500.write(reg);
Nasungil 0:fadd3703a42c 187 NM500.write(0);
Nasungil 0:fadd3703a42c 188 NM500.write(0);
Nasungil 0:fadd3703a42c 189 NM500.write(1);
Nasungil 0:fadd3703a42c 190 int data = NM500.write(0); // Send 0 to push upper data out
Nasungil 0:fadd3703a42c 191 data = (data << 8) + NM500.write(0); // Send 0 to push lower data out
Nasungil 0:fadd3703a42c 192 BC_CS = HIGH;
Nasungil 0:fadd3703a42c 193 return(data);
Nasungil 0:fadd3703a42c 194 }
Nasungil 0:fadd3703a42c 195 int broadcast(unsigned char vector[], int length)
Nasungil 0:fadd3703a42c 196 {
Nasungil 0:fadd3703a42c 197 for(int i=0; i<length-1; i++)
Nasungil 0:fadd3703a42c 198 write(NM_COMP,vector[i]);
Nasungil 0:fadd3703a42c 199 write(NM_LCOMP, vector[length-1]);
Nasungil 0:fadd3703a42c 200
Nasungil 0:fadd3703a42c 201 return read(NM_NSR);
Nasungil 0:fadd3703a42c 202 }
Nasungil 0:fadd3703a42c 203
Nasungil 1:5cdfdb2e5691 204 void NeuronToSD()
Nasungil 1:5cdfdb2e5691 205 {
Nasungil 1:5cdfdb2e5691 206 char str[MAX_SIZE];
Nasungil 1:5cdfdb2e5691 207 char neurons[NEURONSIZE];
Nasungil 1:5cdfdb2e5691 208 printf("Insert data:");
Nasungil 1:5cdfdb2e5691 209 scanf("%s",str);
Nasungil 1:5cdfdb2e5691 210 printf("\r\n");
Nasungil 1:5cdfdb2e5691 211 fp = fopen("/sd/data.txt", "w");
Nasungil 1:5cdfdb2e5691 212 fflush(stdin);
Nasungil 1:5cdfdb2e5691 213
Nasungil 1:5cdfdb2e5691 214 //save NSR
Nasungil 1:5cdfdb2e5691 215 int TempNSR = read(NM_NSR);
Nasungil 1:5cdfdb2e5691 216
Nasungil 1:5cdfdb2e5691 217 //read NCOUNT
Nasungil 1:5cdfdb2e5691 218 int nm_cnt = read(NM_NCOUNT);
Nasungil 1:5cdfdb2e5691 219
Nasungil 1:5cdfdb2e5691 220 //write NSR-SR Mode
Nasungil 1:5cdfdb2e5691 221 write(NM_NSR, 0x10);
Nasungil 1:5cdfdb2e5691 222 printf("%d",nm_cnt);
Nasungil 1:5cdfdb2e5691 223
Nasungil 1:5cdfdb2e5691 224 //reset chain
Nasungil 1:5cdfdb2e5691 225 write(NM_RSTCHAIN, 0);
Nasungil 1:5cdfdb2e5691 226
Nasungil 1:5cdfdb2e5691 227
Nasungil 1:5cdfdb2e5691 228
Nasungil 1:5cdfdb2e5691 229
Nasungil 1:5cdfdb2e5691 230 //fprintf(fp,"%s\t", str);
Nasungil 1:5cdfdb2e5691 231
Nasungil 1:5cdfdb2e5691 232
Nasungil 1:5cdfdb2e5691 233 //loop until max neruon
Nasungil 1:5cdfdb2e5691 234 //for(int cnt = 0; cnt<nm_cnt; cnt++){
Nasungil 1:5cdfdb2e5691 235 //read context
Nasungil 0:fadd3703a42c 236 // int context = read(NM_NCR);
Nasungil 1:5cdfdb2e5691 237 // // printf("%d\t,", context);
Nasungil 1:5cdfdb2e5691 238 // fprintf(fp,"%d\t", context);
Nasungil 0:fadd3703a42c 239 //
Nasungil 1:5cdfdb2e5691 240 // //read Neuron data
Nasungil 0:fadd3703a42c 241 // for (int j=0; j<NEURONSIZE; j++){
Nasungil 0:fadd3703a42c 242 // //read COMP
Nasungil 0:fadd3703a42c 243 // neurons[j]=read(NM_COMP);
Nasungil 1:5cdfdb2e5691 244 // fprintf(fp,"%d\t", neurons[j]);
Nasungil 1:5cdfdb2e5691 245 // printf("%d\t,", neurons[j]);
Nasungil 0:fadd3703a42c 246 // }
Nasungil 1:5cdfdb2e5691 247
Nasungil 1:5cdfdb2e5691 248
Nasungil 1:5cdfdb2e5691 249 fclose(fp);
Nasungil 1:5cdfdb2e5691 250 }
Nasungil 1:5cdfdb2e5691 251
Nasungil 1:5cdfdb2e5691 252
Nasungil 1:5cdfdb2e5691 253
Nasungil 1:5cdfdb2e5691 254 void SDToNeurons()
Nasungil 1:5cdfdb2e5691 255 {
Nasungil 1:5cdfdb2e5691 256 char str[MAX_SIZE];
Nasungil 1:5cdfdb2e5691 257
Nasungil 1:5cdfdb2e5691 258 printf("Reading from SD card...\r\n");
Nasungil 1:5cdfdb2e5691 259
Nasungil 1:5cdfdb2e5691 260 fp = fopen("/sd/data.txt", "r");
Nasungil 1:5cdfdb2e5691 261
Nasungil 1:5cdfdb2e5691 262 if (fp != NULL)
Nasungil 1:5cdfdb2e5691 263 {
Nasungil 1:5cdfdb2e5691 264 fgets(str,MAX_SIZE,fp);
Nasungil 1:5cdfdb2e5691 265 printf("%s", str);
Nasungil 1:5cdfdb2e5691 266 printf("\r\n");
Nasungil 1:5cdfdb2e5691 267 fclose(fp);
Nasungil 1:5cdfdb2e5691 268 }
Nasungil 1:5cdfdb2e5691 269 else
Nasungil 1:5cdfdb2e5691 270 {
Nasungil 1:5cdfdb2e5691 271 printf("failed!\n");
Nasungil 1:5cdfdb2e5691 272 }
Nasungil 1:5cdfdb2e5691 273
Nasungil 1:5cdfdb2e5691 274
Nasungil 1:5cdfdb2e5691 275
Nasungil 1:5cdfdb2e5691 276 //
Nasungil 0:fadd3703a42c 277 // char neurons[NEURONSIZE];
Nasungil 0:fadd3703a42c 278 // //save NSR
Nasungil 0:fadd3703a42c 279 // int TempNSR = read(NM_NSR);
Nasungil 0:fadd3703a42c 280 //
Nasungil 0:fadd3703a42c 281 // //read NCOUNT
Nasungil 0:fadd3703a42c 282 // //int nm_cnt = read(NM_NCOUNT);
Nasungil 0:fadd3703a42c 283 //
Nasungil 0:fadd3703a42c 284 //
Nasungil 0:fadd3703a42c 285 // //write NSR-SR Mode
Nasungil 0:fadd3703a42c 286 // write(NM_NSR, 0x10);
Nasungil 0:fadd3703a42c 287 //
Nasungil 0:fadd3703a42c 288 // //reset chain
Nasungil 0:fadd3703a42c 289 // write(NM_RSTCHAIN, 0);
Nasungil 0:fadd3703a42c 290 //
Nasungil 0:fadd3703a42c 291 // //loop until max neruon
Nasungil 0:fadd3703a42c 292 // for(int cnt = 0; cnt<MAXNEURONS;cnt++){
Nasungil 0:fadd3703a42c 293 // //read context
Nasungil 0:fadd3703a42c 294 // int context = read(NM_NCR);
Nasungil 0:fadd3703a42c 295 //
Nasungil 0:fadd3703a42c 296 // test.printf("NCR : %d \t", context);
Nasungil 0:fadd3703a42c 297 // test.printf(" DATA : ");
Nasungil 0:fadd3703a42c 298 // //read neuron data<256
Nasungil 0:fadd3703a42c 299 // for (int j=0; j<NEURONSIZE; j++){
Nasungil 0:fadd3703a42c 300 // //read COMP
Nasungil 0:fadd3703a42c 301 // neurons[j]=read(NM_COMP);
Nasungil 0:fadd3703a42c 302 // test.printf("%d,", neurons[j]);
Nasungil 0:fadd3703a42c 303 // }
Nasungil 0:fadd3703a42c 304 //
Nasungil 0:fadd3703a42c 305 // test.printf(" \t");
Nasungil 0:fadd3703a42c 306 //
Nasungil 0:fadd3703a42c 307 // //read AIF
Nasungil 0:fadd3703a42c 308 // int aif=read(NM_AIF);
Nasungil 0:fadd3703a42c 309 //
Nasungil 0:fadd3703a42c 310 // test.printf("AIF : %d,\t", aif);
Nasungil 0:fadd3703a42c 311 //
Nasungil 0:fadd3703a42c 312 // //raed minif
Nasungil 0:fadd3703a42c 313 // int minif=read(NM_MINIF);
Nasungil 0:fadd3703a42c 314 //
Nasungil 0:fadd3703a42c 315 // test.printf("MINIF : %d,\t", minif);
Nasungil 0:fadd3703a42c 316 //
Nasungil 0:fadd3703a42c 317 // //read cat
Nasungil 0:fadd3703a42c 318 // int cat=read(NM_CAT) & 0x7fff;
Nasungil 0:fadd3703a42c 319 //
Nasungil 0:fadd3703a42c 320 // test.printf("CAT : %d, \t\n", cat);
Nasungil 0:fadd3703a42c 321 //
Nasungil 0:fadd3703a42c 322 // }
Nasungil 1:5cdfdb2e5691 323 }
Nasungil 0:fadd3703a42c 324 void readNeuron(int nid, unsigned char model[], int* context, int* aif, int* category)
Nasungil 0:fadd3703a42c 325 {
Nasungil 0:fadd3703a42c 326 int TempNSR=read(NM_NSR);
Nasungil 0:fadd3703a42c 327 write(NM_NSR, 0x10);
Nasungil 0:fadd3703a42c 328 write(NM_RSTCHAIN, 0);
Nasungil 0:fadd3703a42c 329 if (nid>0)
Nasungil 0:fadd3703a42c 330 {
Nasungil 0:fadd3703a42c 331 // move to index in the chain of neurons
Nasungil 0:fadd3703a42c 332 for (int i=0; i<nid; i++) read(NM_CAT);
Nasungil 0:fadd3703a42c 333 }
Nasungil 0:fadd3703a42c 334 *context=read(NM_NCR);
Nasungil 0:fadd3703a42c 335 for (int j=0; j<NEURONSIZE; j++) model[j]=read(NM_COMP);
Nasungil 0:fadd3703a42c 336 *aif=read(NM_AIF);
Nasungil 0:fadd3703a42c 337 *category=read(NM_CAT);
Nasungil 0:fadd3703a42c 338 *category=*category&0x7fff;
Nasungil 0:fadd3703a42c 339 write(NM_NSR, TempNSR); // set the NN back to its calling status
Nasungil 0:fadd3703a42c 340 }
Nasungil 0:fadd3703a42c 341
Nasungil 0:fadd3703a42c 342
Nasungil 0:fadd3703a42c 343
Nasungil 0:fadd3703a42c 344