diff Discovery/Src/data_exchange_main.c @ 209:2de856965c55

Merged in Ideenmodellierer/ostc4/ImprovmentSPI (pull request #9) ImprovmentSPI
author heinrichsweikamp <bitbucket@heinrichsweikamp.com>
date Sun, 24 Mar 2019 22:09:37 +0000
parents 9fc06e1e0f66
children f0069f002c55
line wrap: on
line diff
--- a/Discovery/Src/data_exchange_main.c	Fri Mar 22 08:15:30 2019 +0000
+++ b/Discovery/Src/data_exchange_main.c	Sun Mar 24 22:09:37 2019 +0000
@@ -145,8 +145,8 @@
 	memset((void *)&dataOut, 0, sizeof(SDataReceiveFromMaster));
 
 	dataOut.header.checkCode[0] = 0xBB;
-	dataOut.header.checkCode[1] = 0x01;
-	dataOut.header.checkCode[2] = 0x01;
+	dataOut.header.checkCode[1] = SPI_RX_STATE_OK;
+	dataOut.header.checkCode[2] = SPI_RX_STATE_OK;
 	dataOut.header.checkCode[3] = 0xBB;
 
 	dataOut.footer.checkCode[0] = 0xF4;
@@ -258,42 +258,76 @@
 
 uint8_t DataEX_call(void)
 {
+	static uint32_t RTEOfflineCnt = 0;
+	static uint8_t SusppressCom = 0;
+
 	uint8_t SPI_DMA_answer = 0;
 
-	HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET);
-
-	if(data_old__lost_connection_to_slave_counter_temp >= 3)
+	if(SusppressCom)
 	{
-		data_old__lost_connection_to_slave_counter_temp = 0;
-		if((DataEX_check_header_and_footer_shifted()) && (data_old__lost_connection_to_slave_counter_retry == 0))
-		{
-			HAL_SPI_Abort_IT(&cpu2DmaSpi);
-		}
-		/* reset of own DMA does not work ==> request reset of slave dma */
-		if((DataEX_check_header_and_footer_shifted()) && (data_old__lost_connection_to_slave_counter_retry == 2))
-		{
-			dataOut.header.checkCode[SPI_HEADER_INDEX_SLAVE] = 0xA5;
-		}
-		data_old__lost_connection_to_slave_counter_retry++;
+		SusppressCom--;
 	}
-#if USE_OLD_SYNC_METHOD
-	/* one cycle with NotChipSelect true to clear slave spi buffer */
 	else
 	{
-		HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET);
-	}
-#endif
+		if(data_old__lost_connection_to_slave_counter_temp >= 2) /* error reaction is triggered whenever communication could not be reestablishen within two cycles */
+		{
+			data_old__lost_connection_to_slave_counter_temp = 0;
+			if(DataEX_check_header_and_footer_shifted())
+			{
+				if(RTEOfflineCnt > 1)		/* RTE restarted communication after a longer silent time => restart error handling to recover */
+				{
+					data_old__lost_connection_to_slave_counter_retry = 0;
+					RTEOfflineCnt = 0;
+				}
 
-	DataEx_call_helper_requests();
+				/* We received shifted data. Step one. Reset DMA to see if the problem is located at main */
+				if (data_old__lost_connection_to_slave_counter_retry == 0)
+				{
+					HAL_SPI_Abort_IT(&cpu2DmaSpi);
+				}
+				/* reset of own DMA does not work ==> request reset of slave dma by indicating shifted receiption */
+				if (data_old__lost_connection_to_slave_counter_retry == 1)
+				{
+					dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_SHIFTED;
+				}
+
+				/* stop communication with RTE to trigger RTE timeout reaction */
+				if (data_old__lost_connection_to_slave_counter_retry == 2)
+				{
+					SusppressCom = 3;
+				}
 
-//HAL_GPIO_WritePin(OSCILLOSCOPE2_GPIO_PORT,OSCILLOSCOPE2_PIN,GPIO_PIN_RESET); /* only for testing with Oscilloscope */
-
+				data_old__lost_connection_to_slave_counter_retry++;
+			}
+			else
+			{
+				RTEOfflineCnt++;	/* based on footer status the RTE does not seem to provide data in time */
+				dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OFFLINE;
+			}
+		}
+	#if USE_OLD_SYNC_METHOD
+		/* one cycle with NotChipSelect true to clear slave spi buffer */
+		else
+		{
+			HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET);
+		}
+	#endif
 
-	SPI_DMA_answer = HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)&dataOut, (uint8_t *)&dataIn, EXCHANGE_BUFFERSIZE);
-	if(SPI_DMA_answer != HAL_OK)
-	{
-		DataEX_Error_Handler(SPI_DMA_answer);
-	}		
+		DataEx_call_helper_requests();
+
+	//HAL_GPIO_WritePin(OSCILLOSCOPE2_GPIO_PORT,OSCILLOSCOPE2_PIN,GPIO_PIN_RESET); /* only for testing with Oscilloscope */
+
+		if(SusppressCom == 0)
+		{
+			HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_RESET);
+
+			SPI_DMA_answer = HAL_SPI_TransmitReceive_DMA(&cpu2DmaSpi, (uint8_t *)&dataOut, (uint8_t *)&dataIn, EXCHANGE_BUFFERSIZE);
+			if(SPI_DMA_answer != HAL_OK)
+			{
+				DataEX_Error_Handler(SPI_DMA_answer);
+			}
+		}
+	}
 //	HAL_GPIO_WritePin(SMALLCPU_CSB_GPIO_PORT,SMALLCPU_CSB_PIN,GPIO_PIN_SET);
 //HAL_Delay(3);
 //HAL_GPIO_WritePin(OSCILLOSCOPE2_GPIO_PORT,OSCILLOSCOPE2_PIN,GPIO_PIN_SET); /* only for testing with Oscilloscope */
@@ -311,7 +345,6 @@
 	return &dataIn;
 }
 
-
 void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
 {
 	if(hspi == &cpu2DmaSpi)
@@ -671,6 +704,7 @@
 			data_old__lost_connection_to_slave_counter_retry = 0;
 			data_old__lost_connection_to_slave_counter_temp = 0;
 			stateRealGetPointerWrite()->data_old__lost_connection_to_slave = 0;
+			dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK;
 		}
 		else
 		{
@@ -757,6 +791,7 @@
 			data_old__lost_connection_to_slave_counter_temp = 0;
 			data_old__lost_connection_to_slave_counter_retry = 0;
 			pStateReal->data_old__lost_connection_to_slave = 0;
+			dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK;
 		}
 		else
 		{
@@ -771,12 +806,9 @@
 		data_old__lost_connection_to_slave_counter_temp = 0;
 		data_old__lost_connection_to_slave_counter_retry = 0;
 		pStateReal->data_old__lost_connection_to_slave = 0;
+		dataOut.header.checkCode[SPI_HEADER_INDEX_RX_STATE] = SPI_RX_STATE_OK;
 	}
 	
-	/* update SPI communication tokens */
-	dataOut.header.checkCode[SPI_HEADER_INDEX_SLAVE] = dataIn.header.checkCode[SPI_HEADER_INDEX_SLAVE];
-	dataOut.header.checkCode[SPI_HEADER_INDEX_MASTER] = (dataOut.header.checkCode[SPI_HEADER_INDEX_MASTER] + 1) & 0x7F;
-
 	if(getDeviceDataAfterStartOfMainCPU)
 	{
 		getDeviceDataAfterStartOfMainCPU--;