/******************************************************************************* * Function Name : MAL_Write * Description : Write sectors * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length) { switch (lun) { case 0: #ifdef USE_STM3210E_EVAL Status = SD_WriteBlock(Memory_Offset, Writebuff, Transfer_Length); if ( Status != SD_OK ) { return MAL_FAIL; } #else MSD_WriteBlock((uint8_t*)Writebuff, Memory_Offset, Transfer_Length); #endif break; #ifdef USE_FSMC_NAND case 1: NAND_Write(Memory_Offset, Writebuff, Transfer_Length); break; #endif default: return MAL_FAIL; } return MAL_OK; }
/******************************************************************************* * Function Name : Write_Memory * Description : Handle the Write operation to the microSD card. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Write_Memory(void) { uint32_t temp = Counter + 64; i = 0; for (; Counter < temp; Counter++) { Data_Buffer[Counter] = Bulk_Data_Buff[i]; i++; } Memory_Offset += Data_Len; Transfer_Length -= Data_Len; if (!(Transfer_Length % 512)) { Counter = 0; MSD_WriteBlock(Data_Buffer, Memory_Offset - 512, 512); } CSW.dDataResidue -= Data_Len; SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ if ((Transfer_Length == 0) || (Bot_State == BOT_CSW_Send)) { Counter = 0; Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); } }
int main(void) { int flag; int i; //only for sd testing extern u8 sd_recv_buf[512]; extern u8 sd_send_buf[512]; u8 ret = 1; // only for sd testing RCC_Configuration(); RTC_Configuration(); GPIO_Configuration(); SPI_Configuration(); NVIC_Configuration(); USART_Configuration(); EXTI_cfg(); //only for sd testing ret = MSD_Init(); ret = MSD_GetMediumCharacteristics(); MSD_EarseBlock(0,Mass_Block_Count); //only for sd testing //system start working GPIO_SetBits(GPIOC,GPIO_Pin_14); //wait for the moment that the device has been fxed into the rocket // for (i=0;i<6*5;i++) {delay();} //delay 10 minutes //self-testing //first, test wireless data transmition Timedisplay=0; while (Timedisplay<10) { USART_SendData(USART3, 'A'); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); if ((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==66)) //except "B" { //static char Responce[]="Wireless data transmition test completed"; for (i=0;i<strlen(Responce);i++) { USART_SendData(USART3, Responce[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } break; } //USART_ClearFlag(USART3, USART_FLAG_RXNE); } if (Timedisplay==10) { GPIO_ResetBits(GPIOC,GPIO_Pin_14); //Write into SD:ERROR in data transmition //only for testing for (i=0;i<strlen(errorDatatransmition);i++) { sd_send_buf[i]=errorDatatransmition[i]; } ret = MSD_WriteBlock(sd_send_buf,0,512); //only for testing return(0); } //waiting for the continue order for (i=0;i<4000;i++); while (1) { if ((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==78)) //except "N" { break; } //USART_ClearFlag(USART3, USART_FLAG_RXNE); } //second,test GPS Timedisplay=0; flag=1; while ((Timedisplay<60*5) && (!((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==71)))) //except "G" { if ((USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET)) { flag=1; USART_SendData(USART3, USART_ReceiveData(USART1)); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } //USART_ClearFlag(USART1, USART_FLAG_RXNE); } if (flag==0) { GPIO_ResetBits(GPIOC,GPIO_Pin_14); for (i=0;i<strlen(errorGPS);i++) { USART_SendData(USART3, errorGPS[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } //Write into SD:ERROR in GPS for (i=0;i<strlen(errorGPS);i++) { sd_send_buf[i]=errorGPS[i]; } ret = MSD_WriteBlock(sd_send_buf,1,512); return(0); } //static char Responce2[]="GPS test completed"; for (i=0;i<strlen(Responce2);i++) { USART_SendData(USART3, Responce2[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } //waiting for the continue order for (i=0;i<4000;i++); while (1) { if ((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==78)) //except "N" { break; } //USART_ClearFlag(USART3, USART_FLAG_RXNE); } //third, test clock USART_SendData(USART3, 'C'); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); Timedisplay=0; flag=0; while ((Timedisplay<20) && (!((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==69)))); //except "E" if ((abs(Timedisplay-10)>2) && (USART_ReceiveData(USART3)==69)) { GPIO_ResetBits(GPIOC,GPIO_Pin_14); for (i=0;i<strlen(errorclock);i++) { USART_SendData(USART3, errorclock[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } //Write into SD:ERROR in timing //only for testing for (i=0;i<strlen(errorclock);i++) { sd_send_buf[i]=errorclock[i]; } ret = MSD_WriteBlock(sd_send_buf,2,512); //only for testing return(0); } //static char Responce3[]="clock test completed"; for (i=0;i<strlen(Responce3);i++) { USART_SendData(USART3, Responce3[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } //static char Responce4[]="ALL test completed,wait for launching signal"; for (i=0;i<strlen(Responce4);i++) { USART_SendData(USART3, Responce4[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } while (!((USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) && (USART_ReceiveData(USART3)==76))); //except for "L" //delay(); //static char Responce5[]="Go! Good Luck!"; for (i=0;i<strlen(Responce5);i++) { USART_SendData(USART3, Responce5[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } /* Enable the USART Receive interrupt: this interrupt is generated when the USART1 receive data register is not empty */ USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); Timedisplay=0; while(1) { if (Timedisplay>=OPEN_Parachute) { GPIO_SetBits(GPIOC,GPIO_Pin_6); //static char Responce6[]="The parachute is open@"; for (i=0;i<strlen(Responce6);i++) { USART_SendData(USART3, Responce6[i]); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } } } return(0); }