STM32
直播中

辛太励

7年用户 1140经验值
擅长:20153
私信 关注
[问答]

用STM32L051来设计一款变送器模块,MCU的SPI接口接收中断标志位就是不置位,为什么?

我们现在用STM32L051来设计一款变送器模块。4~20mA 接口。MCU通过ADC(SPI接口) 采集传感器输出 的信号。因为我们要求ADC的采样率达到50ksps,因此对Mcu的运行效率有非常高的要求,因此官网的HAL库就满足不了(已经试过了),必须用直接操作寄存器的方式来进行。但是SPI接口配置后,启动ADC采集,ADC也输出数据,但是MCU 的SPI接口接收中断标志位就是不置位(RXNE)。不知道什么原因啊。

[td]void MX_SPI2_Config(void)
{

  /* Enable the peripheral clock SPI2 */
  RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;

  /* DISABLE TXE IT */
  SPI2->CR2  = ~(SPI_CR2_TXEIE | SPI_CR2_ERRIE | SPI_CR2_FRF | SPI_CR2_SSOE | SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN);

  /* MASTER MODE, SCK IDLE HIGH */  
  SPI2->CR1 = SPI_CR1_MSTR | SPI_CR1_CPOL;

  /* NSS SOFT  */   
  SPI2->CR1 |= SPI_CR1_SSM | SPI_CR1_SSI;

    /* RXNE IT */
  SPI2->CR2 |= SPI_CR2_RXNEIE;

  /* 16 bit frame mode */
  SPI2->CR1 |= SPI_CR1_DFF;

  /* Enable SPI2 */   
  SPI2->CR1 |= SPI_CR1_SPE;

  /* Configure IT */
  /* Set priority for SPI2_IRQn */
  NVIC_SetPriority(SPI2_IRQn, 5);

  /* Enable SPI2_IRQn */  
  NVIC_EnableIRQ(SPI2_IRQn);  

}


回帖(1)

fansz

2024-5-16 17:53:10
在设计STM32L051变送器模块时,如果SPI接口接收中断标志位(RXNE)不置位,可能有以下几个原因:

1. SPI配置问题:请检查SPI的配置是否正确,包括时钟极性(CPOL)、时钟相位(CPHA)、数据位(DFF)、主/从模式(MSTR)等。确保SPI配置与ADC的SPI接口兼容。

2. 中断使能:确保在SPI配置中启用了接收中断。在HAL库中,可以使用以下代码启用SPI接收中断:

```c
HAL_SPI_Start_Receive(&hspi2, (uint8_t*)rxBuffer, size, HAL_MAX_DELAY);
```

3. 中断优先级配置:检查SPI中断的优先级是否正确配置。在NVIC中设置SPI中断的优先级,确保在中断服务例程(ISR)中正确处理SPI中断。

4. ADC时钟配置:确保ADC的时钟配置正确,以满足50ksps的采样率要求。在STM32L051中,可以使用PLL或HSI作为ADC的时钟源。

5. ADC配置:检查ADC的配置,包括采样时间、分辨率等。确保ADC配置与SPI接口兼容。

6. SPI中断服务例程(ISR):确保在ISR中正确处理SPI中断。在HAL库中,可以使用以下代码处理SPI接收中断:

```c
void SPI2_IRQHandler(void)
{
  HAL_SPI_IRQHandler(&hspi2);
}
```

7. 硬件问题:如果以上步骤都无法解决问题,可能存在硬件问题,如SPI接口的引脚连接、电源供应等。请检查硬件连接是否正确。

8. 软件问题:如果硬件连接正确,可能是软件问题。尝试使用不同的SPI库或示例代码,以排除软件问题。

综上所述,要解决SPI接口接收中断标志位不置位的问题,需要从SPI配置、中断使能、中断优先级配置、ADC时钟配置、ADC配置、SPI中断服务例程(ISR)等方面进行排查。同时,检查硬件连接和软件实现,确保SPI接口与ADC的SPI接口兼容。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分