First Release Demo Application.

Dependencies:   MB85RSxx_SPI SDFileSystem mbed

Fork of SDFile_Logger by APS Lab

Committer:
APS_Lab
Date:
Fri Aug 18 06:59:27 2017 +0000
Revision:
2:39448ebc76ba
Parent:
0:43f8f8860bdc
Child:
3:5c6cef91faf0
Warning Clear

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