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"
楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以试着用SPI发送数据,看一下SPI模块工作是否正常。 从设备接收的时钟是由主设备提供的。 把中断去掉,用直接收发的方式试下,先保证你的SPI是通的 安 发表于 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);
} 安 发表于 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);
} wenyangzeng 发表于 2017-11-22 10:04
从设备接收的时钟是由主设备提供的。
恩恩 我主设备提供了时钟信号 示波器能看到正确的时钟信号。。而且在时钟信号有的时候 MOSI MISO也能看到高电平,就是收到的数据是0 我debug了 发现pData一直是0 没有数据读进去 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 */
} april1818 发表于 2017-11-22 18:55
您的意思是 用Timeout的那个方法么 。。我试了一下 在main里面写了 还是不行。。debug以后进入一次Receiv ...
我的意思是在写FLASH时段禁止所有中断发生 应该不会,receive的时候有个超时判断,超过这个时间就会退出,中断配置的时候记得写一些优先级。debug的时候看一下SPI结构体的各个参数,报的是什么错误,是不是中断没有清除接收标志位导致的。
页:
[1]
2