april1818 发表于 2017-11-22 01:38:18

L476 SPI从设备 中断接收 始终收到0

L476作为下位机 需要与上位机通过一定协议进行通讯。。但是现在L476 始终接收到的是0 通过示波器看 片选 时钟信号 都有
我借助STMCubeMX生成的项目 时钟信号是默认的 没有改过,因为要使用中断接收 事先在STMCubeMX里选中了SPI2 enable。。为了测试 我的代码很简单:while(1)前调用HAL_SPI_Receive_IT(), while(1)为空,在it.c 文件里的void SPI2_IRQHandler(void)添加了 HAL_SPI_Receive_IT(&hspi2,(uint8_t *)aRxBuffer, 1) ,以下是我的main.c。 请各位大神帮我看一下 我的问题出在哪里 我对中断不是很了解 还请指正<blockquote>#include "main.h"

发表于 2017-11-22 01:38:19

楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以试着用SPI发送数据,看一下SPI模块工作是否正常。

wenyangzeng 发表于 2017-11-22 10:04:01

从设备接收的时钟是由主设备提供的。

aidenZL 发表于 2017-11-22 16:35:03

把中断去掉,用直接收发的方式试下,先保证你的SPI是通的

april1818 发表于 2017-11-22 18:23:59

安 发表于 2017-11-22 09:02
楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以 ...

我打开了SPI的NVIC的,我贴了代码出来 不知道为什么没显示。。下面是生成的代码   HAL_NVIC_EnableIRQ(SPI2_IRQn)是我自己加的 生成的里面没有。。我debug了一下 进入一次HAL_SPI_Receive_IT以后 就进入死循环 没办法进入下一次接收了
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure the main internal regulator output voltage
    */
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure the Systick interrupt time
    */
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI2_IRQn);
}

april1818 发表于 2017-11-22 18:24:25

安 发表于 2017-11-22 09:02
楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以 ...

我打开了SPI的NVIC的,我贴了代码出来 不知道为什么没显示。。下面是生成的代码   HAL_NVIC_EnableIRQ(SPI2_IRQn)是我自己加的 生成的里面没有。。我debug了一下 进入一次HAL_SPI_Receive_IT以后 就进入死循环 没办法进入下一次接收了
void SystemClock_Config(void)
{

RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Initializes the CPU, AHB and APB busses clocks
    */
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure the main internal regulator output voltage
    */
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
    _Error_Handler(__FILE__, __LINE__);
}

    /**Configure the Systick interrupt time
    */
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(SPI2_IRQn);
}

april1818 发表于 2017-11-22 18:27:25

wenyangzeng 发表于 2017-11-22 10:04
从设备接收的时钟是由主设备提供的。

恩恩 我主设备提供了时钟信号 示波器能看到正确的时钟信号。。而且在时钟信号有的时候 MOSI MISO也能看到高电平,就是收到的数据是0 我debug了 发现pData一直是0 没有数据读进去

april1818 发表于 2017-11-22 18:55:05

aidenZL 发表于 2017-11-22 16:35
把中断去掉,用直接收发的方式试下,先保证你的SPI是通的

您的意思是 用Timeout的那个方法么 。。我试了一下 在main里面写了 还是不行。。debug以后进入一次Receive函数 就出不来了
if(HAL_SPI_Receive(&hspi2,(uint8_t *)aRxBuffer, 1,3000)!=HAL_OK)
                                    {
                                      /* Transfer error in transmission process */
                             Error_Handler();
                                    }

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}

wenyangzeng 发表于 2017-11-22 18:57:55

april1818 发表于 2017-11-22 18:55
您的意思是 用Timeout的那个方法么 。。我试了一下 在main里面写了 还是不行。。debug以后进入一次Receiv ...

我的意思是在写FLASH时段禁止所有中断发生

发表于 2017-11-23 08:37:04

应该不会,receive的时候有个超时判断,超过这个时间就会退出,中断配置的时候记得写一些优先级。debug的时候看一下SPI结构体的各个参数,报的是什么错误,是不是中断没有清除接收标志位导致的。
页: [1] 2
查看完整版本: L476 SPI从设备 中断接收 始终收到0