你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
april1818 提问时间:2017-11-22 01:38 /
悬赏15ST金币已解决
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。 请各位大神帮我看一下 我的问题出在哪里 我对中断不是很了解 还请指正
  1. <blockquote>#include "main.h"
复制代码

最佳答案

查看完整内容

楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以试着用SPI发送数据,看一下SPI模块工作是否正常。
收藏 评论10 发布时间:2017-11-22 01:38

举报

10个回答
废鱼 回答时间:2017-11-22 01:38:19
楼主,是否配置了SPI的NVIC中断?在STMCubeMX配置的时候,可以选择开启中断。如果不能确定SPI的问题,可以试着用SPI发送数据,看一下SPI模块工作是否正常。
wenyangzeng 回答时间:2017-11-22 10:04:01
从设备接收的时钟是由主设备提供的。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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结构体的各个参数,报的是什么错误,是不是中断没有清除接收标志位导致的。
april1818 回答时间:2017-11-28 19:45:23
安 发表于 2017-11-23 08:37
应该不会,receive的时候有个超时判断,超过这个时间就会退出,中断配置的时候记得写一些优先级。debug的时 ...

谢谢版主 我改用LL库了 按照标准库的方式来写了。。现在上位机能够正确接收数据了 就是STM单片机还是收0

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版