First Release Demo Application.

Dependencies:   MB85RSxx_SPI SDFileSystem mbed

Fork of SDFile_Logger by APS Lab

Committer:
APS_Lab
Date:
Fri Aug 25 03:06:41 2017 +0000
Revision:
3:5c6cef91faf0
Parent:
2:39448ebc76ba
Flag Status??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
APS_Lab 0:43f8f8860bdc 1 #include "mbed.h"
APS_Lab 0:43f8f8860bdc 2 #include "SDFileSystem.h"
APS_Lab 0:43f8f8860bdc 3 #include "MB85RSxx_SPI.h"
APS_Lab 0:43f8f8860bdc 4 #include "pinmap.h"
APS_Lab 0:43f8f8860bdc 5
APS_Lab 0:43f8f8860bdc 6 // FRAM Address
APS_Lab 3:5c6cef91faf0 7 #define POWR_FLAG_ADDR 0x0000
APS_Lab 3:5c6cef91faf0 8 #define SYNC_FLAG_ADDR 0x0008
APS_Lab 3:5c6cef91faf0 9 #define FILE_SYNC_ADDR 0x0010
APS_Lab 0:43f8f8860bdc 10 #define DATA_ADDR 0x0100
APS_Lab 0:43f8f8860bdc 11
APS_Lab 0:43f8f8860bdc 12 // System Status Flag
APS_Lab 0:43f8f8860bdc 13 #define POWER_OK 0xAA
APS_Lab 0:43f8f8860bdc 14 #define POWER_FAIL 0xBB
APS_Lab 0:43f8f8860bdc 15 #define SYNC_OK 0xCC
APS_Lab 0:43f8f8860bdc 16 #define SYNC_FAIL 0xDD
APS_Lab 0:43f8f8860bdc 17
APS_Lab 0:43f8f8860bdc 18 // FileSystem Status
APS_Lab 0:43f8f8860bdc 19 #define FILE_OPEN 0x11
APS_Lab 0:43f8f8860bdc 20 #define FILE_PRE_WRITE 0x22
APS_Lab 0:43f8f8860bdc 21 #define FILE_POST_WRITE 0x33
APS_Lab 0:43f8f8860bdc 22 #define FILE_CLOSE 0x44
APS_Lab 0:43f8f8860bdc 23 #define FILE_SYNC 0x55
APS_Lab 0:43f8f8860bdc 24 #define FILE_READ 0x66 // Unused
APS_Lab 0:43f8f8860bdc 25
APS_Lab 0:43f8f8860bdc 26
APS_Lab 0:43f8f8860bdc 27 //SPI ch1 for SD FileSystem
APS_Lab 0:43f8f8860bdc 28 SDFileSystem sd(D11, D12, D13, D10, "sd", D8, SDFileSystem::SWITCH_NONE, 25000000);
APS_Lab 0:43f8f8860bdc 29 //SPI ch3 for FRAM
APS_Lab 0:43f8f8860bdc 30 // CLK 10MHz MODE 8.0
APS_Lab 0:43f8f8860bdc 31 MB85RSxx_SPI fram(PC_12, PC_11, PC_10, PD_2);
APS_Lab 0:43f8f8860bdc 32
APS_Lab 0:43f8f8860bdc 33 // Application
APS_Lab 0:43f8f8860bdc 34 char buffer[32]; // Write Buffer
APS_Lab 0:43f8f8860bdc 35 char valbuf[20]; // Samplig Data Buffer
APS_Lab 0:43f8f8860bdc 36 AnalogIn analog_value(A0); // Analog Input Port if use
APS_Lab 0:43f8f8860bdc 37 time_t seconds = time(NULL); // Time stamp if use
APS_Lab 0:43f8f8860bdc 38
APS_Lab 3:5c6cef91faf0 39 int addr=POWR_FLAG_ADDR; // for FRAM POWR_FLAG_ADDR
APS_Lab 0:43f8f8860bdc 40
APS_Lab 0:43f8f8860bdc 41 //Serial pc(USBTX, USBRX)
APS_Lab 0:43f8f8860bdc 42 // Printf is output for COM port with 9600bps.
APS_Lab 0:43f8f8860bdc 43 // You can use SerialPC for debug console instead of above it.
APS_Lab 0:43f8f8860bdc 44
APS_Lab 0:43f8f8860bdc 45 // FRAM Pointer Get
APS_Lab 0:43f8f8860bdc 46 int fram_get_addr(void)
APS_Lab 0:43f8f8860bdc 47 {
APS_Lab 0:43f8f8860bdc 48 return addr;
APS_Lab 0:43f8f8860bdc 49 }
APS_Lab 0:43f8f8860bdc 50
APS_Lab 0:43f8f8860bdc 51 // FRAM Pointer Set
APS_Lab 0:43f8f8860bdc 52 void fram_set_addr(int adr)
APS_Lab 0:43f8f8860bdc 53 {
APS_Lab 0:43f8f8860bdc 54 addr=adr;
APS_Lab 0:43f8f8860bdc 55 }
APS_Lab 0:43f8f8860bdc 56
APS_Lab 0:43f8f8860bdc 57 // Status Flag Set
APS_Lab 0:43f8f8860bdc 58 void sys_set_status(int adr, char flg)
APS_Lab 0:43f8f8860bdc 59 {
APS_Lab 0:43f8f8860bdc 60 fram_set_addr(adr);
APS_Lab 0:43f8f8860bdc 61 fram.write(fram_get_addr(), flg);
APS_Lab 0:43f8f8860bdc 62 }
APS_Lab 0:43f8f8860bdc 63
APS_Lab 0:43f8f8860bdc 64 // Status Flag Get
APS_Lab 0:43f8f8860bdc 65 char sys_get_status(int adr)
APS_Lab 0:43f8f8860bdc 66 {
APS_Lab 0:43f8f8860bdc 67 fram_set_addr(adr);
APS_Lab 0:43f8f8860bdc 68 return fram.read(fram_get_addr());
APS_Lab 0:43f8f8860bdc 69 }
APS_Lab 0:43f8f8860bdc 70
APS_Lab 0:43f8f8860bdc 71 // RAW Data save for FRAM, and write SD
APS_Lab 0:43f8f8860bdc 72 void sys_write(FileHandle* file, char *buf, int size)
APS_Lab 0:43f8f8860bdc 73 {
APS_Lab 0:43f8f8860bdc 74 int tmp = fram_get_addr(); // Get Current FRAM Address Pointer
APS_Lab 0:43f8f8860bdc 75 //tmp+=fram_addr; // Set Current FRAM Address Pointer
APS_Lab 0:43f8f8860bdc 76
APS_Lab 0:43f8f8860bdc 77 fram_set_addr(tmp); // Fram Write Address Pointer Set
APS_Lab 3:5c6cef91faf0 78 sys_set_status(FILE_SYNC_ADDR, FILE_PRE_WRITE); // Flag Set for Pre write
APS_Lab 0:43f8f8860bdc 79 fram.write(fram_get_addr(), buf, size); // Save Data
APS_Lab 0:43f8f8860bdc 80 file->write(buf, size); // Write File
APS_Lab 3:5c6cef91faf0 81 sys_set_status(FILE_SYNC_ADDR, FILE_POST_WRITE); // Flag Set for Post write
APS_Lab 0:43f8f8860bdc 82 fram_set_addr(tmp+size); // Save Current FRAM Address Pointer
APS_Lab 0:43f8f8860bdc 83 }
APS_Lab 0:43f8f8860bdc 84
APS_Lab 0:43f8f8860bdc 85 // Application
APS_Lab 0:43f8f8860bdc 86 void write_datas(char *filename)
APS_Lab 0:43f8f8860bdc 87 {
APS_Lab 0:43f8f8860bdc 88 float adc_avr_val=0.0;
APS_Lab 2:39448ebc76ba 89 int cnt1, cnt2;
APS_Lab 0:43f8f8860bdc 90 set_time(1498465898+32400);
APS_Lab 0:43f8f8860bdc 91 memset(buffer, 0, sizeof(buffer));
APS_Lab 0:43f8f8860bdc 92
APS_Lab 3:5c6cef91faf0 93 sys_set_status(SYNC_FLAG_ADDR, SYNC_FAIL); // Set SYNC Flag as Fail
APS_Lab 3:5c6cef91faf0 94 sys_set_status(SYNC_FLAG_ADDR+4, SYNC_OK); // Set Acctual SYNC Flag as OK
APS_Lab 3:5c6cef91faf0 95 sys_set_status(FILE_SYNC_ADDR, FILE_OPEN);
APS_Lab 0:43f8f8860bdc 96 FileHandle* file = sd.open(filename, O_WRONLY | O_CREAT | O_TRUNC);
APS_Lab 0:43f8f8860bdc 97
APS_Lab 0:43f8f8860bdc 98 sprintf(buffer, "{\r\n\"adc log data\":[");
APS_Lab 0:43f8f8860bdc 99
APS_Lab 0:43f8f8860bdc 100 fram_set_addr(DATA_ADDR);
APS_Lab 0:43f8f8860bdc 101 sys_write(file, &buffer[0], 19);
APS_Lab 0:43f8f8860bdc 102
APS_Lab 0:43f8f8860bdc 103 sprintf(&buffer[0], "\"time\":%d ,", seconds);
APS_Lab 0:43f8f8860bdc 104
APS_Lab 0:43f8f8860bdc 105 sys_write(file, &buffer[0], 19);
APS_Lab 0:43f8f8860bdc 106
APS_Lab 0:43f8f8860bdc 107 for(cnt1=0;cnt1 < 100;cnt1++) {
APS_Lab 0:43f8f8860bdc 108 memset(buffer, 0, sizeof(buffer));
APS_Lab 0:43f8f8860bdc 109 sprintf(&buffer[0], "\r\n{\"Samples\":%d ,", cnt1);
APS_Lab 0:43f8f8860bdc 110 sys_write(file, &buffer[0], 18);
APS_Lab 0:43f8f8860bdc 111 for(cnt2=0;cnt2 < 10; cnt2++) {
APS_Lab 0:43f8f8860bdc 112 //adc_avr_val+=analog_value.read();
APS_Lab 0:43f8f8860bdc 113 adc_avr_val+=analog_value.read();
APS_Lab 0:43f8f8860bdc 114 ctime(&seconds);
APS_Lab 0:43f8f8860bdc 115 }
APS_Lab 0:43f8f8860bdc 116 //adc_avr_val=adc_avr_val/10;
APS_Lab 0:43f8f8860bdc 117 //sprintf(&buffer[0], "\"time\":%d ,", seconds);
APS_Lab 0:43f8f8860bdc 118 //file->write(&buffer[0], 19);
APS_Lab 0:43f8f8860bdc 119 sprintf(&valbuf[0], "\"averages\":%.f}", adc_avr_val*3300);
APS_Lab 0:43f8f8860bdc 120 sys_write(file, &valbuf[0], sizeof(valbuf));
APS_Lab 0:43f8f8860bdc 121 if(cnt1 < 99)
APS_Lab 0:43f8f8860bdc 122 {
APS_Lab 0:43f8f8860bdc 123 sprintf(&buffer[0], ",");
APS_Lab 0:43f8f8860bdc 124 sys_write(file, &buffer[0], 1);
APS_Lab 0:43f8f8860bdc 125 memset(valbuf, 0, sizeof(valbuf));
APS_Lab 0:43f8f8860bdc 126
APS_Lab 0:43f8f8860bdc 127 }
APS_Lab 0:43f8f8860bdc 128 else
APS_Lab 0:43f8f8860bdc 129 {
APS_Lab 0:43f8f8860bdc 130 sprintf(&buffer[0], "\n");
APS_Lab 0:43f8f8860bdc 131 sys_write(file, &buffer[0], 1);
APS_Lab 0:43f8f8860bdc 132 }
APS_Lab 0:43f8f8860bdc 133 }
APS_Lab 0:43f8f8860bdc 134 sprintf(&buffer[0], "]}\n");
APS_Lab 0:43f8f8860bdc 135 sys_write(file, &buffer[0],2);
APS_Lab 0:43f8f8860bdc 136
APS_Lab 3:5c6cef91faf0 137 sys_set_status(FILE_SYNC_ADDR, FILE_CLOSE);
APS_Lab 0:43f8f8860bdc 138 file->close();
APS_Lab 3:5c6cef91faf0 139 sys_set_status(FILE_SYNC_ADDR, FILE_SYNC);
APS_Lab 3:5c6cef91faf0 140 sys_set_status(SYNC_FLAG_ADDR, SYNC_OK); // Sync Flag Set as Good
APS_Lab 0:43f8f8860bdc 141
APS_Lab 0:43f8f8860bdc 142 }
APS_Lab 0:43f8f8860bdc 143
APS_Lab 0:43f8f8860bdc 144 void System_Resume(void)
APS_Lab 0:43f8f8860bdc 145 {
APS_Lab 0:43f8f8860bdc 146
APS_Lab 0:43f8f8860bdc 147 }
APS_Lab 0:43f8f8860bdc 148
APS_Lab 0:43f8f8860bdc 149 int main()
APS_Lab 0:43f8f8860bdc 150 {
APS_Lab 0:43f8f8860bdc 151 int num=0, f=1;
APS_Lab 0:43f8f8860bdc 152 char fname[14];
APS_Lab 0:43f8f8860bdc 153 //Configure CRC, large frames, and write validation
APS_Lab 0:43f8f8860bdc 154 sd.crc(true);
APS_Lab 0:43f8f8860bdc 155 sd.large_frames(true);
APS_Lab 0:43f8f8860bdc 156 sd.write_validation(true);
APS_Lab 0:43f8f8860bdc 157
APS_Lab 0:43f8f8860bdc 158 // FRAM Initialize
APS_Lab 0:43f8f8860bdc 159 fram.Init();
APS_Lab 0:43f8f8860bdc 160
APS_Lab 0:43f8f8860bdc 161 //for(int i=0; i < 512; i++)
APS_Lab 0:43f8f8860bdc 162 //{
APS_Lab 0:43f8f8860bdc 163 // fram.write(i, 0x00, 1);
APS_Lab 0:43f8f8860bdc 164 //}
APS_Lab 0:43f8f8860bdc 165
APS_Lab 3:5c6cef91faf0 166 sys_set_status(POWR_FLAG_ADDR+4, POWER_OK); // Current Power Status
APS_Lab 0:43f8f8860bdc 167 //fram_set_powerflag(0);
APS_Lab 0:43f8f8860bdc 168
APS_Lab 0:43f8f8860bdc 169 // Check FRAM Power Status
APS_Lab 3:5c6cef91faf0 170 if(sys_get_status(POWR_FLAG_ADDR) == POWER_FAIL) {
APS_Lab 0:43f8f8860bdc 171 printf("Power Down Occured!\n");
APS_Lab 0:43f8f8860bdc 172
APS_Lab 0:43f8f8860bdc 173 // Power Down Recovery
APS_Lab 0:43f8f8860bdc 174 System_Resume();
APS_Lab 0:43f8f8860bdc 175
APS_Lab 0:43f8f8860bdc 176 } else {
APS_Lab 0:43f8f8860bdc 177 printf("No Trouble Found for Power.\n");
APS_Lab 0:43f8f8860bdc 178 // FRAM Address Set
APS_Lab 0:43f8f8860bdc 179 //fram_set_addr(0);
APS_Lab 0:43f8f8860bdc 180 }
APS_Lab 0:43f8f8860bdc 181
APS_Lab 3:5c6cef91faf0 182 sys_set_status(POWR_FLAG_ADDR, POWER_FAIL); //Set Flag as Power Fail
APS_Lab 0:43f8f8860bdc 183 printf("Log Start!\n");
APS_Lab 0:43f8f8860bdc 184 while(f) {
APS_Lab 0:43f8f8860bdc 185 sprintf(fname, "d_log%03d.json", num);
APS_Lab 0:43f8f8860bdc 186 //Try to mount the SD card
APS_Lab 0:43f8f8860bdc 187 //printf("\nMounting SD card...");
APS_Lab 0:43f8f8860bdc 188 if (sd.mount() != 0) {
APS_Lab 0:43f8f8860bdc 189 printf("SD Mount failed!\n");
APS_Lab 0:43f8f8860bdc 190 continue;
APS_Lab 0:43f8f8860bdc 191 }
APS_Lab 0:43f8f8860bdc 192
APS_Lab 0:43f8f8860bdc 193 printf("log %d : start!\n", num);
APS_Lab 0:43f8f8860bdc 194 //Start Logging
APS_Lab 0:43f8f8860bdc 195 write_datas(fname);
APS_Lab 0:43f8f8860bdc 196 //printf("log %d : success!\n", num);
APS_Lab 0:43f8f8860bdc 197
APS_Lab 0:43f8f8860bdc 198 if(num > 32) f=0;
APS_Lab 0:43f8f8860bdc 199 else num++;
APS_Lab 0:43f8f8860bdc 200 }
APS_Lab 3:5c6cef91faf0 201 sys_set_status(POWR_FLAG_ADDR, POWER_OK); //Set Flag as Power OK
APS_Lab 0:43f8f8860bdc 202 printf("Log Done!\n");
APS_Lab 0:43f8f8860bdc 203 }