First Release Demo Application.
Dependencies: MB85RSxx_SPI SDFileSystem mbed
Fork of SDFile_Logger by
main.cpp@3:5c6cef91faf0, 2017-08-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |