Beispiel #1
0
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();
}
Beispiel #2
0
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);
  }