|
我用的軟件是STM32CUBUMX,用SPI1做從機(jī),中斷接收數(shù)據(jù),并在中斷中處理數(shù)據(jù),然后通過SPI3(主機(jī))將數(shù)據(jù)發(fā)送出去。問題是用串口看接收到了數(shù)據(jù),用邏輯分析儀連接的主機(jī),檢測(cè)不出數(shù)據(jù),測(cè)試了幾次,覺得問題應(yīng)該出現(xiàn)在中斷中,程序如下:
中斷:
/**
* @brief This function handles SPI1 global interrupt.
*/
void SPI1_IRQHandler(void)
{
/* USER CODE BEGIN SPI1_IRQn 0 */
SpiReceive_RXNE(&hspi1);
/* USER CODE END SPI1_IRQn 0 */
HAL_SPI_IRQHandler(&hspi1);
/* USER CODE BEGIN SPI1_IRQn 1 */
/* USER CODE END SPI1_IRQn 1 */
}
void SpiReceive_RXNE(SPI_HandleTypeDef *hspi)
{
uint32_t temp;
if((__HAL_SPI_GET_FLAG(hspi,SPI_FLAG_RXNE) == RESET))
{
HAL_SPI_DMAStop(&hspi1);
temp = hspi1.hdmarx->Instance->NDTR;
SpiType1.rx_len = receivelen - temp;
SpiType1.rec_flag=1;
HAL_SPI_Receive_DMA(&hspi1,SpiType1.SPI_DMA_rxBuf,receivelen);
}
}
主程序:
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_SPI1_Init();
MX_USART1_UART_Init();
MX_SPI3_Init();
/* USER CODE BEGIN 2 */
HAL_SPI_Receive_DMA(&hspi1,SpiType1.SPI_DMA_rxBuf,receivelen);
__HAL_SPI_ENABLE_IT(&hspi1, SPI_IT_RXNE);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(SpiType1.rec_flag==1)
{
SpiType1.rec_flag=0;
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi3,SpiType1.SPI_DMA_rxBuf,SpiType1.rx_len,1000);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}
/*printf("\n\r %d,%d,%d,%d,%d",SpiType1.SPI_DMA_rxBuf[0],SpiType1.SPI_DMA_rxBuf[1],SpiType1.SPI_DMA_rxBuf[2],SpiType1.SPI_DMA_rxBuf[3],SpiType1.SPI_DMA_rxBuf[4]);
HAL_Delay(500);*/
}
/* USER CODE END 3 */
}
SPI_FLAG_RXNE,它的標(biāo)志位沒有清除,因?yàn)樵趲?kù)函數(shù)中沒有清除這個(gè)標(biāo)志位的函數(shù),百度過,說可以把SPI_FLAG_RXNE改成SPI_FLAG_BSY,改后的數(shù)據(jù)也不對(duì),邏輯分析儀上只能檢測(cè)出一個(gè)數(shù)據(jù),是發(fā)送的最后一個(gè)數(shù)據(jù)。請(qǐng)問有什么辦法可以解決?感謝
|
|