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

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结构体的各个参数,报的是什么错误,是不是中断没有清除接收标志位导致的。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版