void SysTick_Handler(void){ static bool lowBat; // Set when battery voltage drops below VBAT_LOW static uint32_t sysTickCounter; sysTickCounter++; // Used to schedule less frequent tasks switch(system_state){ case STATE_IDLE: // Enable USB if VBUS is disconnected ;bool vBus = Chip_GPIO_GetPinState(LPC_GPIO, 0, VBUS); if(!vBus){ msc_state = MSC_ENABLED; } // If MSC enabled, VBUS is connected, and SD card is ready, try to connect as MSC if (msc_state == MSC_ENABLED && vBus && sd_state == SD_READY){ f_mount(NULL,"",0); // unmount file system if (msc_init() == MSC_OK){ Board_LED_Color(LED_YELLOW); system_state = STATE_MSC; break; }else{ // Error on MSC initialization error(ERROR_MSC_INIT); } } // If user has short pressed PB and SD card is ready, initiate acquisition if (pb_shortPress() && sd_state == SD_READY){ daq_init(); system_state = STATE_DAQ; break; } // Blink LED if in low battery state, otherwise solid green if (lowBat && sysTickCounter % TICKRATE_HZ1 < TICKRATE_HZ1/2){ Board_LED_Color(LED_OFF); } else { Board_LED_Color(LED_GREEN); } break; case STATE_MSC: // If VBUS is disconnected or button is short pressed ;bool pb; if (Chip_GPIO_GetPinState(LPC_GPIO, 0, VBUS) == 0 || (pb = pb_shortPress())){ if(pb){ msc_state = MSC_DISABLED; } msc_stop(); f_mount(fatfs,"",0); // mount file system Board_LED_Color(LED_GREEN); system_state = STATE_IDLE; enterIdleTime = Chip_RTC_GetCount(LPC_RTC); } break; case STATE_DAQ: // Perform the current asynchronous daq action daq_loop(); // If user has short pressed PB to stop acquisition if (pb_shortPress()){ Board_LED_Color(LED_PURPLE); daq_stop(); Board_LED_Color(LED_GREEN); system_state = STATE_IDLE; enterIdleTime = Chip_RTC_GetCount(LPC_RTC); msc_state = MSC_DISABLED; } break; } // Initialize SD card after every insertion if (Chip_GPIO_GetPinState(LPC_GPIO, 0, CARD_DETECT)){ // Card out Board_LED_Color(LED_CYAN); sd_state = SD_OUT; }else{ // Card in if (sd_state == SD_OUT){ // Delay 100ms to let connections and power stabilize DWT_Delay(100000); if(init_sd_spi(&cardinfo) != SD_OK) { error(ERROR_SD_INIT); } switch(system_state){ case STATE_IDLE: Board_LED_Color(LED_GREEN); break; case STATE_MSC: Board_LED_Color(LED_YELLOW); break; case STATE_DAQ: Board_LED_Color(LED_RED); break; } sd_state = SD_READY; } } /* Run once per second */ if(sysTickCounter % TICKRATE_HZ1 == 0){ float vBat = read_vBat(10); lowBat = vBat < VBAT_LOW ? true : false; // Set low battery state if (vBat < VBAT_SHUTDOWN){ shutdown_message("Low Battery"); } if ((Chip_RTC_GetCount(LPC_RTC) - enterIdleTime > TIMEOUT_SECS && system_state == STATE_IDLE) ){ shutdown_message("Idle Time Out"); } } /* Shut down conditions */ if (pb_longPress()){ shutdown_message("Power Button Pressed"); } /* Handle errors */ error_handler(); }
int main(void) { USBD_API_INIT_PARAM_T usb_param; USB_CORE_DESCS_T desc; USBD_MSC_INIT_PARAM_T msc_param; ErrorCode_t ret = LPC_OK; USB_INTERFACE_DESCRIPTOR* pIntfDesc; SD_ERROR sderr; uint32_t t1,t2,i; /* Initialize board and chip */ Board_Init(); SystemCoreClockUpdate(); DWT_Init(); Board_LED_Set(0, false); Board_LED_Set(1, false); Board_LED_Set(2, false); init_uart(115200); sderr=init_sd_spi(&cardinfo); switch(sderr) { case SD_OK: sprintf(buffer,"\r\n----->Card initialization OK\r\n"); break; case ERROR_GO_IDLE_STATE_TIMEOUT: sprintf(buffer,"Error: ERROR_GO_IDLE_STATE_TIMEOUT\r\n"); break; case ERROR_GO_IDLE_STATE_RESPONSE: sprintf(buffer,"Error: ERROR_GO_IDLE_STATE_RESPONSE:%d\r\n",response[0]); break; case ERROR_SEND_IF_COND_TIMEOUT: sprintf(buffer,"Error: ERROR_SEND_IF_COND_TIMEOUT\r\n"); break; case ERROR_SEND_IF_COND_RESPONSE: sprintf(buffer,"Error: ERROR_SEND_IF_COND_RESPONSE:%02x%02x%02x%02x%02x\r\n",response[0],response[1],response[2],response[3],response[4]); break; case ERROR_READ_OCR_TIMEOUT: sprintf(buffer,"Error: ERROR_READ_OCR_TIMEOUT\r\n"); break; case ERROR_READ_OCR_RESPONSE: sprintf(buffer,"Error: ERROR_READ_OCR_RESPONSE:%02x%02x%02x\r\n",response[0],response[1],response[2]); break; case ERROR_APP_CMD_TIMEOUT: sprintf(buffer,"Error: ERROR_APP_CMD_TIMEOUT\r\n"); break; case ERROR_SD_SEND_OP_COND_TIMEOUT: sprintf(buffer,"Error: ERROR_SD_SEND_OP_COND_TIMEOUT\r\n"); break; case ERROR_INIT_TIMEOUT: sprintf(buffer,"Error: ERROR_INIT_TIMEOUT\r\n"); break; case ERROR_SEND_CID_TIMEOUT: sprintf(buffer,"Error: ERROR_SEND_CID_TIMEOUT\r\n"); break; case ERROR_SEND_CID_TOKEN_TIMEOUT: sprintf(buffer,"Error: ERROR_SEND_CID_TOKEN_TIMEOUT\r\n"); break; case ERROR_SEND_CSD_TIMEOUT: sprintf(buffer,"Error: ERROR_SEND_CSD_TIMEOUT\r\n"); break; case ERROR_SEND_CSD_TOKEN_TIMEOUT: sprintf(buffer,"Error: ERROR_SEND_CSD_TOKEN_TIMEOUT\r\n"); break; } putLineUART(buffer); if(sderr!=SD_OK) { Board_LED_Set(2, true); while(1){}; } putLineUART("\r\n----------CARD INFO------------\r\n"); switch(cardinfo.CardType){ case SD_CARD_STD_CAPACITY_V1_1:sprintf(buffer,"Card Type: SD Card v1.1\r\n");break; case SD_CARD_STD_CAPACITY_V2_0:sprintf(buffer,"Card Type: SD Card v2.0\r\n");break; case SD_CARD_HIGH_CAPACITY:sprintf(buffer,"Card Type: SDHC Card\r\n");break; case MULTIMEDIA_CARD:sprintf(buffer,"Card Type: MMC Card\r\n");break; } putLineUART(buffer); sprintf(buffer,"ManufacturerID:%d",cardinfo.SD_cid.ManufacturerID); putLineUART(buffer); sprintf(buffer,"\r\nOEM_AppliID:%c%c",cardinfo.SD_cid.OEM_AppliID>>8,cardinfo.SD_cid.OEM_AppliID&0x00FF); putLineUART(buffer); sprintf(buffer,"\r\nProdName:%c%c%c%c%c",cardinfo.SD_cid.ProdName1>>24,(cardinfo.SD_cid.ProdName1&0x00FF0000)>>16, (cardinfo.SD_cid.ProdName1&0x0000FF00)>>8,cardinfo.SD_cid.ProdName1&0x000000FF,cardinfo.SD_cid.ProdName2); putLineUART(buffer); if(cardinfo.CardType==MULTIMEDIA_CARD) { sprintf(buffer,"%c",cardinfo.SD_cid.Reserved1); putLineUART(buffer); } sprintf(buffer,"\r\nProdRev:%d.%d",cardinfo.SD_cid.ProdRev>>4,cardinfo.SD_cid.ProdRev&0x0F); putLineUART(buffer); sprintf(buffer,"\r\nProdSN:0x%08X",cardinfo.SD_cid.ProdSN); putLineUART(buffer); if(cardinfo.CardType==MULTIMEDIA_CARD) { sprintf(buffer,"\r\nManufactDate:%04d-%02d",(cardinfo.SD_cid.ManufactDate>>4)+1997,cardinfo.SD_cid.ManufactDate&0x000F); }