# HG changeset patch # User Ideenmodellierer # Date 1550596845 -3600 # Node ID 6ae8ba5683d6908cc5fe050fe8fe34c6bea963ff # Parent 5df4f1a315cbe526424cc9a4af64860e32a11acd Introduces abort of communication in case of a out of sync DMA transfer diff -r 5df4f1a315cb -r 6ae8ba5683d6 Small_CPU/Src/spi.c --- a/Small_CPU/Src/spi.c Tue Feb 19 18:18:37 2019 +0100 +++ b/Small_CPU/Src/spi.c Tue Feb 19 18:20:45 2019 +0100 @@ -270,27 +270,30 @@ } void SPI_synchronize_with_Master(void) { -// GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitTypeDef GPIO_InitStruct; // -// __GPIOA_CLK_ENABLE(); -// /**SPI1 GPIO Configuration -// PA5 ------> SPI1_SCK -// */ -// GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5; -// GPIO_InitStruct.Mode = GPIO_MODE_INPUT; -// GPIO_InitStruct.Pull = GPIO_PULLUP; -// GPIO_InitStruct.Speed = GPIO_SPEED_LOW; -// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +#if 0 + __GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + */ + GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // -// HAL_Delay(10); -// while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == 0); -// HAL_Delay(10); -// while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 1); -// HAL_Delay(20); + HAL_Delay(10); + while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == 0); + HAL_Delay(10); + while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 1); + HAL_Delay(20); +#endif } void SPI_Start_single_TxRx_with_Master(void) { uint8_t * pOutput; + HAL_StatusTypeDef retval; if (global.dataSendToSlave.getDeviceDataNow) { global.dataSendToSlave.getDeviceDataNow = 0; @@ -298,17 +301,16 @@ } else { pOutput = (uint8_t*) &(global.dataSendToMaster); } - - if (HAL_SPI_TransmitReceive_DMA(&hspi1, pOutput,(uint8_t*) &(global.dataSendToSlave), EXCHANGE_BUFFERSIZE)!= HAL_OK) { - // Transfer error in transmission process + retval = HAL_SPI_TransmitReceive_DMA(&hspi1, pOutput,(uint8_t*) &(global.dataSendToSlave), EXCHANGE_BUFFERSIZE); + if ( retval!= HAL_OK) { SPI_Error_Handler(); } } void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { /* restart SPI */ - if (hspi == &hspi1) { - + if (hspi == &hspi1) + { global.check_sync_not_running = 0; /* stop data exchange? */ if (global.mode == MODE_SHUTDOWN) { @@ -326,13 +328,12 @@ global.dataSendToSlaveIsNotValidCount = 0; } else { // GPIO_new_DEBUG_LOW(); //For debug. - global.dataSendToSlaveIsValid = 0; - global.dataSendToSlaveIsNotValidCount++; - MX_SPI_DeInit(); - HAL_Delay(30); - MX_DMA_Init(); - MX_SPI1_Init(); - } + global.dataSendToSlaveIsValid = 0; + global.dataSendToSlaveIsNotValidCount++; + HAL_SPI_Abort_IT(&hspi1); + global.dataSendToSlaveIsNotValidCount = 1; + } + } global.dataSendToMaster.power_on_reset = 0; global.deviceDataSendToMaster.power_on_reset = 0; @@ -340,11 +341,13 @@ // if ( !global.dataSendToSlaveStopEval ) { // scheduleSpecial_Evaluate_DataSendToSlave(); // } - scheduleSpecial_Evaluate_DataSendToSlave(); - SPI_Start_single_TxRx_with_Master(); //Send data always. - } + scheduleSpecial_Evaluate_DataSendToSlave(); + + SPI_Start_single_TxRx_with_Master(); //Send data always. } + + static uint8_t SPI_check_header_and_footer_ok(void) { if (global.dataSendToSlave.header.checkCode[0] != 0xBB) return 0;